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