Android Activity的四种启动模式和TaskAffinity的理解以及给Activity指定启动模式

Activity的启动模式分为四种。(standard、singleTop、singTask、singleInstance)

standard(标准模式):

Activity的默认启动模式,每当启动一个新的Activity,它就会进入任务栈,并处于栈顶的位置

singleTop(栈顶复用模式):

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

singTask(栈内复用模式):

启动时会判断Activity是否在任务的栈内,如果在任务的栈内正好存在该Activity的实例,就重用该实例(会调用实例的onNewIntent()),并且把该Activity实例上面的Activity实例全部出栈,让该Activity实例位于栈顶;如果栈内不存在该Activity的实例,则在栈顶创建一个新的实例

singleInstance(单实例模式):

这是一种加强了的singleTask模式,除了拥有singTask的所以特性之外,该模式的Activity还会启动一个新的任务栈来管理Activity实例,并且该实例在整个系统中只有一个。无论从那个任务栈中    启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。主要作用是为了在不同程序中共享一个Activity实例

关于TaskAffinity:

TaskAffinity,可翻译为任务相关性,这个参数标识了一个Activity所需要的任务栈的名字,关于TaskAffinity,要清楚以下几点:

  • 默认情况下,所以Activity的任务栈都为应用的包名,我们可以为每个Activity单独指定TaskAffinity属性
  • TaskAffinity属性主要和singleTask启动模式或allowTaskReparenting属性配对使用
  • 任务栈分为前台任务栈和后台任务栈,后台任务栈的Activity处于暂定状态
  • 当TaskAffinity和singleTask配对使用时,它具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中
  • 当TaskAffinity与allowTaskReparenting属性配对使用时,比较复杂

例:当应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true的话,那么当应用B启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。可以这么理解:由于A启动了该Activity,故该Activity运行于A的任务栈中,但它的TaskAffinity属性不可能与A任务栈相同,因为包名不同,这个时候我们再启动B应用,B会创建自己的任务栈,然后这个时候发现该Activity原本需要的任务栈(B的任务栈)创建成功了,就会把该Activity转移到B的任务栈中来

————TaskAffinity部分摘于《Android开发艺术探索》

给Activity指定启动模式:


(一)可在AndroidManifest.xml中,通过<activity>标签的android:launchMode属性设置:

android:launchMode="standard"
android:launchMode="singleTop"
android:launchMode="singleTask"
android:launchMode="singleInstance"

(二)也可在Intent中设置标志位韦Activity指定启动模式:

Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//指定singleTask模式,与在AndroidManifest.xml中指定android:launchMode"singleTask"效果相同


Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
//指定singleTop模式,与在AndroidManifest.xml中指定android:launchMode"singleTop"效果相同


Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//具有这个标志的Activity启动时,在同一个任务栈中所以位于它上面的Activity都要出栈,一般会和singleTask模式一起出现


Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
//具有这个标志的Activity不会出现在历史的Activity列表中,它等同于在AndroidManifest.xml中指定android:excludeFromRecents="true"

猜你喜欢

转载自blog.csdn.net/mountain_hua/article/details/81481242