Activity的启动模式详解

来源:互联网 发布:java messagequeue 编辑:程序博客网 时间:2024/06/07 14:50

转载请注明出处
http://blog.csdn.net/hansion3333/article/details/70799462
本文出自 Hansion的博客

建议先从文末下载Demo一边运行一边查看本文,理解的更加深刻。

Activity的四种启动模式

standard、singleTop、singleTask、singleInstance

启动模式的配置

在清单文件中Activity节点下通过launchMode属性来配置,参数就是上文中的四种模式。例如:

<activity android:name=".StandardActivity" android:launchMode="standard" >

下文中“Task任务栈”简称为“栈”

Standard 默认模式

  • 缩略介绍

    默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。

  • 详细介绍

    该模式是默认的启动模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity。

    每次启动该模式的Activity时,都会创建一个新的实例,无论这个实例是否已经存在。

    谁启动了该Activity,该Activity就属于谁所属的任务栈中。

    由于是创建新的实例,所以Activity的生命周期都会正常走。

Standard模式生命周期

SingleTop 栈顶复用模式

  • 缩略介绍

    如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。

  • 详细介绍

    当该Activity位于栈顶时,生命周期如下:
    SingleTop模式生命周期

当该Activity不位于栈顶甚至还没有实例时,生命周期与standard模式相同

SingleTask 栈内复用模式

  • 缩略介绍

    如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

  • 详细介绍

    此模式受taskAffinity属性影响,taskAffinity属性的使用方法如下:

SingleInstance 全局唯一模式

  • 缩略介绍

    系统中只允许一个该Activity的实例存在,并且该Activity所在的栈中只有它自己。

  • 详细介绍

    在一个新栈中创建该Activity的实例,并让多个应用共享该实例;如果该模式的Activity已经存在于某个栈中,任何应用启动该Activity时就会重用该栈中的实例,此时生命周期如下:
    SingleInstance生命周期

Task内情况

SingleInstanceTask内情况

多个Task在手机中的表现

SingleTask和SingleInstance都可能出现如下情况

多个Task在手机中的表现


Demo Github地址

可以使用我写的Demo配合Log来对Activity的启动模式进行了解
在Log中筛选 ———-> ,如下图:

Log区分

为了方便区分,ActionBar上显示的依次是当前Activity的名称、所属Task的ID、该实例的HashCode。

Demo样式


本文参考

彻底弄懂Activity四大启动模式

android launchmode(四种启动模式)应用场景及实例

taskAffinity属性


0 0