参考: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的关系

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

第二篇Activity:2、任务和返回堆栈(Tasks and Back Stack)之基本介绍的更多相关文章

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

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

  2. 第二个Activity返回数据

    背景内容:FirstActivity先跳转到TwoActivity,再由TwoActivity返回,并还返回数据. 一般情况下Activity间跳转只需要调用 startActivity(Intent ...

  3. flask第二篇 三剑客+特殊返回值

    1.Flask中的HTTPResponse 在Flask 中的HttpResponse 在我们看来其实就是直接返回字符串 2.Flask中的Redirect 每当访问"/redi" ...

  4. 第二篇 界面开发 (Android学习笔记)

    第二篇 界面开发 第5章 探索界面UI元素 ●The Android View Class     ●△Widget设计步骤 需要修改三个XML,以及一个class: 1)第一个xml是布局XML文件 ...

  5. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  6. [android开发篇]activity组件篇

    https://developer.android.com/guide/components/activities.html Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打 ...

  7. 深入理解javascript对象系列第二篇——属性操作

    × 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...

  8. [转]Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...

  9. 【OpenGL】第二篇 Hello OpenGL

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. 云计算被视为继大型计算机、个人计算机、互联网之后的第4次IT产业革命,顺应了当前各行业整合计算资源和服务能力的要求(转)

    云计算被视为继大型计算机.个人计算机.互联网之后的第4次IT产业革命,顺应了当前各行业整合计算资源和服务能力的要求,成为引领当今世界信息技术变革的主力军.越来越多的金融企业认识到只有与云计算结合,才能 ...

  2. 第二代map-reduce架构YARN解析

    需求 我们在考虑hadoop map-reduce框架的时候,最重要需包括: 1. reliability 可靠性,主要是jobtracker,resource manager可靠性 2. avail ...

  3. 函数指针&绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  4. android Activity之间数据传递 Parcelable和Serializable接口的使用

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解 ...

  5. kettle 数据迁移 (转)

    最近在公司搞一个项目重构迁移问题,旧项目一直在线上跑,重构的项目则还没上线.重构之后数据库表结构,字段,类型等都有变化,而且重构的数据库由oracl改为mysql.这样就设计到数据迁移问题,别人推荐下 ...

  6. Maven坐标 groupId artifactId version packaging classifier name

    groupId定义项目属于哪个组,这个组往往和项目所在的组织或公司存在关联.譬如在googlecode上建立一个名为myapp的项目,那么groupId就应该是com.googlecode.myapp ...

  7. IOS详解TableView——对话聊天布局的实现

    上篇博客介绍了如何使用UITableView实现类似QQ的好友界面布局.这篇讲述如何利用自定义单元格来实现聊天界面的布局. 借助单元格实现聊天布局难度不大,主要要解决的问题有两个: 1.自己和其他人说 ...

  8. GDI 总结三: CImage类使用

    前言          CImage类是基于GDI+的.可是这里为什么要讲归于GDI? 主要是基于这种考虑: 在GDI+环境中,我们能够直接使用GDI+ ,没多少必要再使用CImage类 可是,假设再 ...

  9. 译文:前端性能的重要性 The Importance of Frontend Performance

    欢迎訪问我的主页.最新的文章我会首先公布在个人主页上: http://blog.guaidm.com/shocky/ 原书下载地址:http://pan.baidu.com/s/1pJocRwB 在我 ...

  10. Java 实现观察者(Observer)模式

    1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...