Android Activity生命周期及启动模式
Posted acesui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Activity生命周期及启动模式相关的知识,希望对你有一定的参考价值。
曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记。后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看。或许保存成博客的形式,会是更好的选择,勉励自己。
Activiy是android开发中最常用最常见的组件,是Android开发人员开始学习首先接触的组件,也是大部分人建立一个工程后,首先要处理的可能就是Activity。这么重要、常用、简单、易上手的组件,牢固掌握其基础知识,对于开发人员是非常重要的。本文会首先解释其基本概念,对于其使用方式不做过多赘述,重点放在Activity的生命周期和启动模式上,附带讲解一些Activity管理的经验。
1 Activity的概念
官方解释“An Activity
is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.”(https://developer.android.google.cn/reference/android/app/package-summary)中文含义是"Activity 是一个提供带屏交互应用程序的组件,例如拨打手机,拍照,发邮件,或看地图。"也就是说,Activity是屏幕交互View的容器,是用户通过屏幕操控程序的入口。
2 Activity的基本使用
一般Activity和一个Layout布局文件配合使用。创建一个继承android.app.Activity的java类和一个放在"/res/layout"文件夹下的xml布局文件。然后在Activity的onCreate方法中,使用setContentView方法,制定layout的resourceID。这里不做展开。
3 Activity的生命周期
3.1Activity的运行状态
作为与用户交互位目的的组件。在启动后会有四种状态。
1,Active或者Running,是指Activity处于前端,获取了前台焦点的状态,此时Activity位于活动栈的栈顶。
2,paused,是指Activity处于可见状态,但是丧失了前台焦点。例如:被透明的Activity遮挡,设备转入休眠等。Android的通知栏不会导致Activity 进入paused状态。
3,stopped,当Activity对用户不可见时进入stopped状态,但此时仍保持已有的状态和成员信息,等等系统判断恢复运行状态,或者销毁。此时,如果系统内存不足,Activity占用的资源有可能被释放。
4,destroyed,Activity被系统回收,内存释放。此时Activity会从活动栈中移除。
3.2 Activity的生命周期回调
Android对Activity定义了7个生命周期的回调,对应Activity的创建和四种运行状态的切换。分别是:
-
-
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onRestart()
-
官网给出的生命周期回调流程图为:
结合上一部分解释的Activity的四种运行状态,我绘制了一个简单的生命周期流程图。如下:
结合代码来看(相关代码会在本文最后作为附件给出)。Activity启动到绘制完毕,调用的生命周期为:
如果此时按了home键,Activity进入后台,调用的生命周期为:
再次唤醒Activity,调用的生命周期为:
结束当前Activity,调用的生命周期为:
在启动Activity后,如果切换了屏幕方向,会导致当前Activity销毁并重绘。如果想取消屏幕切换时Activity的销毁重绘,对于Android3.2之前(不含),可以在manifest文件中设置当前Activity的android:configChanges=”orientation|keyboardHidden”,对于Android3.2及之后的sdk,可以设置android:configChanges=”orientation|keyboardHidden|screenSize“。详见博客https://blog.csdn.net/u014070729/article/details/50867646。
4 Activity的启动模式
Activity的启动模式有四种:standard.singleTop. SingleTask. singleInstance。如果不在配置文件中做任何设置,将以standard模式启动。
1,standard模式
顾名思义,standard模式就是默认的标准启动模式。在这种模式下,每次启动当前Activity,就会在任务栈中创建一个当前Activity的实例。如果当前Activity多次连续启动,则按返回键时,也会依次唤起已经入栈的Activity实例,表现出退出多个当前Activity的现象。
2,singleTop模式
singleTop模式与standard模式的唯一区别是:如果要求调用Activity时,如果当前任务栈的栈顶已经时当前Activity的实例,则不会重复创建。因此,不会再调用onCreate(),onStart(),onResume()的生命周期,但是可以调用onNewIntent()回调,我们可以再这里做一些数据处理。应用场景:注册,登录,避免多次点击产生bug。
3,singleTask模式
使用singleTask模式,如果调用Activity时,当前任务栈的栈顶已经时该Activity的实例,则singleTask模式与singleTop模式一致。如果当前任务栈中没有Activity的实例,则会产生一个新的实例并置入栈顶。如果任务栈的下层有Activity的实例,则会把实例之上的所有其他Activity的实例全部出栈,使该Activity实例置于栈顶;表现上则是,该Activity第一次被调用后,调用的其他Activity,不能通过返回键返回到了。应用场景:适合作为程序入口点,例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面
4,singleInstance模式
使用singleInstance模式,则会为当前Activity创建一个新的任务栈,并将产生的实例置入,其他Activity的实例不会置入。当在该实例下按返回键时,任务栈会销毁。由于涉及到任务栈的切换,所有这种模式下的切换市场和资源销毁比其他模式要大。这种模式一般应用与Activity与多个应用共享该Activity的情形,比如Launcher,从其他任何应用返回到Launcher,都可以保持是同一个单例。
5 Activity互相调用时的生命周期
当Activity1中调用Activity2时,Activity1的实例首先会调用onPause回调。然后Activity2创建新的实例(或者依据启动模式不同,从栈内调起),依次调用onCreate(),onStart(),onResume()等回调,然后Activity1调用onStop()回调。如果Activity2是从栈内调起,则其依次调用onRestart(),onStart(),onResume()回调。如果Activity1需要出栈,则其在调用onStop()回调后会调用onDestroy()回调。
基本流程如图:
结合代码来看,生命周期如下:
6 总结
本节总结了Activity的4中运行状态,基本生命周期,和启动模式。文中demo代码见附件。
https://files.cnblogs.com/files/acesui/ActivityDemo.rar
以上是关于Android Activity生命周期及启动模式的主要内容,如果未能解决你的问题,请参考以下文章
Android进阶知识——Activity的生命周期和启动模式
Android进阶知识——Activity的生命周期和启动模式