# Android
中Activity
四种启动模式和taskAffinity
属性详解 #(2原创分享)
----------
影子侠开发者社区Rong
##
二 Activity
四种启动模式详解 ##
activity
有四种启动模式,分别为standard
,singleTop
,singleTask
,singleInstance
。如果要使用这四种启动模式,必须在manifest
文件中<activity>
标签中的launchMode
属性中配置,如:
<activity android:name=".app.InterstitialMessageActivity"
android:label="@string/interstitial_label"
android:theme="@style/Theme.Dialog"
android:launchMode="singleTask"
</activity>
同样,在Intent
类中定义了很多与Activity
启动或调度有关的标志,<activity>
标签中有一些属性,这些标志,属性和四种启动模式联合使用,会在很大程度上改变activity
的行为,进而会改变task
和back stask
的状态。关于Intent
中的标志和<activity>
标签中有一些属性会在本文后面介绍,在这一节中,先介绍activity
的四种启动模式。
**standard**
标准启动模式,也是activity
的默认启动模式。在这种模式下启动的activity
可以被多次实例化,即在同一个任务中可以存在多个activity
的实例,每个实例都会处理一个Intent
对象。如果Activity A
的启动模式为standard
,并且A
已经启动,在A
中再次启动Activity A
,即调用startActivity
(new Intent
(this
,A.class
)),会在A
的上面再次启动一个A
的实例,即当前的桟中的状态为A-->A
。
**singleTop**
如果一个以singleTop
模式启动的activity
的实例已经存在于任务桟的桟顶,那么再启动这个Activity
时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()
方法将Intent
对象传递到这个实例中。举例来说,如果A
的启动模式为singleTop
,并且A
的一个实例已经存在于栈顶中,那么再调用startActivity
(new Intent
(this
,A.class
))启动A
时,不会再次创建A
的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()
方法。这是任务桟中还是这有一个A
的实例。
如果以singleTop
模式启动的activity
的一个实例已经存在与任务桟中,但是不在桟顶,那么它的行为和standard
模式相同,也会创建多个实例。
**singleTask**
谷歌的官方文档上称,如果一个activity
的启动模式为singleTask
,那么系统总会在一个新任务的最底部(root
)启动这个activity
,并且被这个activity
启动的其他activity
会和该activity
同时存在于这个新任务中。如果系统中已经存在这样的一个activity
则会重用这个实例,并且调用他的onNewIntent()
方法。即,这样的一个activity
在系统中只会存在一个实例。
其实官方文档中的这种说法并不准确,启动模式为singleTask
的activity
并不会总是开启一个新的任务。详情请参考
解开Android
应用程序组件Activity
的"singleTask"
之谜,在本文后面也会通过示例来进行验证。
**singleInstance**
总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他activity
会自动运行于另一个任务中。当再次启动该activity
的实例时,会重用已存在的任务和实例。并且会调用这个实例的onNewIntent()
方法,将Intent
实例传递到该实例中。和singleTask
相同,同一时刻在系统中只会存在一个这样的Activity
实例。
此文章系原创,如需转载,请注明出处影子侠开发者社区www.yingzixia.com(技术Q群:188168040)
|
# Android中Activity四种启动模式和taskAffinity属性详解 #(2原创分享)
最新推荐文章于 2024-09-18 11:19:13 发布