Activity生命周期及启动模式

生命周期图,切勿眼高手低


Activity生命周期及启动模式_第1张图片
2H5V579BTWU(C$P(44YEG{I.png

任务栈:程序打开时就开启了一个任务栈,用于记录用户开启的activity,先进后出。只有位于任务栈栈顶的activity才可以与用户交互。
启动模式:
1、standard:默认值,标准模式;当startActivity的时候就会创建实例,无论任务栈中是否已经存在了该实例。
2、singleTop:栈顶复用模式,启动activity时,如果该activity位于栈顶,就直接复用该实例,不会再创建实例(不会调用该activity的onCreate、onStart,而是调用onNewIntent、onResume);如果该activity不位于栈顶,还是会创建该activity的实例。
3、singleTask:栈内复用模式,启动activity时,首先会判断是不是存在需要的栈,如果不存在需要的任务栈,就会创建一个任务栈,并创建该activity的实例,压入该栈中;如果存在需要的栈,再判断该栈中是否存在该activity的实例,如果存在,就会将该activity上面的activity出栈,调用该activity的onNewIntent、onResume。如果该栈内不存在该activity的实例,就会创建该activity的实例,并压入栈中。判断是否存在需要的任务栈,就需要用到TaskAffinity,TaskAffinity就像是任务栈的身份证一样。
4、singleInstance:单实例模式,加强的singleTask模式。启动activity时,会为该activity创建一个任务栈,之后再有别的页面启动该activity时,也不会创建该activity的实例。

结合启动模式,查看一下activity的生命周期:

1、ActivityA和ActivityB都是standard模式,在ActivityA上启动一个ActivityB:
![DP%7D5]]68PUIK72I]OJ5.png](http://upload-images.jianshu.io/upload_images/2578759-abeaf109394ed9b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
按下home键,将应用置于后台,然后返回该应用:
![%329])@~RWL(YTD%9)3EP7H.png](http://upload-images.jianshu.io/upload_images/2578759-6b2e385a4528f36d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2、ActivityA为singleTop模式,在启动ActivityA后,再次启动ActivityA:

Activity生命周期及启动模式_第2张图片
2VV3MYHDLMEZ@)8MFTJHWUR.png

按下返回键会直接退出ActivityA。
3、ActivityA为standard模式,ActivityB为singleTask模式,ActivityC不是singgleInstance模式;在ActivityA中启动ActivityB,在ActivityB中启动ActivityC,在ActivityC中启动ActivityB:

![ZZPBDVC]$]WDN1Q4I)5C2W8.png](http://upload-images.jianshu.io/upload_images/2578759-fc879a7a07d04a27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![]~CI8S{LN%K{3(W%W4]M%34.png](http://upload-images.jianshu.io/upload_images/2578759-93373eb305a382e4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
此时按返回键:

Activity生命周期及启动模式_第3张图片
V51O)BP41$92R)X0X8{MDH0.png

4、横竖屏切换时候Activity的生命周期。**
(1)、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
(2)、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
(3)、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

顺便记一下Activity的Flags:
比较常用的标记位有:
1、用于设定Activity的启动模式:
FLAG_ACTIVITY_NEW_TASK:指定“singleTask”启动模式,效果和在Manifest指定一样
FLAG_ACTIVITY_SINGLE_TOP:指定“singleTop”启动模式。
2、用于影响Activity的运行状态:
FLAG_ACTIVITY_CLEAR_TOP:具有此标记的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。如果该Activity的启动模式是singleTask,那么它上面的Activity会出栈,并执行该Activity的onNewIntent、onResume。如果该Activity是standard模式,那么该Activity和它上面的Activity都会出栈,系统会创建新的Activity实例并置于栈顶。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中;等同于在xml置顶属性:android:excludeFromRecents="true"。

你可能感兴趣的:(Activity生命周期及启动模式)