一、生命周期
总结:
除了 onRestart,其余都是成对出现。
onResume 和 onPause 是前台生存期,可与用户进行交互阶段;
onStart 和 onStop 是可见生存期,用户能够看到 Activity;
onCreate 和 onDestory 是完整生存期,经历创建和销毁。
二、启动模式
特别感谢 @尹star 老师、@泡在网上的日子 老师 和 @张纪刚 老师 的博客
想要以不同的启动模式启动 Activity,一般有两种方式:一修改 Manifest 中 activity 标签的 launchMode,二通过 Intent.setFlags() 设置启动模式。
1、standard
默认模式,可以不用写配置。在这个模式下,永远新建一个实例,可以有多个相同的实例,也允许多个相同Activity叠加。
生命周期讨论:无特殊生命周期
2、singleTop
栈顶复用模式,如果要开启的 activity 已经在任务栈的顶部,就不会创建新的实例,而是调用 onNewIntent() 方法,避免栈顶的 activity 被重复的创建。如情况2,其余情况同 standard。
生命周期讨论
情况1:
B 是完全遮住 A,使 A 不可见,A 会经历,onPasue->onStop->打开 B ->关闭 B ->onRestart->onStart->onResume;
B 是不能完全遮住 A,使 A 部分可见,A 会经历,onPasue->打开 B ->关闭 B ->onResume;
情况2:A 会经历:onPause->打开 A ->onNewInstent->onResume;
情况3:旧的 A 无生命周期的变化。
3、singleTask
栈内复用模式, activity 只会在任务栈里面存在一个实例。如果要激活的 activity,在任务栈里面已经存在,就不会创建新的 activity,而是复用这个已经存在的 activity,调用 onNewIntent() 方法,并且清空这个 activity 任务栈位于要激活 activity 上面所有的 activity。
生命周期讨论
情况1:同 singleTop 的情况1;
情况2:同 singleTop 的情况2;
情况3:
B 是完全遮住 A,使 A 不可见,A 会经历,onPasue->onStop->打开 B ->打开 A ->onNewIntent->onStart->onResume;
B 是不能完全遮住 A,使 A 部分可见,A 会经历,onPasue->打开 B ->打开 A ->onNewIntent->onResume;
B 会经历:onPause->onStop->onDestroy
4、singleInstance
单一实例模式,整个手机操作系统里面只有一个实例存在。有全局唯一性,即整个系统中只会存在一个这样的实例;有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中(官方文档上的描述为,singleInstance模式的Activity不允许其他Activity和它共存在一个任务中)
特别注意:若 A 是singleInstance,则不会存在情况3,因为 A 不会与任何 Activity 公用回退栈。
生命周期讨论
情况2生命周期分析:会调用 Activity 的 newIntent 方法
三、任务栈
非常感谢 @feiyangxiaomi 老师 以及 @郭霖老师 的博客。
一般情况,一个应用只有一个任务栈。比如启动模式(singleinstance)就会影响任务栈。下面继续分析几种影响任务栈的配置。
1、taskAffinity
该属性是字符串类型,指定该 Activity 所属任务栈。
2、finishOnTaskLaunch
该属性是布尔类型,默认 false;如果为 true 表示任务栈被放到后台又被换到前台时,该 Activity 会被回收。
3、clearTaskOnLaunch 和 alwaysRetainTaskState
如果一个任务栈在很长的一段时间都被用户保持在后台的,那么系统就会将这个任务栈中除了根activity以外的其它所有activity全部清除掉。从这之后,当用户再将任务栈切换到前台,则只能显示根activity了。
alwaysRetainTaskState:布尔类型,true 表示任务无论在后台待多久,系统也不会回收任务栈中的 Activity。
clearTaskOnLaunch:布尔类型,true 表示当任务栈被放到后台又被换到前台,会清空所有 Activity,只保留根 Activity,走 onRestart->onStart->onResume。
以上两个属性只适用于根 Activity。
四、Flag
感谢 @wangkuiwu 老师 精彩博客及实验。
Activity 启动时还可以为 Intent 设置标识,下面介绍几种常见的标识。
1、FLAG_ACTIVITY_NEW_TASK
如果要启动的 Activity 没有设置不同的 taskAffinity,那这个标识没有任何作用,不会将 Activity 放入新 task。
2、FLAG_ACTIVITY_SINGLE_TOP
该标识和 singleTop 启动模式效果一致。
3、FLAG_ACTIVITY_CLEAR_TOP
与 FLAG_ACTIVITY_NEW_TASK 配合使用,能够达到 singleTask 的效果。