Activity栈管理 面试 笔记

面试小结

            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值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值