Android Launch Mode 解析

一、什么是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

    2、http://www.jianshu.com/p/774c7fb83b99

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值