没有合适的资源?快使用搜索试试~ 我知道了~
Activity,回退栈,Task之间的关系
需积分: 14 2 下载量 6 浏览量
2017-07-14
17:29:02
上传
评论
收藏 145KB DOCX 举报
温馨提示
试读
11页
Activity,回退栈,Task之间的关系
资源推荐
资源详情
资源评论
Activity,回退栈,Task 之间的关系
Activity 启动时 ActivityManagerService 会为其生成对应的 ActivityRecord 记录,并将其加
入到回退栈(back stack)中,另外也会将 ActivityRecord 记录加入到某个 Task 中。请记住,
ActivityRecord,backstack,Task 都是 ActivityManagerService 的对象,由
system_server 进程负责维护,而不是由应用进程维护。
在回退栈里属于同一个 task 的 ActivityRecord 会放在一起,也会形成栈的结构,也就是说
后启动的 Activity 对应的 ActivityRecord 会放在 task 的栈顶。
假设 Activity 的跳转顺序:A-->B-->C,A,B,C 对应的 ActivityRecord 属于同一个 Task,此时
从 C 跳转至 D,再跳转至 E,C 和 D 不属于同一个 Task,D 和 E 属于同一个 Task,那现
在的 back stack 结构如下所示:
现在 A,B,C 属于 task1,C 在 task1 的栈顶,D,E 属于 task2,E 在 task2 的栈顶。也可以看
出来 task2 位于整个回退栈的栈顶,也就是说 task2 在 task1 的上面。如果此时不断按回退
键,看到的 Activity 的顺序会是 E-->D-->C-->B-->A。
另外需注意,ActivityManagerService 不仅会往回退栈里添加新的 ActivityRecord,还会移
动回退栈里的 ActivityRecord,移动时以 task 为单位进行移动,而不会移动单个
AcitivityRecord。还是针对上面的例子,假设此时按了 Home 键,那么会将 Home 应用程
序(也叫做 Launcher 应用程序)的 task 移动至栈顶,那么此时回退栈如下所示:
可以看到 Home 应用程序的 Activity H 对应的 Activity Record 移动到了回退栈的栈顶。
Home 应用程序的 Activity H 对回退按键的响应做了特殊处理,如果此时按回退键,是看不
到 Activity E 的。
如果此时通过 Launcher 程序再打开 Activity A 所在的应用,那么会显示 Activity C,因为会
将 Activity A 对应的 Activity Record 所在的 task 移动至回退栈的栈顶,此时回退栈如下所
示:
现在 task1 移动到了栈顶,Home 应用程序的 task 位于 task1 的下面,而 task2 位于 Home
应用程序的 task 之下,此时如果按返回键,那么 Activity 的显示顺序是:C-->B-->A-->H,
不会显示 E。
当然我们也可以在 Launcher 应用程序里打开 D 所在的应用,这样会将 D,E 所在的 task2 移
动至栈顶。
现在应该对 task 有所理解了,task 其实是由 ActivityRecord 组成的栈,多个 task 以栈的形
式组成了回退栈,ActivityManagerService 移动回退栈里的 ActivityRecord 时以 task 为单
位移动。
我们知道跨应用跳转 Activity 时,两个 Activity 对应的 ActivityRecord 可属于同一个 task,
那什么情况下两个 ActivityRecord 会属于不同的 task 呢?或者说,Activity 跳转时,什么情
况下会产生新的 task 呢?
这个问题和 Activity 的启动模式,taskAffinity,启动 Activity 时为 Intent 设置的 flag 等因素
相关。
先说一下 taskAffinity,每个 Activity 的 taskAffinity 属性值默认为包名,也就是说如果
Activity A 所在的应用的包名为 com.cloud.app1,那么 Activity A 的 taskAffinity 属性值为
com.cloud.app1,我们可以在 AndroidManifest.xml 里通过 android:taskAffinity 属性为
Activity 设置特殊的 taskAffinity,假设我们在 AndroidManifest.xml 里为 Activity A 设置了
android:taskAffinity=”:test”,那么 Activity A 的 taskAffinity 值为 com.cloud.app1:test。
那么我现在可以明白:不同应用的 Activity 的 taskAffinity 属性值会不一样。
如果 B 跟 A 的 affinity 不一样, 但是启动 B 的时候没有添加 NEW_TASK 标记, 则无法在新 task
中启动, 所以才导致了明明 B 跟 A affinity 不一样但是依然在同一个 task 中. 如果 B 同时具备了
'与 A affinity 不一致 且 具有 NEW_TASK 标记', 则 B 才能够在单独的 task 中启动.
假设 Activity A 的启动模式是 standard,Activity B 的启动模式 singleTask,二者
taskAffinity 属性值一样,此时从 Activity A 跳转至 Activity B,那么它们对应的
ActivityRecord 会属于同一个 task。因为只要两个 Activity 的 taskAffinity 属性一致,即使其
中有一个 Activity 的启动模式为 singleTask,它们对应的 ActivityRecord 会放在同一个 task
里,不管是从某个 Activity 跳转到 singleTask 类型的 Activity,还是从 singleTask 类型的
Activity 跳转到其他 Activity 都是如此,除非跳转的其他 Activity 的启动模式是
singleInstance。这里的描述和官方文档很不一样,稍后会为大家介绍 singleTask 启动模
式的特点。
假设 Activity A 的启动模式是 standard,Activity B 的启动模式 singleTask,二者
taskAffinity 属性值不 一样,此时从 Activity A 跳转至 Activity B,那么它们对应的
ActivityRecord 会属于不同的 Task。
还有其他很多情况会产生新的 task,大家可以看接下来关于启动模式的特点的介绍。
Application,Activity, Process,Thread
之间的关系
我们知道在 AndroidManifest.xml 里可声明 Application,它可以由 4 大组件组
成:Activity,Service,ContentProvider,BroadcastReceiver。声明 Application 时可以用
android:name 声明本应用使用的 Application 类,如果没有声明,则会直接使用 Android 框
架的 Application 类建立实例对象。
剩余10页未读,继续阅读
资源评论
vincenthu123
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功