《Android 开发入门与实战(第二版)》——6.5节Task、栈以及加载模式

6.5 Task、栈以及加载模式
Android 开发入门与实战(第二版)
在Android应用程序中,应用程序中的Activity是可以启动其他程序的Activity的,例如,你在A程序中单击了某一串链接地址,应用会自动调用系统的浏览器帮你打开这个链接(如果你的系统中存在多个浏览器,则会打开多个并让你选择其中一个),虽然A程序和浏览器不属于同一个应用,但是你单击“回退”按钮后,依然可以回退到A程序中。像这种无缝的用户体验,主要得益于Android中的Task。

那什么是Task呢?通俗来讲,Task就是一组与用户交互并执行特定工作的Activity的集合。它们都根据被启动的顺序排列在栈中(我们可以称这个栈为“回退栈[back stack]”)。比如我们先启动了A程序,依次调用了A、B、C 3个Activity,之后又通过C Activity启动了B程序的D Activity,最后又通过D Activity回到了A 程序并依次退出结束,那么我们可以将由A B C D Activity实例组成的集合称为一个Task,而这些Activity的实例都会根据被启动的顺序存放在栈中(所以,我们讲的A、B、C、D实例组成的集合,不一定只有4个Activity实例,这主要依赖每个Activity的启动模式,后续我们会讲到)。

当用户在应用程序界面(Home界面)单击一个图标(或者Home界面的快捷方式)时,这个应用程序的Task就会启动,如果不存在这个程序的Task(即这个应用程序最近没有被用过),则会创建一个新的Task,并且该程序的“main”Activity会作为栈的根Activity存在。

当当前的Activity启动另一个Activity,新的Activity就会被压入栈的顶部并且得到焦点。上一个Activity仍然存在栈中,但是它停止活动了。当一个Activity停止,系统仍然会保存它的用户界面的当前状态。当用户单击“回退”按钮时,当前Activity就会从栈的顶部被弹出并且被销毁。而之前的Activity将会被恢复(之前的UI状态都将修复)。栈中的Activity是不会进行重新排序的,仅仅只是压入或者弹出栈(被当前Activity启动则压入栈,用户单击“回退”按钮离开则弹出)。栈的管理方法是典型的“后进先出”。具体如图6-2所示。

比如我们首先启动了Activity1,这时栈中就只存在Activity1一个实例,当使用Activity1启动Activity2时,Activity1就被压在了栈下面,Activity2则被压到了栈的顶部,当我们使用Activity2再启动Activity3时,Activity2又被压了下去,Activity3则处于栈的顶部。这个时候整个栈中就有了Activity1,Activity2,Activity3三个实例了,并且Activity3处于最顶部,也是获得焦点的Activity。如果我们这个时候按一下“回退”按钮,系统则会将栈最顶部的Activity(即Activity3)弹出并销毁,这个时候Activity2又处于了栈的顶部,并获得了焦点,整个栈里就只有Activity2和Activity1了。

当用户不停地单击“回退”按钮,则在栈中的每一个Activity都会被弹出并恢复前一个,直到用户最后返回到了Home界面,当stack中的所有Activity不再存在了。该Task也就不再存在了。

其实大多数情况下,我们是没必要去关心Activity与Task是如何关联,怎样存在于“回退栈”中的。然而,如果你想不使用Activity的默认行为,比如你希望你的应用程序在启动一个Activity时创建一个新的Task,而不是直接放入当前的Task中,或者当你启动一个Activity,你希望将已经存在在栈中的Activity带到栈的顶部,而不是在栈中创建一个新的,或者你想当用户离开Task的时候,清除栈中的所有Activity,除了根Activity。

注意

大多数的应用我们不应该打断Activity和Task的默认行为,如果你确定需要为你的Activity修改默认的行为,请谨慎,并多测试可能产生的与用户预期相冲突的行为。
为了达到打断默认行为的效果,我们可以自己定义启动模式(launch Mode),这里有两种方法。

一是使用manifest文件。在manifest文件中通过指定Activity的launchMode属性来定义。launchMode属性支持四种不同的值(即四种不同的启动模式)。

1.standard模式
这是默认的模式,系统会在Task中创建新的Activity实例,并且这个Activity能被实例化多次,每个实例都能属于不同的Task,一个Task也能拥有多个实例。

2.singleTop模式
在这个模式下,如果一个Activity实例已经存在于当前Task的顶部,系统会通过调用它的onNewIntent方法发送intent请求调用已经存在于顶部的Activity实例,而不是创建一个新的Activity实例。Activity可以被实例化多次,每个实例也能属于不同的Task,一个Task也能有多个实例(但是只有当回退栈的顶部不是这个Activity已经存在的实例)。

例如,假设Task的回退栈已经存在根ActivityA,以及ActivityB、C、D(D在栈的顶部),当intent接收到类型D的Activity时,如果D是默认的standard模式,则会创建一个新的ActivityD,栈里的实例就变成了A、B、C、D、D。然而,如果D是singleTop模式,栈中已经存在的ActivityD就会通过onNewIntent方法接受到Intent请求,(因为D在栈的顶部),这个时候栈中仍然是A,B,C,D。然而,如果Intent接受到的Activity类型为B,则还是会创建一个新的B实例到栈中,即使它的加载模式是“singleTop”。

3.singleTask模式
系统会创建一个新的Task并将Activity作为新Task的根(root)实例化。然而,如果Activity的实例已经存在于一个其他的Task中,系统会通过onNewIntent方法发送Intent请求到已经存在的实例,而不是创建一个新的实例。在同一时间,Activity的实例只能有一个。

注意

即使Activity启动了一个新的Task,当我们单击回退按钮时,还是会回到前一个Activity。
4.singleInstance模式
跟singleTask效果一样,不同的是,系统不会加载其他的Activity到包含了这个实例的Task中,Activity实例只有一个并且它是Task的唯一成员。之后被该Activity启动的其他Activity都会在不同的Task中启动。

举个例子,Android的浏览器程序通过指定Activity的singleTask模式声明它的Activity总是在它自己的Task中打开,这也意味着如果你的程序发送Intent去打开浏览器,浏览器的Activity和你程序的Activity不在同一个Task中,而是为浏览器创建一个新的Task,如果浏览器已经有一个Task运行在后台,那么它会被带到前台来处理这个新的Intent。

另外一种打断默认行为效果的方式则是通过Intent中的flag。

在使用Intent方式时,我们可以通过设置Intent的值为FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_SINGLE_TOP以及FLAG_ACTIVITY_CLEAR_TOP来达到我们需要的效果。

FLAG_ACTIVITY_NEW_TASK:它的效果和前面提到的singleTask启动模式的效果是一致的。

FLAG_ACTIVITY_SINGLE_TOP:它的效果和前面提到的singleTop启动模式的效果一致。

FLAG_ACTIVITY_CLEAR_TOP:如果要启动的Activity已经运行在当前Task中,那么不会再创建该Activity的新实例,而是所有在这个Activity实例上面的Activity都会被销毁,并通过onNewIntent方法启动该Activity(此时,该Activity已经处于栈的顶部)。之前提到的配置launchMode的方式,没有一个属性的效果跟此值的效果一致。

时间: 2024-08-03 20:34:25

《Android 开发入门与实战(第二版)》——6.5节Task、栈以及加载模式的相关文章

《Android 开发入门与实战(第二版)》——6.9节Activity小实例

6.9 Activity小实例 Android 开发入门与实战(第二版) 在介绍完Activity相关基础内容后,现在我们来针对Activity开发一个简单的小实例. 这个实例指定了3个界面(Activity).HelloWorldActivity界面有两个按钮,Button 1和Button 2(见图6-3),Button 1单击后会跳转到Activity B,而Activity B简单地显示"This is Activity B,Welcome!"(见图6-4).单击Button

《Android 开发入门与实战(第二版)》——6.1节什么是Activity

6.1 什么是Activity Android 开发入门与实战(第二版) Activity是Android四大组件之一,也是Android中最基本的模块之一.在官网中是这样介绍Activity的. 几乎所有的的Activity都是用来与用户交互的,因此Activity主要关注于视图窗体的创建(你可以通过setContentView(View)方法来放置你的UI),而且Activity对于用户来说通常都表现为全屏的窗体,当然,它们也能以其他的方式呈现,比如浮动窗体. 通俗一点来讲,我们可以把手机比

《Android 开发入门与实战(第二版)》——6.6节配置改变

6.6 配置改变Android 开发入门与实战(第二版)如果设备的配置改变了(定义在Resource.Configuration类中),任何显示在界面上的东西都需要更新以适应配置.由于Activity是与用户交互的主要机制,所以它也包括一些处理配置改变的特殊支持. 除非你指定了,否则配置改变(比如改变屏幕方向,语言,输入设备等)会导致你当前的Activity会销毁,并调用相应的Activity生命周期进程函数onPause(),onStop()以及onDestroy().如果这个Activity

《Android 开发入门与实战(第二版)》——6.4节Activity拥有四个基本的状态

6.4 Activity拥有四个基本的状态Android 开发入门与实战(第二版)活动中:如果Activity在屏幕前(即在栈的最顶部),它是可视的,可接受用户输入的. 暂停:如果Activity已经失去了焦点,但是仍然可见(即,一个非全屏或者透明的Activity在你的Activity的上方拥有焦点),它的状态是暂停.一个暂停状态下的Activity是完全活着的(它保留了所有状态和成员信息并仍然附加到视图管理器),但在系统极端低内存的情况下可以被杀死. 停止:如果一个Activity完全被另一

《Android 开发入门与实战(第二版)》——6.3节Activity的监控范围内的三个主要循环

6.3 Activity的监控范围内的三个主要循环Android 开发入门与实战(第二版)Activity的"整个生命周期"是发生在第一次调用onCreate(Bundle)和唯一最后调用onDestroy()方法之间.一个Activity会在onCreate()方法中设置全局状态,并在onDestrory()方法中释放余下的资源.例如:Activity有一个运行在后台的线程用来从网络上下载数据,则这个线程可能在onCreate()方法中被创建,并在onDestroy()方法停止线程.

《Android 开发入门与实战(第二版)》——6.8节启动Activity并得到结果

6.8 启动Activity并得到结果Android 开发入门与实战(第二版)在Activity中,你可以调用startActivity(Intent)方法被用来启动一个新的Activity,并将这个新的Activity置于Activity栈的最顶部.但是有时候,你却可能希望当一个Activity结束时从这个被结束的Activity中得到一个返回结果,例如,你可能启动了一个Activity让用户在联系人名单上选择一个人,当这个Activity结束时,它返回这个被选中的人给你.为了做到这个,你可以

《Android 开发入门与实战(第二版)》——6.10节本章小结

6.10 本章小结Android 开发入门与实战(第二版)本章主要对Android中最重要的组件之一Activity进行了基本的讲解.在本章的最开始就已经说明了Activity对整个应用程序的重要性,所以学好Activity可以说是开发Android应用程序必备基础技能之一,尤其是对Activity的生命周期以及基本状态的了解,掌握了这些,在开发应用时,你就能游刃有余地把握每个Activity不同时期的不同状态,从而做出最合理的操作.最后又补充了一个Activity的小实例,希望大家能跟着本书动

《Android 开发入门与实战(第二版)》——导读

目 录 第1章 掀起你的盖头来--Android开发扫盲 第2章 工欲善其事必先利其器--搭建环境Android 第3章 清点可用的资本--Android SDK介绍 第4章 千里之行始于足下--Hello EoE 第5章 良好的学习开端--Android应用程序架构分析 第6章 Android的核心--Activity 6.1 什么是Activity 6.2 Activity的生命周期6.3 Activity的监控范围内的三个主要循环 6.4 Activity拥有四个基本的状态6.5 Task

032_《Delphi下用Intraweb开发WEB程序应用实战(第二版)》

<Delphi下用Intraweb开发WEB程序应用实战第二版> Delphi 教程 系列书籍 (032) <Delphi下用Intraweb开发WEB程序应用实战第二版> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 作 者:高勇 内容简介 IntraWeb是Delphi自带的一套Web开发框架,它由Atozed Software公司(http://www.atozedsoftware.com)在2002年制作,并完美的植入Delphi7中.I