桟 (堆栈: stack)
任务
返回桟
在官方文档中, 找不到关于返回桟的概念, 但是按照官方文档在描述时的语境, 可以理解为响应 Android 返回键的顺序队列. 这是站在用户的直观感受上的描述. Android 内部的描述单位只有任务 (Task).
任务桟
在官方文档中没有这个概念. 我为了方便理解, 把
中按照
- 任务
规则的顺序队列的 一系列 Activity 称为
- 桟
.
- 任务栈
由于 官方文档中没有详细的说明
, 在实际的开发中如果以栈为基本
- 什么是返回桟
的话, 很容易被自己绕晕, 如果按照
- 度量单位
为基本度量单位的话就很容易理清楚
- 任务
了. 我个人把返回栈理解为这样子的: 返回桟仅有一个 (因为返回键只有一个), 返回桟操作的基本元素是
- Android 四大启动模式
, 返回键操作的是返回桟中处于前台的
- 任务
, 每个
- 任务
维护着一系列 Activity 组成的
- 任务
以响应返回键.
- 栈
我们再来看另一示例,Android 浏览器应用声明网络浏览器 Activity 应始终在其自己的任务中打开(通过在
无论 Activity 是在新任务中启动,还是在与启动 Activity 相同的任务中启动,用户按 "返回" 按钮始终会转到前一个 Activity。 但是,如果启动指定 singleTask 启动模式的 Activity,则当某后台任务中存在该 Activity 的实例时,整个任务都会转移到前台。此时,返回栈包括上移到堆栈顶部的任务中的所有 Activity。 上图显示了这种情况。
上图 显示如何将启动模式为 "singleTask" 的 Activity 添加到返回栈。 如果 Activity 已经是某个拥有自己的返回栈的后台任务的一部分,则整个返回栈也会上移到当前任务的顶部。
属性
- android:taskAffinity
与
- SingleTask
的异同
- SingleInstance
我写了一个 Demo 测试了下:
当我把
配置为:
- SingleTaskA
- <activity android:name=".SingleTaskA" android:launchMode="singleTask"
- android:taskAffinity="com.didikee.temp" />
在
中启动一个标准模式的
- SingleTaskA
Activity:
- StandardB
- public class SingleTaskA extends BaseLauncherModeActivity {
- @Override
- protected Class gotoActivity() {
- return StandardB.class;
- }
- @Override
- protected String setModeTextShow() {
- return Constant.SINGLE_TASK;
- }
- }
而在
中, 我一直启动
- StandardB
自己:
- StandardB
- public class StandardB extends BaseLauncherModeActivity {
- @Override
- protected Class gotoActivity() {
- return StandardB.class;
- }
- @Override
- protected String setModeTextShow() {
- return Constant.STANDARD+"Repeat";
- }
- }
补充下基类:
- public abstract class BaseLauncherModeActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_base_launcher_mode);
- String text = setModeTextShow();
- Button button = (Button) findViewById(R.id.bt);
- button.setText("模式: "+text);
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Class aClass = gotoActivity();
- if (aClass==null)return;
- startActivity(new Intent(getApplicationContext(),aClass));
- }
- });
- int taskId = getTaskId();
- Log.d(Constant.TAG,"taskId: "+taskId);
- }
- protected abstract Class gotoActivity();
- protected abstract String setModeTextShow();
- }
得到如下结果:
- 03-14 10:32:32.287 22561-22561/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 26
- 03-14 10:32:37.691 22561-22561/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 26
- 03-14 10:32:42.120 22561-22561/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 27
- 03-14 10:32:45.961 22561-22561/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 27
- 03-14 10:32:52.105 22561-22561/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 27
- 03-14 10:32:53.531 22561-22561/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 27
- 03-14 10:32:55.748 22561-22561/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 27
- 03-14 10:32:56.763 22561-22561/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 27
可以看到,
启动了一个新的
- SingleTaskA
,id 为 27, 之后在 SingleTaskA 中启动
- 任务(Task)
并没有做其他的操作, 而是直接在刚刚
- StandardB
启动的
- SingleTaskA
中添加.
- 任务
现在我去掉
属性的定义, 得到:
- taskAffinity
- 03-14 16:42:10.604 31062-31062/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 29
- 03-14 16:42:15.261 31062-31062/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 29
- 03-14 16:42:16.865 31062-31062/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 29
- 03-14 16:42:19.197 31062-31062/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 29
- 03-14 16:42:20.232 31062-31062/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 29
- 03-14 16:42:21.049 31062-31062/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 29
- 03-14 16:42:22.180 31062-31062/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 29
可见, 默认是不会创建新的
的.
- 任务
现在, 把 SingleTaskA 改为 SingleInstanceA, 然后在其中可以启动
(上面有代码), 得到如下结果:
- StandardB
- 03-14 16:46:59.669 2273-2273/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 30
- 03-14 16:47:09.367 2273-2273/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 30
- 03-14 16:47:10.602 2273-2273/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 31
- 03-14 16:47:12.013 2273-2273/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 30
- 03-14 16:47:14.438 2273-2273/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 30
- 03-14 16:47:15.429 2273-2273/com.didikee.androidlaunchermode D/AndroidLauncherMode: taskId: 30
可见,
新建了一个
- SingleInstanceA
id 为 31, 在 SingleInstanceA 中启动 StandardB 还是继续添加在之前
- 任务
中.
- 任务
为核心的, 不要被栈带偏了.
- 任务
一定会新建一个
- SingleInstance
, 并且该
- 任务
中仅包含一个实例.
- 任务
默认不会创建新
- SingleTask
, 但是可以通过
- 任务
达到创建新
- taskAffinity
的目的, 创建的
- 任务
可添加其他元素.
- 任务
来源: http://www.cnblogs.com/dd-dd/p/6549462.html