博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activity栈管理 面试 笔记
阅读量:2123 次
发布时间:2019-04-30

本文共 2459 字,大约阅读时间需要 8 分钟。

面试小结

Activity 任务栈模型

在这里插入图片描述

//#################################分割线 #################################################

ActivityRecord 用来记录一个Activity 的所有信息,

TaskRecord 中包含了一个或多个ActivityRecord,TaskRecord 用来表示Activity的任务栈,用来管理栈中的ActivityRecord

ActivityStack 又包含了一个或多个TaskRecord,它是TaskRecord 的管理者

//#################################分割线 #################################################

Launch Mode

无论哪种启动方式,所启动的Activity都会位于Activity栈的栈顶

standerd : 默认模式,每次启动Activity 都会创建一个新的Activity实例

singleTop: 如果要启动的Activity已经在栈顶,则不会重新创建Activity,同时该Activity的onNewIntent 方法会被调用。如果要启动的Activity不在栈顶,则会重新创建该Activity的实例

singleTask: 如果要启动的Activity 已经存在于它想要归属的栈中,那么不会创建该Activity实例,将栈中位于该Activity上的所有的Activit出栈,同时该Activity的onNewIntent方法会被调用。 如果要启动的Activity不存在于它想要归属的栈中,并且该栈存在,则首先要创建一个新栈,然后创建该Activity实例并压入到新栈中。

singleInstance : 和singleTask基本类似,不同的是启动Activity时,首先要创建一个新栈,然后创建该Activity实例并压入新栈中,新栈中只会存在这一个Activity实例

//#################################分割线 #################################################

Intent的FLAG

在Intent中定义了很多FLAG,其中有几个FLAG也可设定Activity的启动方式,如果Launch Mode 和 FLAG 设定的Activity 的启动方式有冲突,则以FLAG设定的为准

FLAG_ACTIVITY_SINGLE_TOP: 和Launch Mode 中的singleTop 效果一样

FLAG_ACTIVITY_NEW_TASK: 和Launch Mode 中的singleTask 效果一样

FLAG_ACTIVITY_CLEAR_TOP:在Launch Mode 中没有与此对应的模式,如果要启动的activity 已经存在于栈中,则将所有位于它上面的Activity出栈。singleTask 默认具有此标记位的效果

FLAG_ACTIVITY_NO_HISTORY :activity 一旦退出,就不会存在于栈中,同样地,也可以在AndroidManifest.xml中设置android:noHistory

  1. 新活动不会保留在历史栈中,一旦用户切换到其他页面,新活动会马上销毁。 2. 旧活动的onActivityResult()方法永远不会被触发。

FLAG_ACTIVITY_MULTIPLE_TASK :需要和FLAG_ACTIVITY_NEW_TASK 一同使用才有效果,系统会启动一个新的栈来容纳新启动的Activity

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : Activity不会被放入到”最近启动的Activity”列表中

FLAG_ACTIVITY_BROUGHT_TO_FRONT : 本flag一般不由应用代码设置,singleTask模式时系统会给你设置。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY : 本flag一般不由应用代码设置,活动从历史栈中启动(长按home键)时系统会给你设置。

FLAG_ACTIVITY_CLEAR_TASK :需要和 FLAG_ACTIVITY_NEW_TASK 一同使用才有效果,用于清除与启动的Activity相关栈的所有其他Activity

//#################################分割线 #################################################

taskAffinity

我们可以在AndroidManifest.xml 中设置 android: taskAffinity用来指定Activity 希望归属的栈,在默认情况下,同一个应用程序的所有的Activity都有着相同的TaskAffinity.taskAffinity 在下面两种情况时会产生效果

1、taskAffinity与 FLAG_ACTIVITY_NEW_TASK或者singleTask 配合。如果新启动Activity 的taskAffinity 和栈的taskAffinity 相同则加入到该栈中;如果不同,就会创建新栈

2、taskAffinity 与 allowTaskReparenting 配合。如果 allowTaskReparenting 为true,说明Activity 具有转移的能力。

Application的taskAffinity默认值为包名

Activity的taskAffinity默认值为application的taskAffinity值
Task的taskAffinity默认值为根Activity的taskAffinity值

转载地址:http://dwfrf.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-28》19.删除链表的倒数第N个节点
查看>>
Leetcode C++《热题 Hot 100-29》22.括号生成
查看>>
Leetcode C++《热题 Hot 100-40》64.最小路径和
查看>>
Leetcode C++《热题 Hot 100-41》75.颜色分类
查看>>
Leetcode C++《热题 Hot 100-42》78.子集
查看>>
Leetcode C++《热题 Hot 100-43》94.二叉树的中序遍历
查看>>
Leetcode C++ 《第175场周赛-1 》5332.检查整数及其两倍数是否存在
查看>>
Leetcode C++ 《第175场周赛-2 》5333.制造字母异位词的最小步骤数
查看>>
Leetcode C++ 《第175场周赛-3》1348. 推文计数
查看>>
Leetcode C++《热题 Hot 100-44》102.二叉树的层次遍历
查看>>
Leetcode C++《热题 Hot 100-45》338.比特位计数
查看>>
读书摘要系列之《kubernetes权威指南·第四版》第一章:kubernetes入门
查看>>
Leetcode C++《热题 Hot 100-46》739.每日温度
查看>>
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
[Kick Start 2020] Round A 1.Allocation
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>