l FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
l FLAG_ACTIVITY_SINGLE_TOP
主要的属性有:
l taskAffinity
l launchMode
l allowTaskReparenting
l clearTaskOnLaunch
l alwaysRetainTaskState
l finishOnTaskLaunch
默认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属于同一个task。然而,每个activity可以通过中的taskAffinity属性设置单独的affinity。不同应用程序中的activity可以共享同一个affinity,同一个应用程序中的不同activity也可以设置成不同的affinity。affinity属性在2种情况下起作用:当启动activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记,或当activity的allowTaskReparenting被设置成true。
l FLAG_ACTIVITY_NEW_TASK标记
当传递给startActivity()的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity寻找与当前activity不同的task。如果要启动的activity的affinity属性与当前所有的task的affinity属性都不相同,系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;否则将activity压入那个affinity属性相同的栈中。
l allowTaskReparenting属性
如果一个activity的allowTaskReparenting属性为true,那么它可以从一个task(TASK1)移到另外一个有相同affinity的task(TASK2)中(TASK2带到前台时)。
如果一个.apk文件从用户角度来看包含了多个“应用程序”,你可能需要对那些activity赋不同的affinity值。
2、运行模式
activity的launchMode属性可以有四种值:
l “standard” (默认)
l “singleTop“
l “singleTask“
l “singleInstance“
这4种模式可以按4种分类来区分,以下假设位于task1中的activity1启动activity2:
模式\分类 | 包容activity2的task | 一个activity是否允许有多个实例 | activity是否允许有其它activity共存于一个task |
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
e=“margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px”>对于新的intent,是否总是实例化activity对象
standard
如果不包含FLAG_ACTIVITY_NEW_TASK标记,则activity2放入task1,否则按前面讲述的规则为activity2选择task
可被多次实例化,同一个task的不同的实例可位于不同的task中,每个task也可包含多个实例
允许
是的。当接收到新的intent时,总是会生成新的activity对象。
singleTop
同standard
同standard
允许
已存在的activity对象,如果位于目标task的栈顶,则该activity被重用,如果它不位于栈顶,则会实例化新的activity对象
singleTask
将activity2放到task1栈顶
不能有多个实例。由于该模式下activity总是位于栈顶,所以actvity在同一个设备里至多只有一个实例
允许。singleTask模式的activity总是位于栈底位置。目标activity实例已存在时,如果该实例刚好位于task栈顶,则接收intent,否则到来的intent将会被丢弃,但该可以响应该intent的那个activity所在的task将会被移到前台。
singleInstance
同singleTask
同singleTask
不允许与其它activity共存于一个task。如果activity1的运行在该模式下,则activity2一定与activity1位于不同的task
对于新到的intent,如果是由新创建的activity对象来接收,则用户可以通过返回键回到之前的activity;如果是由已存在的activity来接收,则用户无法通过返回键返回到接收intent之前的状态。
3、清空栈
当用户长时间离开task(当前task被转移到后台)时,系统会清除task中栈底activity外的所有activity。这样,当用户返回到task时,只留下那个task最初始的activity了。
这是默认的情况,中有些属性可以改变这种行为。
l alwaysRetainTaskState属性