美文网首页
Activity 生命周期及任务栈

Activity 生命周期及任务栈

作者: 武曌思 | 来源:发表于2018-06-17 13:09 被阅读0次

    一、生命周期

    总结:

    除了 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 的效果。

    相关文章

      网友评论

          本文标题:Activity 生命周期及任务栈

          本文链接:https://www.haomeiwen.com/subject/ynrbeftx.html