Android启动模式之launchMode一

1.首先要了解任务和任务栈的概念

1.1. android任务栈又称为Task,它是一个栈结构,具有后进先出的特性,用于存放我们的Activity组件。 
1.2. 我们每次打开一个新的Activity或者退出当前Activity都会在一个称为任务栈的结构中添加或者减少一个Activity组件,因此一个任务栈包含了一个activity的集合, android系统可以通过Task有序地管理每个activity,并决定哪个Activity与用户进行交互:只有在任务栈栈顶的activity才可以跟用户进行交互。 
1.3. 在我们退出应用程序时,必须把所有的任务栈中所有的activity清除出栈时,任务栈才会被销毁。当然任务栈也可以移动到后台, 并且保留了每一个activity的状态. 可以有序的给用户列出它们的任务, 同时也不会丢失Activity的状态信息。 

1.4. 需要注意的是,一个App中可能不止一个任务栈,某些特殊情况下,单独一个Actvity可以独享一个任务栈。还有一点就是一个Task中的Actvity可以来自不同的App,同一个App的Activity也可能不在一个Task中。

更加详细的简介参考:https://developer.android.google.cn/guide/components/tasks-and-back-stack.html

2.LaunchMode基于自己的理解

2.1首先要知道launchMode有四种加载模式,分别是:

“standard” 
“singleTop” 
“singleTask” 
“singleInstance”

默认模式是“standard”。

那么下面分别介绍每个模式的用途:

2.2standard-标准模式,也是默认的模式

处理的模式如图:


每次不管任务栈中是否存在某个Activity(例如:AActivity),每次都是在同一个任务栈起启动新的Activity,可以看一下测试的日志如下:

04-18 18:47:59.333 665-665/? I/AActivity onCreate: 131
04-18 18:48:05.572 665-665/com.dress.gold.interconnected.check I/BActivity  onCreate: 131
04-18 18:48:07.288 665-665/com.dress.gold.interconnected.check I/CActivity  onCreate: 131
04-18 18:48:08.153 665-665/com.dress.gold.interconnected.check I/AActivity onCreate: 131
04-18 18:48:13.086 665-665/com.dress.gold.interconnected.check I/BActivity  onCreate: 131
04-18 18:48:14.133 665-665/com.dress.gold.interconnected.check I/CActivity  onCreate: 131

04-18 18:48:15.317 665-665/com.dress.gold.interconnected.check I/AActivity onCreate: 131

输入日志的方法:

Log.i("CActivity  onCreate","" + getTaskId());
getTaskId()方法获取当前任务栈的任务ID,可以帮助我们判断多个Activity是否在同一个任务栈中;

清单文件配置,为每个Activity配置standard模式,也可以不配置使用默认模式:

<activity android:name=".ui.testui.AActivity" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" android:launchMode="standard"/>
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".ui.testui.BActivity" android:launchMode="standard"/>
<activity android:name=".ui.testui.CActivity" android:launchMode="standard"/>

2.2singleTop-顶部模式

处理的模式如图:


若任务栈顶部存在该Activity,则不会重新创建该Activity(例如:CActivity),在onNewIntent方法中接收Intent,可以看一下测试的日志如下:

04-19 22:34:32.581 8803-8803/? I/AActivity onCreate: getTaskId()----137
04-19 22:34:35.874 8803-8803/com.dress.gold.interconnected.check I/BActivity  onCreate: getTaskId()----137
04-19 22:34:37.416 8803-8803/com.dress.gold.interconnected.check I/CActivity  onCreate: getTaskId()----137
04-19 22:34:38.928 8803-8803/com.dress.gold.interconnected.check I/CActivity onNewIntent: getTaskId()----137
04-19 22:34:41.011 8803-8803/com.dress.gold.interconnected.check I/CActivity onNewIntent: getTaskId()----137
04-19 22:34:41.645 8803-8803/com.dress.gold.interconnected.check I/CActivity onNewIntent: getTaskId()----137
04-19 22:34:42.325 8803-8803/com.dress.gold.interconnected.check I/CActivity onNewIntent: getTaskId()----137

若任务栈顶部不存在该Activity,则不会重新创建该Activity(例如:AActivity),可以看一下测试的日志如下:

04-19 22:35:55.513 9447-9447/? I/AActivity onCreate: getTaskId()----138
04-19 22:36:09.617 9447-9447/com.dress.gold.interconnected.check I/BActivity  onCreate: getTaskId()----138
04-19 22:36:10.752 9447-9447/com.dress.gold.interconnected.check I/CActivity  onCreate: getTaskId()----138
04-19 22:36:11.746 9447-9447/com.dress.gold.interconnected.check I/AActivity onCreate: getTaskId()----138
04-19 22:36:12.845 9447-9447/com.dress.gold.interconnected.check I/BActivity  onCreate: getTaskId()----138
04-19 22:36:13.715 9447-9447/com.dress.gold.interconnected.check I/CActivity  onCreate: getTaskId()----138
04-19 22:36:14.264 9447-9447/com.dress.gold.interconnected.check I/AActivity onCreate: getTaskId()----138
04-19 22:36:14.498 9447-9447/com.dress.gold.interconnected.check I/BActivity  onCreate: getTaskId()----138
04-19 22:36:14.964 9447-9447/com.dress.gold.interconnected.check I/CActivity  onCreate: getTaskId()----138
04-19 22:36:15.465 9447-9447/com.dress.gold.interconnected.check I/AActivity onCreate: getTaskId()----138
04-19 22:36:17.181 9447-9447/com.dress.gold.interconnected.check I/BActivity  onCreate: getTaskId()----138
04-19 22:36:20.378 9447-9447/com.dress.gold.interconnected.check I/CActivity  onCreate: getTaskId()----138
04-19 22:36:22.883 9447-9447/com.dress.gold.interconnected.check I/AActivity onCreate: getTaskId()----138

输入日志的方法:

Log.i("CActivity  onCreate","" + getTaskId());
getTaskId()方法获取当前任务栈的任务ID,可以帮助我们判断多个Activity是否在同一个任务栈中;

清单文件配置,为每个Activity配置standard模式,也可以不配置使用默认模式:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值