参考: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的关系
用一张简单的图表示如下:
分享到:
相关推荐
Android学习笔记-Activity篇 Contents Android学习笔记-Activity篇 1 ...Tasks and Back Stack 4 一、管理Task 4 1.1 定义launch模式 4 1.2 设置affinities 5 1.3 清空the back stack 5 1.4 开始task 5
Bluetooth Profile
堆栈任务Stack Tasks是一个任务管理器,可以根据优先级对任务进行添加和分类。
mundane, repetitive tasks. We’ll also investigate JSHint, a linting tool used to improve code quality. Along the way, we’ll also be developing an example human resources ...
We study the scheduling decision for an application consisting of dependent tasks, in a generic cloud computing system comprising a network of heterogeneous local processors and a remote cloud server.
这是关于大规模学习任务算法的电子书,高清,最新版本,经典著作,英文版
CapistranoDb任务| 将数据库和资产任务添加到Capistrano到Rails项目。 它仅适用于capistrano3。0.3之前的较早版本适用于capistrano 2。 现在它仅支持mysql和postgresql(远程和本地) 将资产远程同步到本地,将本地...
c路线: Intersection C to Tollages 1 & 3.提交文件如表1任务1评价标准 Mean Absolute Percentage Er
多任务多线程管理模块,任务有优先级,一个任务执行完毕,按照优先级高低执行另一个任务 1)如何使用: 1. 声明一个HashTaskList,或在栈上动态获取; 2. 调用InitTaskList初始化上一步的HashTaskList 3. 调用...
A.1 Mapping of ISO/IEC 15288 V&V requirements to IEEE 1012 V&V activities and tasks 156 A.2 Mapping of IEEE 1012 V&V activities to ISO/IEC 15288 system life cycle processes and activities 158 A.3 ...
mern-stack-tasks:使用MERN执行任务
使用Aspose.Tasks你可以阅读和改变任务,重现任务,资源,资源分配,关系和日历。Aspose.Tasks是一个提供稳定性和灵活性的非常成熟的产品。正如所有的Aspose.Tasks文件管理组件,Aspose.Tasks在WinForm和WebForm应用...
nopCommerce程序中计划任务(ScheduleTasks) 原理是:被.Net(Core)内置管道中间件所调用,以保证在程序开始启动执行时,实例化当前程序中的所有计划任务实例,并为这些任务实例构建相应的线程实例;并保证在程序其后...
自定义计划任务管理工具 自己定义定时启动的计划任务 暂时只兼容winxp 2003 win7以后的系统是不兼容的
Chapter 1. Becoming an Excel Programmer Section 1.1. Why Program? Section 1.2. Record and Read Code Section 1.3. Change Recorded Code Section 1.4. Fix Misteakes Section 1.5. Start and Stop ...
Of all the tasks programmers are asked to perform, storing, compressing, and retrieving information are some of the most challenging--and critical to many applications. Managing Gigabytes: Compressing...
oauth-mapper.zip,OAuth-Mapper_2.5mapper支持OAuth提升模块。
AspNetBackgroundTasks, 将"fire and forget" 任务注册到 ASP.NET 运行时的组件 重要说明介绍了 .NET 框架 4.5.2 HostingEnvironment.QueueBackgroundWorkItem ,与这里库非常相似。 请考虑升级到 4.5.2并使用 ...
一般定时任务配置都需要相互的依赖,代码量多也不简洁,也得有任务管理器管理,此版本的定时任务本着简洁而去配置只需两步 一,任务列表(多个定时任务可在task:scheduled-tasks中写多个task:scheduled-task) ...
使用 Aspose.Tasks 你可以阅读和改变任务,重现任务,资源,资源分配,关系和日历。 Aspose.Tasks 是一个提供稳定性和灵活性的非常成熟的产品。正如所有的 Aspose.Tasks 文件管理组件, Aspose.Tasks 在 WinForm 和...