参考:http://developer.android.com/guide/components/tasks-and-back-stack.html

在Android中,一个应用程序里面,通常包含了多个相互结合的Activity。每个Activity通常被设计为可以为用户执行某个特定的动作,Activity与Activity之间可以通过Intent相互的跳转。甚至,可以通过Intent的action来启动另外一个应用程序的Activity,这个过程给用户的感觉就像这个Activity就是你的应用程序里面一样。Android把Activity的这种表现称之为“无缝连接”。

在用户的角度上看,它对某一个应用程序的操作,就是执行一个特定的task(任务),来完成某一个特定的操作。但是实际上在Android应用中,这可能是一个task或者是多个task之间相互结合。这就是Android的“多任务”机制。我们知道,一个应用程序表现给用户的就是一个个的Activity,所以“多任务”机制就是Android系统对Activity的管理。

在Android中,通过使用“back stack(返回堆栈)”来实现对Activity的管理,每一个启动的Activity都会存储在“back stack”中,遵循着栈的基本原则:先进后出。无缝连接只是Activity管理的一部分表现而已。下面先看看Task和back stack的基本行为。

一、Task和back stack的基本行为

1、单个Task中的多个Activity

Home界面是启动Task最多的地方。当用户点击一个应用程序图标(或者是快捷方式),这个应用程序的Task就会被调到前台(如果这个应用程序的Task不存在,那么就会创建一个新的任务,而这个应用程序的“main”Activity就会作为back stack的root Activity)。

当这个Activity在去启动其他的Activity,这个新的Activity就会被压入到“back stack”的栈顶并且获得焦点,之前的那个Activity仍然保留在栈中,但是却会停止(Activity的生命周期)。当用户按下Back(返回)键,当前的Activity就会弹出栈顶(被销毁),而之前的那个Activity就会被恢复。

如下图:

如果用户继续按下返回键,那么栈中的Activity会按照顺序一个个弹出,知道退出到Home界面(或者退回到启动这个Task的Activity(多Task))。此时,这个栈中的所有Activity全部被移除,这个Task就不存在了。

2、“back stack”永远遵循先进后出的原则

在“back stack”返回堆栈中的Activity永远都会遵循“栈”这种数据结构的基本原则——先进后出。永远都不会被重新的排序,只会不断的弹出或者压入。

“back stack”中Activity的存储和Activity的启动模式密切相关,这点在后面会学到,这里先来用这个知识举个例子:在一个栈中有3个Activity:Activity1,Activity2,Activity3。并且Activity1的启动模式为“singleTask”。如下图:

3、一个Task就是内聚单元

Android是一个“多任务”的系统,同一时刻会有多个Task的存在。一个Task是一个内聚单元,当用户开始一个新的Task或者通过Home按钮返回到Home界面的时候,该Task可以移动到后台(background)。当一个Task存在于后台的时候,所有在这个Task中的Activity都处于Stopped状态。但是这个Task的back stack仍然完好无损的保存着——它仅仅是被别的Task抢占了焦点。如下图:

当如上如图的情况下,用户仍然可以在Home界面重新选择TaskA的应用程序,让TaskA获取焦点,并且TaskA的栈顶的Activity Y会恢复,就像用户之前离开它的时候一样。

4、一个Activity可以被实例化多次

因为在“back stack”中的Activity永远都不会重新排序,如果你的应用程序允许用户在不止一个Activity去启动另外一个指定的Activity,那么系统就会去创建一个该Activity新的实例并把它压入到栈顶(而不是把栈中之前的那个实例移动到栈顶)。因此,应用程序的Activity可能会被实例化多次(甚至是在不同的Task中),如下图:

然而,如果你不想一个Activity被实例化多次,我们可以去修改这种行为。这个将在后面的讲到。

二、Activity、Task、Process的关系

用一张简单的图表示如下:

activty在哪个栈里面_第二篇Activity:2、任务和返回堆栈(Tasks and Back Stack)之基本介绍...相关推荐

  1. Android基础学习第二篇—Activity

    写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...

  2. 软件使用_第二篇 Latex基础知识

    目录 1. 基础知识 1.1 Latex 源文件 1.1.1 空白距离 1.1.2 特殊字符 1.1.3 Latex命令 1.1.4 注释 1.1.5 纵向固定间距控制命令 1.1.6 页面控制命令 ...

  3. 单选选择才可以提交_第二篇:DJANGO开发产品选择表amp;调查问卷

    锅大虾:第一篇:DJANGO开发产品选择表&调查问卷​zhuanlan.zhihu.com 三.调查问卷部分 前端实现效果:首页 首页效果图 需求: 1.单项.多项选择,并且随意增加" ...

  4. Python笔记_第二篇_面向过程_第二部分_4.常用模块的简单使用_操作系统模块(os)和队列模块(collections)...

    1. 用递归函数遍历目录: import osdef getAllDir(path,sp=" "):# 得到当前目录下所有的文件filesList = os.listdir(pat ...

  5. 第二部分 Mysql数据库管理_第二篇 数据库MySql

    <1> 在数据库系统中,SQL语句不区分大小写(建议用大写) .但字符串常量区分大小写.建议命令大写,表名库名小写: <2> SQL语句可单行或多行书写,以";&qu ...

  6. 2字节取值范围_第二篇——整数和浮点数在计算机中的表示(2)

    下面,我们描述一下用位来编码整数的两种不同方式:一种只能表示非负数,而另一种能表示负数.正数和零. 1.无符号数的编码 原理:无符号数编码的定义 对向量 : 函数 将一个长度为w的0,1串映射到一个非 ...

  7. 设计模式_第二篇_策略模式

    本文是我通过学习<Head First 设计模式>而写. 作为我要描述的第一个模式,首先要说什么是设计模式,然后,用一个实例,并对这个实例不断的改进,引出策略模式. 与其空泛地给出一堆描述 ...

  8. python正则表达式操作指南_第二篇详细Python正则表达式操作指南(re使用)

    接下来昨天的内容 执行匹配 一旦你有了已经编译了的正则表达式的对象,你要用它做什么呢?`RegexObject` 实例有一些方法和属性.这里只显示了最重要的几个,如果要看完整的列表请查阅 Python ...

  9. 免费资源库_第二篇 文档(1)_数据分析

    转载自:https://blog.csdn.net/weixin_40539952/article/details/106190944 有用的官方中文文档(持续更新) Python中文教程:Pytho ...

最新文章

  1. c语言编程将图片上下翻转,C语言实现矩阵翻转(上下翻转、左右翻转)
  2. java cron表达式_Java 程序员都应该去使用一下这款强大的国产工具类库
  3. 锦州中学高考2021成绩查询,锦州高中成绩排名2021,锦州中考分数线排行榜
  4. 你们是不是对QQ总在后台莫名其妙更新一些东西很反感
  5. 浅入深出Vue:注册
  6. postgreSQL源码分析——索引的建立与使用——总结篇
  7. -webkit-padding-start: 40px;ul的padding-left:40px;问题
  8. MathType编辑器安装(写公式)
  9. Eplan 各版本 软件 百度网盘 永久链接
  10. java 验证码 仿12306_Java仿12306图片验证码
  11. [随文杂记][转]魔兽争霸vs星际争霸vs红色警戒
  12. linux命令之unzip
  13. windows xp 安装python3
  14. 【PHP开发】Mac系统配置MAMP+Thinkphp框架环境 教程(一)
  15. 趣店被骂只是开始,一大批消费金融公司正在走向“危险地带”
  16. maven手工安装依赖包
  17. 流程设计器与表单设计器(Wxd.WF,BPM.Foundation,Wxwinter.WF 升级用)
  18. 【物理应用】基于Matlab模拟极化雷达回波
  19. 李立宗《讲给入门者的深度学习》
  20. case when 最后必须加end

热门文章

  1. selenium+ant+testng测试框架简单介绍
  2. EhCache的配置
  3. C#模拟POST提交表单(一)--WebClient
  4. 断今天日期和指定日期相等和两者的时间差为两年的sql
  5. Linux 调优方案, 修改最大连接数(ulimit命令)
  6. Linux的Apache报错(20014)Internal error: Error retrieving pid file logs/httpd.pid
  7. Bootstrap的role
  8. uglifyjs报错 webpack_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置
  9. Linux服务器下PHPMailer发送邮件报错504
  10. java设计模式adapter_Java设计模式--适配器(Adapter)模式