指定Activity的LaunchMode:
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask">
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
与standard和singleTop非常不同,使用该模式启动的Activity在整个系统中仅允许存在一个单实例对象,存放在适当的Task中,再次呼出该Activity时将通过onNewIntent()
方法重用实例,并将Task置顶。
在所属App中呼出时
该Activity会创建在App相同Task的堆栈顶,如果实例已存在,则堆栈中该实例之上的所有Activity都将被销毁。
如果需要在新Task中创建该Activity,则需要声明taskAffinity
指定Task名称:
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask"
android:taskAffinity="">
在第三方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
,让任务管理器启用多任务模式:
<activity
android:name=".SingleInstanceActivity"
android:label="singleInstance launchMode"
android:launchMode="singleInstance"
android:taskAffinity="">
※ 非必要时,不推荐使用该singleInstance
模式
参考原文
Understand Android Activity's launchMode: standard, singleTop, singleTask and singleInstance
网友评论