Android LaunchMode启动模式

指定Activity的LaunchMode:


standard

默认模式,在Android 5.0 Lollipop以前,不论在当前App或是第三方App中呼出,指定新创建的Activity将会添加到调用者App的Task中,并叠加在其Stack堆栈顶,通过任务管理器中可见该Activity界面归属于调用者的App进程。

在Lollipop及之后的版本,如果调用者是第三方App,则该Activity会被添加到一个新建Task的根部,通过任务管理器会看到该Activity依然归属于第三方App(与调用者App分离)

singleTop

大部分情况下表现与standard相同。

例外情况是,当Task顶已存在相同的Activity实例时,将不再创建新Activity,而是通过onNewIntent()方法重用栈顶Activity。

需要注意的是,该模式仅作用于与调用者处于同一个Task的情况(即第三方调用不起效果,在当前App的另一Task中的Activity实例也不会得到重用)。

singleTask

standardsingleTop非常不同,使用该模式启动的Activity在整个系统中仅允许存在一个单实例对象,存放在适当的Task中,再次呼出该Activity时将通过onNewIntent()方法重用实例,并将Task置顶。

在所属App中呼出时

该Activity会创建在App相同Task的堆栈顶,如果实例已存在,则堆栈中该实例之上的所有Activity都将被销毁。

如果需要在新Task中创建该Activity,则需要声明taskAffinity指定Task名称:


在第三方App中呼出时

该Activity会创建在新建Task中并置顶,如果该Activity所属App已启动并存在一个Task,则直接加到该Task中并置顶。

如果已有一个实例存在于任意一个Task中,则该singleTask实例之上所有Activity都将被销毁,并将该Task置顶。

singleInstance

singleTask非常类似,系统中仅允许存在一个单实例对象。

不同的是,持有该Activity的Task不可再存放其他Activity实例,该单实例Activity独占整个Task堆栈。

从该Activity中呼出其他新Activity时,将自动创建新Task存放。

需要注意的是,通过dumpsys activity显示,即便App中拥有两个Task,在任务管理器中依然只显示最近打开的那一个Task,无法自由来回切换到另一个Task中。(此时从启动器中启动App界面,可以调出主Task画面,但取而代之的是singleInstance的Task被放到了后台..)

解决方法是通过声明taskAffinity,让任务管理器启用多任务模式:


※ 非必要时,不推荐使用该singleInstance模式

参考原文

Understand Android Activity's launchMode: standard, singleTop, singleTask and singleInstance

你可能感兴趣的:(Android LaunchMode启动模式)