一、什么是LaunchMode
LaunchMode主要是用来管理Activity怎么启动的,主要有4种模式。
Standard:
SingleTop:
SingleTask:
SingleInstance:
再解释这些模式之前需要了解2个概念,task和back stack。
二、Task和back stack
Task: 实际就是一系列Activty的集合。
Back stack:就是一个后进先出的堆栈(不了解什么是堆栈,自己去度娘下),用来管理activity。
每个App可以有多个Task。
每个task都是一个back stack。
创建一个app后,系统就会自动创建一个task,该task包含一个back stack。
三、LaunchMode四种模式
1、Standard模式
在调用startActivity的时候,每次都会创建一个新的activity。
操作步骤:在StandardActivity再次启动StandardActivity
task和back stack信息如下
日志信息,通过:adb shell dumpsys activity 可以获得,
2、SingleTop模式
1)、如果activityA本身就在栈顶,这时启动activityA,不会创建新的activityA
操作步骤:SingleTopActivity1在栈顶,这时候再次启动SingleTopActivity1
task和back stack信息如下
2)、如果ActivityA不在栈顶,这时启动ActivityA,会创建新的activityA。
操作步骤:SingleTopActivity2不再栈顶,这时候启动SingleTopActivity2,则会创建新的activity。
task和back stack信息如下
3、SingleTask模式
默认会创建一个task,但是这个要具体系统有关,如果要强制创建task,需要设置参数:android:taskAffinity
操作步骤:启动SingleTaskActivity(单独一个task),这时候再创建activityB,activityB和SingleTaskActivity在一个task中
task和back stack信息如下,可以看到创建了2个task, #1800和 #1801,
默认Task 1800中只包含MainActivity,
Task1801中包含了SingleTaskActivity和ActivityB,后续新创建的Activity放在新的task中(#1801)
如果在AcitivityB上再次启动SingleTaskActivity会出现什么情况呢?
Task1801 stack会弹出activityB,显示SingleTaskActivity
4、singleInstance模式
这个模式也会创建一个task,但是在不会将新的activity放在这个task中。
操作步骤:启动SingleInstanceActivity,然后创建ActivityB
Task和back stack信息如下,创建了2个task:1800和1802
默认taskId是1800, 启动SingleInstanceActivity创建task1802,启动ActivityB后,ActivityB放在task 1800中,这个是和singleTask的区别。
四、App之间的的调用
如果我在App1中调用其它App的activity,这时候task和back stack是什么情况呢?
这里以启动Email应用为例,这时候实际要创建一个新的task来处理
当前taskId是1806, 启动activity处理action: Intent.ACTION_SENDTO时,系统创建了一个新的task: 1807。
五、launch App的问题
进入app重复初始化问题
操作步骤:
1、 将apk包拷贝到手机目录下,在手机上切换到该目录下,进行安装
2、 安装成功后,点击打开,进入到mainActivity,然后通过startActivity进入到activity2
3、 按home键回到主界面,点击该app的图标进入app,这时进入的是MainActivity,而不是activity2
具体解决办法是在MainActivity的OnCreate方法中进行如下判断,
if(!isTaskRoot()) {
finish();
return;
}
根本原因,网上分析的很多,我都不是很认同,我初步怀疑应该是Launcher的原因,安装后打开app,这时候Launcher没有app运行的相关信息(比如当前app中activity有哪些?状态分别是什么),所以在主界面启动app的时候,就重新启动MainActivity。
有哪位大神能解释的,也请帮忙回复,不胜感激。
代码:https://github.com/huanting/TestTask
参考:
1、https://developer.android.com/guide/topics/manifest/activity-element.html