Tasks and Back Stack
一个Task指用户在完成一特定任务时打交道的所有Activity集合,这些Activity放在属于该Task的Back Stack中。通常,Home screen是大多数任务的起点。
Activity的launch mode
Activity的launch mode决定该Activity与启动它的Task的关系,既可以在manifest中通过launchMode属性设定,也可以在Intent的flag中设定。后者优先级更高,所以使用Intent的flags会覆盖launchMode属性。
设定launchMode属性
- “standard” (the default mode)
每次启动该Activity都会生成一个新的实例。 - “singleTop”
当Task栈顶不是该Activity,会生成一个新的实例;否则,不会再生成新的实例,而是回调其onNewIntent()方法。 - “singleTask”
如果当前没有任何该Activity的实例,会在一个新的Task中实例化该Activity;否则,回调onNewIntent() 将intent传递给已有的实例。任何时刻,至多有一个实例存在。 - “singleInstance”
和singleTask一致,不过该Activity只能是他所在Task的唯一一个成员,该Activity启动的任何Activity都存在其它的task中。
使用Intent flags
- FLAG_ACTIVITY_NEW_TASK
同launchMode为singleTask。 - FLAG_ACTIVITY_SINGLE_TOP
同launchMode为singleTop。 - FLAG_ACTIVITY_CLEAR_TOP
判断要启动的Activity是否在当前task中,如果在,将在它之上的所有Activity抛出栈并销毁,然后通过onNewIntent() 将intent传递给它。这个标识经常和FLAG_ACTIVITY_NEW_TASK连结使用,来定位其他task中的实例,并把它放置在可以接受intent的位置。
Affinity
Affinity指定该Activity希望属于哪一个Task,通过以下格式设定为不同于它包名的独一无二的一个string。
android:taskAffinity="string"
默认情况下,一个Application里的所有Activity有相同的affinity属性,这样它们会运行在同一个task里。
该属性会在两种情况下生效:
- 启动该Activity的intent有FLAG_ACTIVITY_NEW_TASK 标识
该Activity启动时,查看现有的task中有没有具有相同affinity的,如果有就在这个task上启动activity,否则新起一个task。 - 该Activity的allowTaskReparenting属性设为true
例如,你的应用启动一个这样的Activity,现在它在你的task中,当另一个跟这个activity有相同affinity的task到前台运行时,该Activity会移动到这个亲近的task中。
本文详细介绍了Android中Activity的生命周期,包括Task与BackStack的概念、不同launch mode的特性、Intent flags的作用及Affinity属性的影响。理解这些内容有助于开发者更好地管理应用程序的状态。
1342

被折叠的 条评论
为什么被折叠?



