本文摘要
|---Saving Activity State
|---Managing Tasks
|---Defining launch modes
|---Handling affinities
|---Clearing the back stack
|---Starting a task
应用程序(也就是我们日常接触到的“App”)中往往包含着很多activity。每个activity都应该围绕着某种具体功能来设计,用户不仅可以使用该功能,而且可以通过这个activity去开启其他activity。比如,邮件App中有一个activity是专门用来展示未读邮件列表的,当用户选中其中一封邮件时,一个新的activity就会被开启用以阅读这封邮件。
一个应用程序中的activity可以开启另一个应用程序中的activity。当然了,前提是这两个应用程序同在一台设备上。举个例子,如果我们的应用程序需要发送一封邮件,那么我们可以定义一个intent来调用其它应用程序中的activity帮我们实现发送的功能。另外,如果有需要,还可以用这个intent携带一些数据,如收件人地址和要发送的消息内容等。这条intent发出后,另一个应用程序中声明自己可以处理此类intent的activity就会被开启。在我们这个例子中,我们定义的这条intent想要做的是发送一封邮件,所以邮箱App中负责撰写邮件的activity开启了(如果同一设备上存在多个activity支持同一类型的intent,那么系统会提示用户从中选择一个)。当邮件发送完毕,邮箱App中负责撰写邮件的activity就会关闭,然后我们的activity会重新展现在屏幕上。尽管负责发送邮件的activity来自另一个应用程序,但给人的感觉好像它就是我们的应用程序的一部分。这两个并不存在于相同应用程序中的activity之所以能够流畅的调用,就是因为在安卓将它们放置在同一个任务栈中。
任务栈就是用户在完成某一事情时要与之交互的一系列activity的集合。这些activity被有序地放置在回收栈中,排列的顺序就是其被打开的先后顺序——先打开者置于栈底,后打开者依次向上罗列。不理解?没关系,请看下面这张图:
【小贴士】平时摆弄手机App时,相信你有此体会:通常情况下,开了几个页面(activity)之后,点击手机上的返回键,就可以逐层后退。就比如上图中的例子,当我们操作到3号activity时,按一下返回键就可以退到2号activity界面,再按一下返回键,1号activity就又出现在屏幕上了,如果再按返回键,就退回到手机桌面了。其实这就是因为任务栈在帮我们保留所有操作过的activity,而且是按照我们操作的顺序保留的。最主要的是,任务栈帮我们保留了每一个操作过的activity的状态,比如屏幕滚动的位置、我们在可以编辑文本的地方输入的内容等等,这使得我们返回到操作过的页面时,看到页面还是我们刚刚操作时的样子。其实我们也可以通过一些方法让activity在开启时不被放置入任务栈(后面会有介绍),如果一个activity在开启时没有被放入任务栈,那么用户在按下后退按钮或者点击返回按键时,就永远不会再返回到这个activity页面了哦。
通常,设备的Home屏是任务栈开始的地方。因为当用户在Home屏上点击某个应