【activity任务栈】浅析
背景知识
Activity四种启动模式
- 标准模式 standard
- 栈顶复用模式 singleTop
- 栈内复用模式 singleTask
- 单例模式 singleInstance
任务栈

Activity的Flags
Activity的Flags很多,这里介绍集中常用的,用于设定Activity的启动模式。可以在启动Activity时,通过Intent的addFlags()方法设置。
(1)FLAG_ACTIVITY_NEW_TASK 其效果与指定Activity为singleTask模式一致。
(2)FLAG_ACTIVITY_SINGLE_TOP 其效果与指定Activity为singleTop模式一致。
(3)FLAG_ACTIVITY_CLEAR_TOP 具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。如果和singleTask模式一起出现,若被启动的Activity已经存在栈中,则清除其之上的Activity,并调用该Activity的onNewIntent方法。如果被启动的Activity采用standard模式,那么该Activity连同之上的所有Activity出栈,然后创建新的Activity实例并压入栈中。
四种启动模式的基础功能就不再赘述;
问题:
(1)如果在Service或Application中启动一个Activity,其并没有所谓的任务栈,怎么实现?
- 可以使用标记位Flag来解决。解决办法:为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,创建一个新栈。
(2)除了singleInsatance模式,有没有其他方法使activity独立一个栈?
- 待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,就会创建一个新栈。
(3)何时调用onNewIntent()方法?
- Activity已经启动过,处于Acrtivity栈中
- 当launchMode为singleTop时,如果在栈顶,再次启动会调用
- 当launchMode为singleTask、singleInstance时,如果已经在Activity栈内,再次启动会调用onNewIntent()方法
- 当launchMode为standard时,不会调用
(4)打开a、b、c后在c中如何关闭a、b
(5)其他:
- setResult()必须在finish()之前调用
- 多任务栈的情况下,setResult后,前Activity均能拿到消息
- ActivityA(standard)-->ActivityB(singleInstance)-->ActivityC(standard)

此时按back键ActivityC-->ActivityA-->ActivityB

public class ActivityA extends Activity {//activity代码、b、c基本相同
private static final String ACTIVITY_NAME = "ActivityA";
private static final String LOG_TAG = "test_activity_stack"; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_btn);
refreshTask();
findViewById(R.id.btn_task).setOnClickListener(v -> startActivity(new Intent(this, ActivityB.class)));
} @Override
protected void onDestroy() {
super.onDestroy();
refreshTask();
} private void refreshTask() {
int taskId = getTaskId();
Log.i(LOG_TAG, ACTIVITY_NAME + "所在的任务的id为: " + taskId);
((TextView) findViewById(R.id.tv_task)).setText(LOG_TAG + " " + ACTIVITY_NAME + "所在的任务的id为: " + taskId);
}
}如上图三个Activity分别设置standard、singleInstance、standard;运行起来的结果

可以看到,A在任务栈4973启动B,启动了一个任务栈4974;启动C又回到了4973;
以此点击back键退出

首先从C回到A,再之后回到4974任务栈的B(如果A、C所在的4973仍有其他activity,会一直退到栈空才会回到B)
- startActivityForResult打开单独进程的Acitivity,启动模式将不起作用。在情况3中,按back键ActivityC-->ActivityB-->ActivityA,两任务在同一任务栈中;换言之,进程与任务栈没有必然关系
【activity任务栈】浅析的更多相关文章
- Android群英传》读书笔记 (4) 第八章 Activity和Activity调用栈分析 + 第九章 系统信息与安全机制 + 第十章 性能优化
第八章 Activity和Activity调用栈分析 1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重 ...
- 第四章 Activity和Activity调用栈分析 系统信息与安全机制 性能优化
1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重新回到前台状态的时候会先调用onRestart方法,然 ...
- KEILC51可重入函数及模拟栈浅析
MARK:文章中的红色部分是个人的理解. KEILC51可重入函数及模拟栈浅析 关键字:keilc51,模拟堆栈,可重入函数调用,参数传递,C?XBP,C?ADDXBP 摘要:本文较详细的介绍了kei ...
- Android群英传笔记——第八章:Activity与Activity调用栈分析
Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...
- ActivityJump+ActivityManager【Activity之间的跳转和Activity任务栈管理】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装Activity跳转的方法以及实现Activity任务栈管理. 效果图 代码分析 ActivityJump:封装Activi ...
- Intent 的Flag属性(Activity在栈位置的主宰者)
Intent 的Flag属性可用来控制Activity在栈中的排列位置,本文列举了常见的Flag. 例--(以无动画方式启动ActivityB): Intent intent=new Intent(A ...
- Android零基础入门第77节:Activity任务栈和启动模式
通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...
- Android组件内核之Activity调用栈分析(一)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680 导语 我们陈述一下Activity,Activity是整个应用用户交互的 ...
- 使用adb shell dumpsys检测Android的Activity任务栈
谈起Android程序开发,就需要了解其四个主要的部件:Activity.Service.ContentProvider. BroadcastReceiver.而其中Activity是唯一直接控制程序 ...
随机推荐
- python生产环境部署
Python部署web开发程序的几种方法 fastcgi ,通过flup模块来支持,在nginx里对应的配置指令是 fastcgi_pass http,nginx使用proxy_pass转发,这个要求 ...
- 关于SELinux
出现背景以及发展历程 SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secu ...
- 2个byte类型数据相加(转型问题的分析)
转自https://blog.csdn.net/alinshen/article/details/53571857 今天看到网上有网友问到关于final修饰的面试题目,题目如下: <span s ...
- float_array.go
) if err != nil { log.Fatalf("Could not parse: %s", s) ret ...
- Dubbo中服务消费者和服务提供者之间的请求和响应过程
服务提供者初始化完成之后,对外暴露Exporter.服务消费者初始化完成之后,得到的是Proxy代理,方法调用的时候就是调用代理. 服务消费者经过初始化之后,得到的是一个动态代理类,InvokerIn ...
- BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块
BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块 Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一 ...
- angular开发环境配置全套教程
第一步.安装node.js 1.需要下载的文件路径:https://nodejs.org/en/download/ 2.安装nodejs: 3.验证node.js 4.npm安装以及验证: npm的安 ...
- Android 画文字图
画图 private Bitmap getbitmap(String content) { Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.C ...
- Caffe初学者第一部:Ubuntu14.04上安装caffe(CPU)+Python的详细过程 (亲测成功, 20180524更新)
前言: 最近在学习深度学习,最先要解决的当然是开源框架的环境安装了.之前一直在学习谷歌的Tensorflow开源框架,最近实验中需要跟别人的算法比较,下载的别人的代码很多都是Caffe的,所以想着搭建 ...
- surging 微服务引擎 1.0 正式发布
surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http.TCP.WS.Mqtt协议,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希 ...