Activity栈与任务管理探究1——栈与任务的概述
Activity栈与任务管理探究1——栈与任务的概述
内容概览
1. 前言
2. Activity中的Stack
3. Activity中的Task
4. Activity栈与任务管理基本原则
1. 前言
Activity是Android的四大组件之一,是Android开发中非常重要的一环。无论是Android开发新手,还是老司机,在日常的开发工作中,都会经常与Activity/Intent打交道。在开发之初,对Activity的很多知识都是似是而非,一知半解,尤其是Activity栈(Stack)与任务(Task)的相关管理。后来接触到SingTask,SingTop等LaunchMode、 Intent flag等组合功能,以及做了一些模拟Activity栈管理开发后,发现其中很多知识对日常开发的实用价值非常高。
随着开发的继续深入,逐步发现,Activity的Stack和Task管理逻辑中有很多妙不可言的东西。
基于此,接下来会用几篇博文整理下自己的若干心得。疑义相与析,欢迎拍砖和指正。
2. Activity中的Stack
栈是一种数据结构,栈中的数据的存储和访问采取的是 “先入后出,后入先出”的模式。对于Activity而言,Activity在不断地跳转(onCreate)和回退(onDestory)过程中涉及到的Activity的创建和销毁,即涉及到Activity栈的压栈和出栈。
3. Activity中的Task
官方上对Activity中的Task是这样定义的:
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack), in the order in which each activity is opened.
简单来说,Activity中的Task就是一组以栈为模式聚集在一起的Activity组件集合。Activity Task有点类似于一个Activity Stack的容器,如下图所示:

当App启动时如果不存在当前App的任务栈就会自动创建一个,默认情况下一个App中的所有Activity都是放在一个Task中的。但是如果指定了特殊的启动模式(例如SingInstance启动模式),那么就会出现同一个App的Activity出现在不同的任务栈中的情况,也会有任务栈中包含来自于不同App的Activity。
4. Activity栈与任务管理基本原则
(1) 一般情况下:
- App中采用的是单任务模式,也即全部地Activity都在同一个容器中压栈和出栈;
- App中Activity的压栈和出栈都是采用“先入后出,后入先出”的模式,并且每次Activity跳转和回退都只会导致一个Activity的压栈和出栈;
(2) 在特殊的应用场景中,Activity的栈和任务管理会有很大的变动,直接影响Activity的栈和任务管理的因素有:
- LaunchMode
- Intent Flag
- TaskAffinity
在后续的博客中会陆续对相关内容进行总结。
(3) App process被杀死并不意味着Activity的Task和Stack会被自动清空。
App在Activity进入后台的情况下,都会通过onSaveInstanceState方法保存当前Activity栈中的信息,一旦App被意外杀死,而Activity栈没有清空的情况下,下次点击进入App,或者App自动被重新拉起的时候,会自动拉起到之前栈中的内容,并保有之前的跳转和回退逻辑。
杀死App 进程有以下几类典型的场景:
- 代码中杀死当前进程:System.exit(0)(杀死process,但是没有清空Activity栈);
- 程序运行中遇到了崩溃问题(杀死process,但是没有清空Activity栈);
- Terminal中杀死进程,adb kill pid(杀死process,且清空Activity栈);
- 在手机进程中kill掉正在运行的进程(杀死process,且清空Activity栈);
- 其他异常操作,引起系统自动杀死当前进程,如:
- 后台切换语言(杀死process,但是没有清空Activity栈);
- 后台切换字体(杀死process,但是没有清空Activity栈);
- 后台关闭当前程序的权限(杀死process,但是没有清空Activity栈);
但是在回退的过程中,每个页面都是重新创建(onCreate)的,也即页面view是重新绘制的,页面数据时重新获取的。在实际的开发过程中,很有可能会涉及到Stack中不同Activity之间的数据交互或页面跳转,开发者一般默认认为下层栈或底层栈中的Activity内容是存在的,这样遇到App被意外杀死,并重新启动的情况下,就很有可能会造成空指针问题。在实际的开发过程中,要格外留意。
Activity栈与任务管理探究1——栈与任务的概述的更多相关文章
- 栈的java实现和栈的应用
[例子和习题出自数据结构(严蔚敏版), 本人使用java进行实现. 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正. ] 栈的实现 栈是一种先进后出的数据结构, 首先定义了栈需要实现的接口: ...
- 剑指Offer——栈的java实现和栈的应用举例
剑指Offer--栈的java实现和栈的应用举例 栈是一种先进后出的数据结构, 栈的实现如下: 首先定义了栈需要实现的接口: public interface MyStack<T> { / ...
- C语言实现链栈的初始化&进栈&出栈&读取栈顶元素
/*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...
- C语言实现顺序栈的初始化&进栈&出栈&读取栈顶元素
/*顺序表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define Stack_Size 50 //设栈中元素个数为50 ...
- 20151028整理罗列某种开发所包括对技术(技术栈),“较为全面”地表述各种技术大系的图表:系统开发技术栈图、Web前端技术栈图、数据库技术栈图、.NET技术栈图
———————————— 我的软件开发生涯 (10年开发经验总结和爆栈人生) 爆栈人生 现在流行说全栈.每种开发都有其相关的技术.您是否觉得难以罗列某种开发所包括对技术(技术栈)呢? 您是否想过: ...
- 如何仅用递归函数和栈操作逆序一个栈——你要先用stack实现,再去改成递归——需要对递归理解很深刻才能写出来
/** * 如何仅用递归函数和栈操作逆序一个栈 * 题目: * 一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1. * 将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就 ...
- struts框架值栈问题二之值栈的内部结构
2. 问题二 : 值栈的内部结构 ? * 值栈由两部分组成 > root -- Struts把动作和相关对象压入 ObjectStack 中--List > context -- Stru ...
- 常见面试算法题JS实现-仅用递归函数和栈操作逆序一个栈
前言: 因为JAVA和JS语言特性的不同,有些东西在JAVA中可能需要一些技巧和手段才能实现的复杂程序,但是在JS中可能就是天然存在的,所以这套书里面的题目不会全部用JS去实现一遍,因为可能JS的实现 ...
- 两个栈实现队列&两个栈实现队列
为说明思想,假设队列.栈都很大,不会出现满的情况. 1. 两个栈实现队列 //前提已知: struct Stack { int top; //栈顶指针 int stacksize;//栈的大小 int ...
随机推荐
- SSIS 数据流的连接和查找转换
在SSIS的数据流组件中,SSIS引擎使用Merge Join组件和 Lookup组件实现TSQL语句中的inner join 和 outer join 功能,Lookup查找组件的功能更类似TSQL ...
- Robot Framework自动化测试环境部署
文档版本:v1.0 作者:令狐冲 如有问题请发邮件到:1146009864@qq.com 使用Robot Framework框架(以下简称RF)来做自动化测试. 模块化设计 1.所需环境一览表 软件 ...
- 3299: [USACO2011 Open]Corn Maze玉米迷宫
3299: [USACO2011 Open]Corn Maze玉米迷宫 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 137 Solved: 59[ ...
- 1202: [HNOI2005]狡猾的商人
1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1554 Solved: 745[Submit][Stat ...
- 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3 ...
- log4go 的 Bug Fix 及 增强
log4go 一直存在关闭时丢失记录的问题.网络上很多人怀疑是Flush.经过跟踪发现只要在 Close() 函数中增加以下语句: for i := 10; i > 0 && l ...
- 【js数据结构】栈解决括号不匹配问题
栈可以用来判断一个算术表达式中的括号是否匹配. 思路:读取算术表达式,遇到左括号'{'.'['.'('压入栈,栈的特点是后入先出,所以当遇到右括号'}'.']'.')'的时候,取出栈顶元素,是否满足读 ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
- 自动化测试工具Appium环境搭建
Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持IOS.Android及FirefoxOS平台.Appium使用WebDriver的json wire协议 ...
- HTML——超文本标记语言
HTML: 网站(站点) - 网页 1.HTML作为文件后缀名,可以把文件变为网页 2.HTML是一门编程语言的名字:超文本标记语言 3.超越了文字的范畴,除了文字还可以有图片.视频.音频.动画特效等 ...