转载请注明出处
http://blog.youkuaiyun.com/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的生命周期都会正常走。
SingleTop 栈顶复用模式
缩略介绍
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。
详细介绍
当该Activity位于栈顶时,生命周期如下:
当该Activity不位于栈顶甚至还没有实例时,生命周期与standard模式相同
SingleTask 栈内复用模式
缩略介绍
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
详细介绍
此模式受taskAffinity属性影响,taskAffinity属性的使用方法如下:
SingleInstance 全局唯一模式
缩略介绍
系统中只允许一个该Activity的实例存在,并且该Activity所在的栈中只有它自己。
详细介绍
在一个新栈中创建该Activity的实例,并让多个应用共享该实例;如果该模式的Activity已经存在于某个栈中,任何应用启动该Activity时就会重用该栈中的实例,此时生命周期如下:
Task内情况
多个Task在手机中的表现
SingleTask和SingleInstance都可能出现如下情况
Demo Github地址
可以使用我写的Demo配合Log来对Activity的启动模式进行了解
在Log中筛选 ———-> ,如下图:
为了方便区分,ActionBar上显示的依次是当前Activity的名称、所属Task的ID、该实例的HashCode。
本文参考
android launchmode(四种启动模式)应用场景及实例