Activity启动模式之singleTask属性taskAffinity浅谈

 

开篇知识点:

  • 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默认)流程图:

Activity启动模式之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

Activity启动模式之singleTask属性taskAffinity浅谈

2.A启动B,可以看到,#142中有A、B,#141中有Main

Activity启动模式之singleTask属性taskAffinity浅谈

3.B启动Main,#142中有Main、A、B,#141中有Main

Activity启动模式之singleTask属性taskAffinity浅谈

4.Main启动A,#142中只有A了,#141中还有Main

Activity启动模式之singleTask属性taskAffinity浅谈

5.按返回键,#142栈已经没了,还剩下#141中的Main,如果再按返回键,就退出应用了。Activity启动模式之singleTask属性taskAffinity浅谈

这几点为什么这样走,在开篇知识点都有说过。

 

参考:任玉刚《Android开发艺术探索》