Activity的TaskAffinity属性 任务栈分为前台任务栈和后台任务栈(后台任务栈处于暂停状态,用户可以切换前后台任务栈)
这个参数标志了Activity所需的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。
TaskAffinity属性主要与singleTask启动模式和allowTaskReparenting属性配对使用 。
1.当TaskAffinity和singleTask使用时候,是将具有该模式的Activity的目前任务栈的名字,启动后运行在名字对应相同名字的任务栈中。
2.当TaskAffinity和allTaskReparenting结合时候,例如:当应用A启动了应用B的Activity,如果该Activity的allTaskReparenting属性为true的话,A应用启动了B的Activity,这个Activity会先在A的任务栈中,但是,当启动B的时候,发现Activity的任务栈已经被启动了,就会从A的任务栈中将Activity转移过来。书中这么说:这可以这么理解,由于A启动了Activity,所以Activity只能运行在A中,但是Activity属于B,正常情况下,他的TaskAffinity肯定跟A的任务栈不同,因为包名都不同,而当B被启动后,B会创建任务栈,这个时候系统发现Activity原本所想要的任务栈以及被创建了,所以把它从A的任务栈中转移过来了。
如何给Activity指定启动模式呢?
1.第一种通过AndroidMenifest为Activity指定启动模式
2.通过Intent中设置标志位为Activity指定启动模式
注意:第二种设置方式肯定比第一种优先级更高;第一种无法为Activity设置FLAG_ACTIVITY_CLEAR_TOP标志;第二种无法为Activity指定singleInsance模式
Activity的Flags
主要说一些常见的标记位
FLAG_ACTIVITY_NEW_TASK : 主要作用是为Activity指定“singleTask”启动模式,与在清单文件中指定该启动模式相同
FLAG_ACTIVITY_SINGLE_TOP: 同上 指定“singleTop”启动模式
FLAG_ACTIVITY_CLEAR_TOP : 具有此标记Activity,当它启动的时候,同一个任务栈的位于它上面的Activity都会出栈,这个标记一般会和singleTask启动模式一起出现,在这种情况下,如果被启动的Activity实例已经存在,系统会调用它的onNewIntent。当和standard启动模式的时候,被启动Activity和它上面的Activity都会出栈,系统会创建新的Activity实例放入栈顶。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : 具有这个标志的Activity不会出现在历史Activity的列表中,用户不能通过历史列表返回到我们的Activity中,等同于在XML中指定Activity的属性android:ecludeFormRecents = "true"
今天就到这。