一、四种模式
- standard,标准模式,(默认)
- singleTop,栈顶复用
- singleTask,栈内复用
- singleInstance,全局唯一
standard,启动每一个Activity都会在栈顶创建实例,和启动它的Activity在同一个任务栈。
singleTop,被启动的Activity已经位于栈顶时,不会再创建实例,复用。
回调onNewIntent()方法,传入新Intent,组件已处于活动状态,生命周期onCreate()方法和onStart()方法不会调用。
如果栈顶不存在实例,同标准模式。
standard和singleTop模式都在原有任务栈创建Activity实例,不会启用新任务栈,taskAffinity标志对它们无影响。
singleTask,被启动Activity实例已位于栈中时,(即使不在栈顶),复用,该Activity上面的所有实例全部出栈。
回调onNewIntent()方法,传入新Intent。singleTask模式的Activity所属任务栈不一定和启动者Activity相同。
singleInstance,单独占一个Task栈,系统唯一的Activity实例,再次启动Activity时,根据栈内唯一性,复用。
二、taskAffinity(singleTask模式)
代表任务栈名字。
taskAffinity字段只影响singleTask模式,无关standard和singleTop。
1,不设置
默认是应用包名,不会开启一个新任务栈。
2,设置和包名不同
当前不存在同名任务栈时,新建,TaskId改变。
存在任务栈时,被启动Activity的目标任务栈,按照singleTask模式流程入栈。
当两个不同App的Activity组件设置相同当taskAffinity,虽然不在同一应用中,但Activity会被分配到同一个Task。
3,示例
A进程ActivityA启动B进程的ActivityB,如果ActivityB位于任务栈顶,ActivityB任务栈将被调到最前台。
返回键,ActivityB任务栈的下一个页面。
思考,ActivityB是被A进程启动的,只想使用一次,然后返回ActivityA,需要回到A进程,现在却仍在B进程。
解决方案,B进程ActivityB独占一个任务栈,配置taskAffinity标志和包名不同,或让ActivityB一直在栈底部,启动时,杀掉栈中间的组件。
三、allowTaskReparenting(singleTop和standard模式)
allowTaskReparenting字段只影响singleTop和standard模式。
允许组件回到它本应用的任务栈。
1,设置
两个应用A和B,A的ActivityA,启动B的ActivityB,android:exported=true,singleTop或standard模式,(ActivityB和ActivityA在同一个任务栈)。
B应用组件进入到A应用的任务栈,在A应用中,Home到后台,打开B应用,此时已经有一个B应用ActivityB在别的任务栈中,将ActivityB从A应用任务栈移到B应用任务栈,再次唤起A应用不会有ActivityB。
应用场景,App打开浏览器,浏览器Activity设置。android:allowTaskReparenting=true。
2,不设置
ActivityB不会回到本应用任务栈,B应用启动,将在它的任务栈重建ActivityB实例。
设置allowTaskReparenting标志的Activity会自动回到和它的taskAffinity一样的主宿任务栈中。
任重而道远
网友评论