读书人

原创android文档翻译(三):Activity和

发布时间: 2012-09-05 15:19:35 作者: rapoo

原创android文档翻译(3):Activity和任务

Activity和任务?? ??
?? ? 就像前面提到的,一个activity可以启动另一个,包括那些定义在不同应用程序中的。假设,例如,你想让用户显示一些地方的街道地图。已经有一个activity可以做这个事,所以你的activity所要做的就是将行为对象和需要的信息放在一起,并将它们传递给startActivity()。地图查看器将显示这个地图。当用户按下后退按钮时,你的activity又重新显示在屏幕上了。?? ?对用户来说,这个地图查看器看起来就像是你的应用程序的一部分,即使它定义在另外的应用程序中并运行在那个程序的进程中。Android通过保持所有的activity在同一个任务中来保持用户体验。简单的的说,任务就是用户所体验到的“应用程序”。它是一组相关的activity,分配到一个栈中。栈中的根activity,是任务的开始——一般来说,它是用户组应用程序加载器中选择的activity。在栈顶的activity正是当前正在运行的——集中处理用户动作的那个。当一个activity启动了另外一个,这个新的activity将压入栈中,它将成为正在运行中的activity。前一个activity保留在栈中。当用户按下后退按键,当前的这个activity将中栈中弹出,而前面的那个activity恢复成运行中状态。?? ? 栈包含了对象,如果一个栈有多于一个相同的Activity的子类的实例打开——比如,多个地图查看器——这个栈分别拥有每个实例的入口。栈中的activity不能重新排列,只能压入和弹出。?? ?任务是一些activity组成的栈,不是清单文件中的类或元素。所以没有办法在独立于它包含的activity的条件下,设置它的值。任务的值作为一个整体设置在根activity中。例如,下一节将讨论“任务的亲和性”;这个值是从根activity亲和性中读取出来的。
?? ?一个任务中的所有activity一起作为一个单元。整个任务(整个activity栈)可以移动到前台或者后台.假设,例如,当前的任务有四个activity在栈中——三个在当前的activity之下。用户按下了HOME键,进入了应用程序加载器,选择了一个新的程序(实际上,是一个新的任务)。当前的任务进入了后台,新任务的根activity显示出来。然后,过了一会,用户退回到主界面,又重新选择了前一个应用程序(前一个任务),栈中有四个activity的那个任务,现在出现在了前台。当用户按下BACK按键,屏幕就不会再显示用户刚刚离开的那个activity,而是删除栈顶的activity,同任务中的前一个activity将被显示出来。
?? ? 刚才说明的那些行为,是activity和任务的默认行为。但是有也办法修改它的所有方面。activity和任务的关联,activity在任务中的行为,受控于启动activity的行为对象的标志位和清单文件中的<activity>元素的属性的互相作用。请求者和相应着都要说明发生了什么。
?? 在这里,主要的行为标志为是:

FLAG_ACTIVITY_NEW_TASK?
FLAG_ACTIVITY_CLEAR_TOP?
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED?
FLAG_ACTIVITY_SINGLE_TOP

?? ? ? 主要的<activity> 属性是:
taskAffinity?
launchMode?
allowTaskReparenting?
clearTaskOnLaunch?
alwaysRetainTaskState?
finishOnTaskLaunch

?? ? ? 下面一节将说明这些标志和属性都有什么用,他们之间怎么互相影响,应该用什么样的方案来控制它们的使用。
亲和性和新任务
?? ??? 默认情况下,应用程序中的所有activity,都有一个对于其它activity的亲和性—这是一个对于同一个任务中的其他activity的优先权,然后,通过?<activity>元素的taskAffinity 属性可以可以分别为每一个activity设置亲和性。不同应用程序定义的activity可以共享同一个亲和性,或者同一个应用程序定义的activity可以指定不同的亲和性。亲和性在两种情况下发挥作用:当行为对象启动了一个包含 FLAG_ACTIVITY_NEW_TASK标志的activity,和当一个activity的allowTaskReparenting 属性设置为“true”。
?FLAG_ACTIVITY_NEW_TASK?标志?? ??? ?
?? ??? ?正如前面描述的,一个新的activity,默认情况下,被加载进调用startActivity()方法的activity对象所在的那个任务中。它被压入和调用者所在的同一个栈中,但是,如果行为对象在调用startActivity()方法时传递了FLAG_ACTIVITY_NEW_TASK标记,系统将用一个不同的任务来容纳这个新的activity。通常,就像这个标记的名字所代表的。它是一个新任务,但是,它不必非要这样。如果已经存在一个和这个activity亲和性相同的任务,这个activity就会载入到那个任务中,如果不是的话,才会启动新任务。
allowTaskReparenting?属性
?? ??? ?如果activity的allowTaskReparenting 属性设置为“true”,它就能从他启动时所在的任务移动到另一个出现在前台的任务。例如,假设有一个activity可以根据选择的城市包括天气情况,它作为一个旅行应用程序的一部分。它和同一个应用程序中的其他activity有同样的亲和性(默认的亲和性)并且允许重组。你的一个activity开启了天气报告器,所以它属于同一个任务中的这个activity,然而,当旅行应用程序开始运行时,天气报告器将被重新分配并显示到那个任务中。

启动模式
?? ??? 有4中不同的启动模式可以分配给<activity>元素的?launchMode?属性。
"standard" (默认的模式)?
"singleTop"?
"singleTask"?
"singleInstance"

?? ? ? ?这些模式主要区别在以下四点:

读书人网 >Android

热点推荐