美文网首页
Activity启动模式及场景

Activity启动模式及场景

作者: gczxbb | 来源:发表于2019-03-29 18:47 被阅读0次

一、四种模式

  • 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一样的主宿任务栈中。


任重而道远

相关文章

网友评论

      本文标题:Activity启动模式及场景

      本文链接:https://www.haomeiwen.com/subject/yzsrbqtx.html