activity有四种启动模式,分别为:
可以和activity的flags(通过Intent对象调用FLAG_ACTIVITY_* ,*代表常量)结合使用。
默认。系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。
如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建 Activity 的新实例。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例(但前提是位于返回栈顶部的 Activity 并不是 Activity 的现有实例)。
一个activity的“ standard ”或“ singleTop “启动模式可以多次实例化。 实例可以属于任何任务(task)并且可以位于activity栈的任何地方。
通常情况下,他们调用 startActivity() 启动(除非Intent对象包含一个 FLAG_ACTIVITY_NEW_TASK 指令,在这种情况下,activity将选择一个新的任务(task))。
“ standard ”和“ singleTop ”模式各不同于对方,只在一个方面:
每次有新的Intent,对于”standard ”的activity ,会创建一个类的新实例对此Intent作出回应。 每个实例处理一个单一的Intent对象。
同样,一个“ singleTop ”的activity的新实例也创建来处理一个新的Intent对象。 然而,如果目标任务已经有一个现有的activity实例在其栈的顶部,该实例将接收这个新的Intent(通过调用onNewIntent()),而不是创建一个新的activity实例。
在其它情况下,例如,如果现有的” singleTop ”启动模式的activity实例是在目标的任务,而不是在其栈顶部,或者如果它是在一个堆的顶部,而不是在目标任务中,那么一个新activity实例将被创建并push到栈顶。
同样地,如果在当前任务中,你向上导航到一个activity,这个行为是通过父activity的启动模式决定的。
如果父activity启动模式为singleTop
(或者向上的Intent包含FLAG_ACTIVITY_CLEAR_TOP),这个父activity会被带到栈顶,并且它的状态也被保存。这个导航intent是通过父activity的onNewIntent()方法接收的。
如果父activity的启动模式为standard
(或者向上的Intent不包含FLAG_ACTIVITY_CLEAR_TOP),当前activity和父activity都会被pop出栈,并且一个新的父activity实例被创建接收这个导航Intent。
manifest清单:
没有指定launchMode默认为standard模式,启动app:
点击启动B按钮:
我们发现,A,B都在任务4中,此时,再启动B,如下:
我们发现,B出现了两个实例,此时,按返回键如下:
我们发现,会回退到了之前第一次启动的实例B。
此时,再按返回键如下:
我们发现,会回退到了之前首次启动的实例A。
改变A的启动模式为singleTop,重启app:
启动B
再启动B
按返回键
再按返回键回到A
到此为止和前面的步骤一样,而且结果也一样,下面重点来了,在A界面启动A,如下:
我们可以看到,A的实例并没有改变,因为A的启动模式为singleTop,A当前在任务栈顶,当启动A时,是不会创建新实例,而是通过调用其onNewIntent方法启动当前已存在的实例。
此时,按返回键将退出app。
系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的 onNewIntent() 方法向其传送 Intent,而不是创建新实例。一次只能存在 Activity 的一个实例。
注:尽管 Activity 在新任务中启动,但是用户按“返回”按钮仍会返回到前一个 Activity。
与 “singleTask” 相同,只是系统不会将任何其他 Activity 启动到已经包含实例了的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。
相比之下,“ singleTask ”和“ singleInstance ”启动模式的activity 只能启动在一个任务中。 他们总是在activity栈的顶部。 此外,该设备仅维持一次并且仅一个activity的实例–仅在一样的任务中。
“ singleTask ”和“ singleInstance ”模式也互不相同只在一个方面:
singleTask 模式的activity允许其他activity是它的任务的一部分。 它总是在其任务的顶部,但是其他activities(一定是” standard ”和“ singleTop ” 模式的activities)可以运行在这一任务中。
一个“ singleInstance ” 的activity,另一方面,不允许其他activity是它任务的一部分。* 仅有一个activity实例在该任务*。 如果它启动另一个activity,那个activity是被分配给一个不同的任务–就像使用FLAG_ACTIVITY_NEW_TASK一样。
manifest清单
将B的启动模式设为singleTask,启动app:
启动B
再启动B,结果还是如上图所示,此时按返回键将回到A。
再从A启动B:
此时,启动C
此时,再启动B:
可以看到,B的实例和之前的一样,说明,singleTask模式下的B是单例的。
将以上B的启动模式改为singleInstance,其它不变,启动app,
启动B:
从以上,可以看到,A和B是在不同的任务中的,此时再启动B,结果还是如上图,
说明,singleInstance模式下的B和其他activity是在不同的任务中,并且是单例的。
此时,启动A(注意不是重启,是在上次B界面中启动A),再启动B:
可以看到,B又启动了一个任务,并在其任务栈顶。
在此中断。。。重启app:
A:
此时,启动B:
此时,启动C:
可以看到A和C在同一任务中,而B在任务20中,因此,此时按返回键返回的是A,而不是B。
这也说明了下面的一个问题:
singleTask和singleInstance启动模式的activity导致的交互模型,在开发中是很难掌控的。
如下表所示, standard是默认模式并且适用于大多数类型的activity。
SingleTop也是一种常见的并且有用的启动模式对于许多类型的activities。
其它模式- singleTask和singleInstance - 不适合大多数应用 ,因为它们导致的交互模型,很可能是用户不熟悉的并且和其他大多数的应用有很大不同。
不管你选择的哪种启动方式,确保启动期间测试这个activity的可用性并且导航回到它当从其他activities和任务中使用后退按钮。
Demo下载:
http://download.csdn.net/detail/u011726984/9218775
PS:http://blog.csdn.net/liuhe688/article/details/6754323/ 大家可以配合此文互相理解(●’◡’●)
如有不足或遗漏请评论指出,谢谢!
官方文档:
http://developer.android.com/intl/zh-cn/guide/topics/manifest/activity-element.html#lmode