《开发艺术探索》
1.standed
标准模式。在这个模式下,谁启动了Activity,那么这个Activity就运行在启动它的那个Activity所在栈内。所以如果用ApplicationContext去启动一个standard模式的Activity时会报运行时错误。
因为standard模式的Activity会默认进入启动它的Activity所属的任务栈中,但是由于非Activity类型的Context(比如ApplicationContext)并没有所谓的任务栈。
解决的办法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候会为它创建一个新的任务栈,这个时候待启动Activity实际上是以SingleTask模式启动的
2.singleTop 栈顶复用
当新Activity已位于栈顶,则此Activity不会被创建,同事它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。这个时候,这个Activity的onCreate和onStart不会被调用,因为没有发生改变。
3.singleTask 栈内复用-默认具有clearTop效果
只要Activity在栈中存在,就不会创建新实例,并且onNewIntent会回调。
(1)不存在新活动想要的任务栈
创建任务栈,并把创建活动的实例放入栈中
(2)存在新活动想要的任务栈
如果栈内包含新活动的实例,则将其调到栈顶,并回调onNewIntent.同时,位于其上的活动都会被清空。 ABCD , 此时启动B 任务栈会变为AB,CD会出栈。
如果不存在,则创建新活动的实例并压入栈中。
4.SingleInstance 单实例模式 --加强版singleTask
除了具有SingleTask所有的特性外,具有此模式的Activity只能单独位于一个任务栈中。
5.如何为待启动Activity指定任务栈 --TaskAffinity 任务相关性
默认情况下,所有Activity所需任务栈的名字为应用的包名。
TaskAffinity属性主要和SingleTask或者allowTaskReparenting属性配对使用,在其他情况下没有意义。
6.如果有A和B两个应用,B有两个活动,一个是主活动C,一个是活动D,其中活动D的allowTaskReparenting为true。当应用A启动了应用B的活动D,此时再启动应用B时,应该位于哪个活动。
位于D活动。A启动了B的D,D此时位于应用A的包名任务栈,当启动B应用时,B应用创建了自己的任务栈,D发现自己需要的任务栈已经创建了,就会回到B应用对应的包名任务栈中。
用法:当需求是应用a启动了我们应用的活动D,此时如果启动我们应用时要求位于活动D,就可以将活动D的allowTaskReparenting设为true
7.如何指定活动的启动方式,两者的区别
(1)通过AndroidManifest.xml
Android:luanchMode:"singleTask"
(2)通过在Intent中设置标志位指定启动模式
Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
当两者共存时,以第二种为主;
限定范围不同:第一种无法直接为Activity设定FLAG_ACITIVTY_CLEAR_TOP标识
第二种无法为Activity指定singleInstance模式