Activity LunchMode学习笔记

《开发艺术探索》

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模式

你可能感兴趣的:(Activity LunchMode学习笔记)