开篇知识点:
- activity在启动时,launchMode默认是standard模式,taskAffinity(任务相关性)默认是包名。
- 当为Activity指定launchMode为singleTask且taskAffinity为"xxx.xxx.xxx"时,系统会检测是否有同样的"xxx.xxx.xxx"存在,不存在,将会为它创建一个新的任务栈,并把此activity压进栈。存在,把位于它之上的activity出栈,它置于栈顶。
- 特别注意:A在启动B时,默认情况下(不指定launchMode和taskAffinity,不设置Intent的Flag),新创建的B会被放入A所在的任务栈中。如果设置了Intent.FLAG_ACTIVITY_NEW_TASK,系统会去查找目标activity的taskAffinity是否存在,不存在,就创建,存在,就把该栈提到前台。
A启动B(B的launchMode是singleTask,taskAffinity默认)流程图:
举例说明以上即几点:
1.现在有MainActivity,launchMode和taskAffinity都是默认。
2.A、B两个activity启动模式都为singleTask,taskAffinity为“com.test.qq"。
<activity
android:name=".activities.test.AActivity"
android:launchMode="singleTask"
android:taskAffinity="com.test.qq" />
<activity
android:name=".activities.test.BActivity"
android:launchMode="singleTask"
android:taskAffinity="com.test.qq" />
<activity
android:name=".activities.MainActivity"
android:launchMode="standard"
/>
做如下操作:
Main启动A,A启动B,B启动Main,Main启动A,点返回键。此时,栈是什么情况?剩下哪个页面?
通过命令行查看日志分析(adb shell dumpsys activity activities):
1.Main启动A,可以看到,#142任务栈中有A,#141中有Main
2.A启动B,可以看到,#142中有A、B,#141中有Main
3.B启动Main,#142中有Main、A、B,#141中有Main
4.Main启动A,#142中只有A了,#141中还有Main
5.按返回键,#142栈已经没了,还剩下#141中的Main,如果再按返回键,就退出应用了。
这几点为什么这样走,在开篇知识点都有说过。
参考:任玉刚《Android开发艺术探索》