分享

《Android Dev Guide》系列教程4:应用基础之Activities 和任务

 lifei_szdz 2012-12-26

《Android Dev Guide》系列教程4:应用基础之Activities 和任务

分类: Android Application 760人阅读 评论(3) 收藏 举报

《Android Dev Guide》系列教程4:应用基础之Activities 和任务

懒骨头(http://blog./iamlazybone

 

向前面说的那样,一个activity可以启动另一个activity,包括在其他应用程序里定义的activity。假如你想让用户显示一些街道地图的位置信息,已经存在这样一个功能的activity了,所以你只需填好Intent信息并曾通过startActivity()方法传递Intent,地图浏览器就会显示地图。当用户按Back键时,会回到原来的activity。

 

对于用户来说,地图浏览器就像你程序的一部分一样,尽管他是在另一个应用程序里定义并且运行的。Android为了良好的用户体验而让两个activity运行在同一个任务里。简单地说,用户认为一个task就是一个“应用程序”。应用程序是一组相关的activity,排列在一个堆栈里。通常,堆栈里的主activity会启动用户在启动器里选择的那个activity。栈顶的activity就是当前运行的,得到用户焦点的。当启动了另一个activity,新的activity就会到栈顶,然后运行。上一个activity仍然留在栈里。当用户按返回Back键时,当前activity就被弹出栈,上一个activity继续运行。

 

栈里保存着很多的对象。如果一个任务有很多个activity实例例如多个地图浏览器,那么栈会给每一个实例分配单独的入口,栈里的activity实例永远不会重新分配,只会被弹进,弹出。

 

一个任务是整个activity的堆栈,不是指一个类或者manifest文件中的一个元素。所以不可能单独的设置栈里的某一个activity的值。事实上软任务的值是主activity里设定的。例如我们以后会提到的“任务的affinity”。从affinity读取的值可以设置到任务的主activity中。

任务里的所有activity被看做一个整体。这个整理可以被拿到前台或者放在后台运行。假设当前任务有四个activity,一个正在运行的和三个在堆栈里的。用户按下HOME键后,会转到程序触发器里,让用户选择一个新的应用程序,实际上是一个新的任务。当前任务转到后台,新任务的主activity开始运行。一段时间后,用户又回到HOME屏,选择启动刚才隐藏的任务,隐藏的任务中四个activity都会转到前台。当用户按下BACK键时,屏幕不会显示刚刚离开的activity(上一个任务的主activity),而会显示当前任务中,当前栈中的上一个activity。(即不会在任务间返回只会在activity间返回)。

 

上面只是说了activity和任务的默认的行为,其实可以修改他们几乎所有的方面。activity和任务的联系、任务里activity的行为、被Intent对象的标记和<activity>里的元素影响着,无论是请求者还是回应者都有一定决定权。

 

主要的Intent标记如下:

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

 

接下来会介绍这些标记和属性的作用,之间的相互影响,和使用它们时的应考虑到的问题。

 

 

Affinities (亲和力) and new tasks Affinities 和新任务

(这段很别扭)

默认情况下,一个程序里的各个activity之间都有联系,他们共属于同一个任务task,然而,通过taskAffinity的<activity>属性可以给每个activity设置个人的Affinities 。定义在不同应用程序里的activity可以共享自己的affinities,定义在相同的程序里的activity也可以声明不同的affinities。affinity 在两种情况下起作用:一种是当通过Intent启动的activity中包含有FLAG_ACTIVITY_NEW_TASK标记时,一种是activity的allowTaskReparenting属性被设置成true时。

 

FLAG_ACTIVITY_NEW_TASK 标记

如前所述,被其他activity通过startActivity()方法启动的activity,他和启动他的前一个activity属于同一个堆栈。然而,如果传递的Intent对象中被设置了FLAG_ACTIVITY_NEW_TASK标记,那么系统会在一个新的任务里启动activity。通常,启动的activity就像名字那样,是一个新的任务。然后,那不是必须的,如果已经存在了和要启动的activity相同affinity的任务,已存在的任务会被运行,如果不存在才会重启一个新的任务。

 

allowTaskReparenting 属性

如果一个activity的allowTaskReparenting 属性为true,那么这个activity可以从启动他的任务里移动到和他拥有相同affinity的activity所在的任务里,如果那个后者的activity正在顶端运行时。例如,假设一个activity(一个旅行程序的一部分)报告所选城市的天气情况。这个天气activity和程序里的其他的activity拥有相同的affinity,并且天气activity的allowTaskReparenting属性为true,如果程序的其中一个activity启动天气报告的话,那么这个天气报告部分将会属于你的activity。然而,当旅行的程序接下去运行时,报告天气这部分会在另一个任务里显示和运行。

 

如果一个apk包含多个应用程序,你最好分配不同的affinity给activity。

 

 

Launch modes

 

// TODO

Launch modes 运行模式

Clearing the stack 清理堆栈

Starting tasks 启动任务

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多