1. Task Back栈
任何activity都是必须放在Task栈里才能显示。
所以非activity的Context调用startActivity不被允许,因为找不到Task栈存放新的activity;除非加上Intent.FLAG_ACTIVITY_NEW_TASK标志,效果等同于singTask的launchMode,这样就会查找或创建新的Task栈用来存放activity。
activity存入哪个Task栈里呢?
这是由TaskAffinity属性决定的,activity默认的TaskAffinity属性值就是包名。
- 第一次打开包名为com.test1的1.apk,默认启动activity1,这时会创建名为com.test1的Task栈,并且把activity1压入com.test1的Task栈内。
- activity1启动同apk里的activity12:
- activity12没有设置TaskAffinity属性和任何launchMode:activity12加入com.test1的Task栈;
- activity12设置TaskAffinity属性为com.test12但是没有设置launchMode(即launchMode为standard):效果等同于上面的这种情况。activity12加入com.test1的Task栈;
- activity12设置TaskAffinity属性com.test12和launchMode为singTask(或启动的Intent里携带FLAG_ACTIVITY_NEW_TASK): 先查找有没有存在com.test12的Task栈,如果找不到就新建一个com.test12的Task栈,把activity12压入栈内。如果找到同名Task栈,检查栈内是否存在activity12,如果存在就clearTop销毁它上面的所有activity,activity12回到栈顶。如果不存在则新建activity12压入栈内。
- activity1启动新的包名为com.test2的2.apk里的新的activity21:
- activity21没有设置TaskAffinity属性和任何launchMode:activity21加入com.test1的Task栈;
- activity21设置TaskAffinity属性为com.test21但是没有设置launchMode(即launchMode为standard):效果等同于上面的这种情况。activity21加入com.test1的Task栈;
- activity21没有设置TaskAffinity属性但是设置launchMode为singTask(或启动的Intent里携带FLAG_ACTIVITY_NEW_TASK)