Android的task可以理解为管理activity的堆栈。
Adnroid启动模式可以有如下两种方式设定。
通过在AndroidMenifest.xml中设置launchMode.
代码中调用startActivity时设置intent.setFlags
首先看launchMode
launchMode=”standard”
standard为默认模式。
不论是否在task中已经存在该activity,都会生成新的activity(调用onCreate),然后保存在task堆栈中。
launchMode=”singleTop”
根据task顶部的activity,动作会不同。
task顶部存在相同的Activity,不会生成新的Activity,而是直接调用显示已经存在的Activity(onNewIntent会被调用)。task 顶部存在不同的Activity时,动作与standard模式相同。
launchMode=”singleTask”
task顶部存在相同的Activity,该Activity之前的Activity会全部被删除(finish)。并且该Activity对象的onNewIntent被调用。
task 中不存在所要调用的Activity时,动作与standard模式相同。
launchMode=”singleInstance”
设定为singleInstance时,总是生成只包含该Activity的新task。
被其他Acticity调用时,如果该Activity已经存在,那么包含该Activity的task会显示在前台Foreground。
确认Task・Activity的状态
$ adb shell dumpsys activity activities
上面的命令会出现很多信息,可以用如下命令进行筛选。
$ adb shell dumpsys activity activities | grep "* TaskRecord\|* Hist"
以下是输出结果。
* TaskRecord{425b6348 #121 A jp.qoncept.activitystack2}
* Hist #6: ActivityRecord{422a2d98 jp.qoncept.activitystack2/.Activity3}
* Hist #5: ActivityRecord{4197a3e8 jp.qoncept.activitystack2/.Activity2}
* Hist #4: ActivityRecord{4177c190 jp.qoncept.activitystack2/.Activity1}
* TaskRecord{4178ac50 #120 A jp.qoncept.activitystack1}
* Hist #3: ActivityRecord{41c6be08 jp.qoncept.activitystack1/.Activity3}
* Hist #2: ActivityRecord{41c58090 jp.qoncept.activitystack1/.Activity2}
* TaskRecord{424a6d18 #119 A jp.qoncept.activitystack1}
* Hist #1: ActivityRecord{417b5cf0 jp.qoncept.activitystack1/.Activity1}
* TaskRecord{422c2960 #4 A com.sonyericsson.home}
* Hist #0: ActivityRecord{422c15e0 com.sonyericsson.home/.HomeActivity}
下面是设置Intent flags
举例说,从A→B→C→D多数的Activity跳转到最初的A。
DActivity.java
Intent intent = new Intent(DActivity.this, AActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
FLAG_ACTIVITY_CLEAR_TOP,要跳转的Activity已经存在,那么将会把它堆栈之上的(B,C,D
)删除。这样实现A→B→C→D→A之后按下back键时不能返回到D。FLAG_ACTIVITY_SINGLE_TOP,如果要跳转到已经存在的Activity时不会生成新的Activity,而是掉出已经存在的Activity对象
。FLAG_ACTIVITY_MULTIPLE_TASK
不要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的 行为。当设置时,新的Task总是会启动来处理Intent,而不管这是是否已经有一个Task可以处理相同的事情。
由于默认的系统不包含图形Task管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方式可以返回到已经启动的Task。
如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。FLAG_ACTIVITY_NEW_TASK
如果设置,这个Activity会成为历史stack中一个新Task的开始。一个Task(从启动它的Activity到下一个Task中的 Activity)定义了用户可以迁移的Activity原子组。Task可以移动到前台和后台;在某个特定Task中的所有Activity总是保持相 同的次序。
这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列可以单独完成的事情,与启动它们的Activity完全无关。
使用这个标志,如果正在启动的Activity的Task已经在运行的话,那么,新的Activity将不会启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,可以禁用这一行为。
这个标志不能用于调用方对已经启动的Activity请求结果。
参考如下文章:
http://www.blogjava.net/zhaojianhua/archive/2011/06/23/352888.html
http://techblog.qoncept.jp/?p=102
http://d.hatena.ne.jp/nkawamura/20130829/1377744732
http://www.saturn.dti.ne.jp/npaka/android/LaunchMode/