ZNDS智能电视网 推荐当贝市场

TV应用下载 / 资源分享区

软件下载 | 游戏 | 讨论 | 电视计算器

综合交流 / 评测 / 活动区

交流区 | 测硬件 | 网站活动 | Z币中心

新手入门 / 进阶 / 社区互助

新手 | 你问我答 | 免费刷机救砖 | ROM固件

查看: 11927|回复: 0
上一主题 下一主题
[教程]

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-8-28 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
>
向前面说的那样,一个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>里的元素影响着,无论是请求者还是回应者都有一定决定权。
   
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
   
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
   
接下来会介绍这些标记和属性的作用,之间的相互影响,和使用它们时的应考虑到的问题。
   
   
(这段很别扭)
默认情况下,一个程序里的各个activity之间都有联系,他们共属于同一个任务task,然而,通过taskAffinity的<activity>属性可以给每个activity设置个人的Affinities 。定义在不同应用程序里的activity可以共享自己的affinities,定义在相同的程序里的activity也可以声明不同的affinities。affinity 在两种情况下起作用:一种是当通过Intent启动的activity中包含有FLAG_ACTIVITY_NEW_TASK标记时,一种是activity的allowTaskReparenting属性被设置成true时。
   
如前所述,被其他activity通过startActivity()方法启动的activity,他和启动他的前一个activity属于同一个堆栈。然而,如果传递的Intent对象中被设置了FLAG_ACTIVITY_NEW_TASK标记,那么系统会在一个新的任务里启动activity。通常,启动的activity就像名字那样,是一个新的任务。然后,那不是必须的,如果已经存在了和要启动的activity相同affinity的任务,已存在的任务会被运行,如果不存在才会重启一个新的任务。
   
如果一个activity的allowTaskReparenting 属性为true,那么这个activity可以从启动他的任务里移动到和他拥有相同affinity的activity所在的任务里,如果那个后者的activity正在顶端运行时。例如,假设一个activity(一个旅行程序的一部分)报告所选城市的天气情况。这个天气activity和程序里的其他的activity拥有相同的affinity,并且天气activity的allowTaskReparenting属性为true,如果程序的其中一个activity启动天气报告的话,那么这个天气报告部分将会属于你的activity。然而,当旅行的程序接下去运行时,报告天气这部分会在另一个任务里显示和运行。
   
如果一个apk包含多个应用程序,你最好分配不同的affinity给activity。
   
   
   
// TODO
Launch modes 运行模式
Clearing the stack 清理堆栈
Starting tasks 启动任务
   
   
   
   
   
   
   
   

上一篇:专家专栏:AndroidManifest.xml文件详解
下一篇:Android基础教程(七)之----单选项框RadioGroup的综合应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|新帖|标签|软件|Sitemap|ZNDS智能电视网 ( 苏ICP备2023012627号 )

站长统计

网络信息服务信用承诺书 | 增值电信业务经营许可证:苏B2-20221768 丨 苏公网安备 32011402011373号

GMT+8, 2025-5-22 22:07 , Processed in 0.144334 second(s), 15 queries , Redis On.

Powered by Discuz!

监督举报:report#znds.com (请将#替换为@)

© 2007-2025 ZNDS.Com

快速回复 返回顶部 返回列表