面试小结
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
- 新活动不会保留在历史栈中,一旦用户切换到其他页面,新活动会马上销毁。 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值