ActivityRecord、TaskRecord、ActivityStack区别
-
ActivityRecord对应着一个Activity实例,保存了Activity所有相关信息
-
TaskRecord指的是一个任务栈,里面包含多个ActivityRecord
-
ActivityStack用于管理TaskRecord
五种启动模式
Standard模式
-
默认的启动模式,每次启动都会创建新的Activity,运行在启动它的任务栈里
-
taskAffinity:对其无效
SingleTop模式
-
如果当前任务栈顶部已经有一个Activity了,则不会重新创建,调用它的onNewIntent方法
-
例如:用于展示通知消息内容的Activity设置为SingleTop,如果当前已经在展示通知消息界面了,则不会重新创建,而是调用onNewIntent去更新界面内容
-
taskAffinity:对其无效
SingleTask模式
-
启动时会先检查taskAffinity是否和当前任务栈一致(默认是包名),如果不一致会检查是否有同名的任务栈,如果没有就会创建一个新的与taskAffinity同名的任务栈再创建Activity;如果配置的任务栈中已经存在该Activity,则不重新创建,而是调用onNewIntent,并且它上层的Activity会都被清空
-
taskAffinity:只能运行在它配置的任务栈中
-
同时默认带
Intent.FLAG_ACTIVITY_SINGLE_TOP
和## Intent.FLAG_ACTIVITY_NEW_TASK
效果
SingleInstance模式
-
全局只有一个Activity实例,独占一个任务栈,其他Activity不能进入它所在任务栈,当重新启动该Activity时回调onNewIntent方法
-
配置taskAffinity和
Intent.FLAG_ACTIVITY_SINGLE_TOP
和## Intent.FLAG_ACTIVITY_NEW_TASK
对它都没什么意义,因为它总是独占一个任务栈并且全局唯一
SingleInstancePerTask模式
-
Android 12新增,同时拥有SingleInstance和SingleTask部分特性
-
只能作为任务栈的根Activity、作为创建该任务栈的第一个Activity运行
-
每个任务栈最多仅有一个实例
-
如果当前任务栈没有该Activity实例,则会像SingleInstance一样在新的任务栈启动该Activity
-
如果当前任务栈已经有该Activity实例,则不会重新创建,并会像SingleTask那样清空它上面的Activity
-
如果配合
Intent.FLAG_ACTIVITY_MULTIPLE_TASK
或者FLAG_ACTIVITY_NEW_DOCUMENT
启动时,就算当前任务栈已经有该Activity实例了,每次都会在新的任务栈中创建Activity实例 -
Intent.FLAG_ACTIVITY_NEW_TASK
和taskAffinity
对这个启动模式没有意义,因为它必须在当前任务栈启动的第一个Activity,所以当前任务栈一定跟它的taskAffinity一致,所以加上或者不加上Intent.FLAG_ACTIVITY_NEW_TASK
都会复用当前任务栈中的实例 -
适用于需要在独立的任务栈启动并且拥有SingleTask特性的Activity
taskAffinity
-
用于指定Activity所在的任务栈
-
需要配合Intent.FLAG_ACTIVITY_NEW_TASK使用,在启动时会检查是否已经存在taskAffinity同名的任务栈,不存在则会创建
-
仅对SingleTask有效
allowTaskReparenting
-
与taskAffinity配合使用,当Activity检测到自己需要的任务栈已经创建,则会移动到taskAffinity指定的任务栈中去
-
使用场景:当AppA启动AppB的ActivityA时,ActivityA是先存在于AppA任务栈中的,当AppB启动时,ActivityA发现它原本需要的任务栈已经创建,则会移动到AppB任务栈中,所以我们会看到AppB启动时看到的不是主界面,而是ActivityA界面
其他
-
Android 12 以前,当我们处于 Root Activity 时,点击返回键时,应用返回桌面, Activity 执行 onDestroy,程序结束。 Android 12 起同样场景下 Activity 只会 onStop,不再执行 onDestroy。
-
如果默认启动的Activity设置启动模式为SingleTask或者SingleInstance:打开app,进入第二个界面;返回桌面,重新回到app,显示的是主界面而不是回到桌面前的第二个界面,SingleTask模式是因为启动时会清空上层Activity;而SingleInstance独占一个任务栈,二级界面所在任务栈被切换都后台了
-
在cmd下运行
adb shell dumpsys activity
查看Activity栈信息文章来源:https://www.toymoban.com/news/detail-409062.html -
启动模式对应的Int值:文章来源地址https://www.toymoban.com/news/detail-409062.html
public class ActivityInfo extends ComponentInfo implements Parcelable { public static final int LAUNCH_MULTIPLE = 0; public static final int LAUNCH_SINGLE_TOP = 1; public static final int LAUNCH_SINGLE_TASK = 2; public static final int LAUNCH_SINGLE_INSTANCE = 3; public static final int LAUNCH_SINGLE_INSTANCE_PER_TASK = 4;
到了这里,关于Android 五种启动模式小结的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!