Android Activity的生命周期和启动模式

生命周期

Activity生命周期的方法

onCreate : Activity正在被创建。在这个方法中我们可以做一些初始化工作,比如调用SetContentView去加载界面布局资源、初始化Activity所需数据等。
onRestart : Activity正在重新启动。一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart就会被调用
onStart : Activity正在启动,这时Activity已经可见了,但是还没出现在前台,还无法和用户交互。
onResume : Activity可见,并且出现在前台并开始活动。
onPause : Activity正在暂停,正常情况下,紧接着onStop就会被调用。此时可以做一些存储数据、停止动画等工作,但要注意不能太耗时,因为会影响新的Activity显示,onPause必须先执行完,新的Activity的onResume才会执行。
onStop : Activity即将停止。可以做一些稍微重量级的回收工作,同样不能太耗时。
onDestroy :Activity即将销毁。可以做一些回收工作和最终的资源释放

Activity生命周期过程的几种情况

下面是Activity生命周期过程中的几种情况:

1.针对一个特定的Activity,第一次启动: onCreate()—>onStart()—>onResume(),Activity进入运行状态。
2.当用户打开新的Activity或者切换到桌面时:onPause()—>onStop(),进入停滞状态。
3.当用户再次回到原Activity时: onRestart()—>onStart()—>onResume(),再次回到运行状态。
4.当用户按back键回退时:onPause()—>onStop()->onDestroy()
5.当Activity被系统回收后再次打开(系统内存不足, 系统会回收这个后台状态的Activity,此时这个Activity引用仍然处在任务栈中,只是这个时候引用指向的对象已经为null)时,则会走onCreate()–>onStart()—>onResume(),将重新走一次Activity的初始化生命周期。
6.锁屏:onPause()->onStop()
7.解锁:onStart()->onResume()

Activity的缓存

可以用Activity中的onSaveInstanceState()回调方法保存临时数据和状态到Bundle对象中,这个方法一定会在活动被回收之前调用。保存的Bundle对象会转递到Activity的onRestoreInstanceState()方法与onCreate()方法中。
onSaveInstanceState方法会在什么时候被执行,有这么几种情况:
1、当用户按下HOME键时。
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从Activity A中启动一个新的Activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。(如果不指定configchange属性) 在屏幕切换之前,系统会销毁Activity A,在屏幕切换之后系统又会自动地创建Activity A,所以onSaveInstanceState一定会被执行

Activity生命周期的切换过程

Activity生命周期的切换过程,如图:

687474703a2f2f696d672e626c6f672e6373646e2e6e65742f3230313330383238313431393032383132.png

启动模式

系统提供了两种方式来设置一个Activity的启动模式:1.AndroidMainifest文件中的属性android:launchMode来设置;2:是通过Intent的flag来设置

AndroidMainifest启动模式

standard : 默认的启动模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动三回调(onCreate()->onStart()->onResume())都会执行。
singleTop : 栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以它的启动三回调就不会执行,同时Activity的onNewIntent()方法会被回调.如果Activity已经存在但是不在栈顶,那么作用与standard模式一样.
singleTask: 栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,onNewIntent(),并且singleTask会清理在当前Activity上面的所有Activity.(clear top)
singleInstance : 加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了

Intent Flag启动模式

下面介绍一些常用的Flag
FLAG_ACTIVITY_NEW_TASK : 开启一个新任务,flags默认该值。该值等同于launchMode="standard"
FLAG_ACTIVITY_SINGLE_TOP : 当栈顶为待跳转的activity实例时,则重用栈顶的实例。该值等同于launchMode="singleTop"
FLAG_ACTIVITY_CLEAR_TOP : 当栈中存在待跳转的Activity实例时,则重新创建一个新实例,并将原实例上方的所有实例加以清除。该值与launchMode="singleTask"类似,launchMode="singleTask"采用onNewIntent启用原任务,而FLAG_ACTIVITY_CLEAR_TOP采用先onDestroy再onCreate创建新任务。
FLAG_ACTIVITY_NO_HISTORY:使用这种模式启动的Activity,不会保留在Activity栈中,例如A-B,B中以这种模式启动C,C再启动D,则当前Activity栈为ABD。

标签: android

添加新评论