你的位置:首页 > 操作系统

[操作系统]singleTask TaskAffinity allowTaskReparenting


关于singleTask TaskAffinity allowTaskReparenting

一、Activity的LaunchMode

1.standard

2.singleTop:FLAG_ACTIVITY_SINGLE_TOP  栈顶复用模式,即如果栈顶有本activity实例,则无需新实例化activity。

3.singleTask:FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP的效果

4.singleInstance:单独一个栈,且栈内复用,一旦新建后,只要不销毁,就不会再新建activity

 

二、Actvity的Flags

1.FLAG_ACTIVITY_NEW_TASK : 同singleTask

2.FLAG_ACTIVITY_SINGLE_TOP :同singleTop

3.FLAG_ACTIVITY_CLEAR_TOP 与FLAG_ACTIVITY_NEW_TASK配合使用,

4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS android:excludeFromRecents = "true" 不出现再历史Activity列表中

三、聚焦singleTask

standard singletop  singleinstance都比较容易理解,就是这个singleTask比较难理解,这里我们对singleTask做下知识整理

singleTask:FLAG_ACTIVITY_NEW_TASK

功能1:栈内复用原则,已有实例情况下不新建,只调用onNewIntent  

功能2:默认有clearTop的效果,将已实例化的activity上面的activity全部出栈。

 

1.我们首先要知道一个activity的参数,TaskAffinity

TaskAffinity:标识Activity所需要的任务栈的名字。默认情况下,Activity所需要的任务栈的名字为应用的包名。可以给每个Activity单独指定TaskAffinity的属性。

singleTask要和TaskAffinity配合使用

 

2.singleTask和TaskAffinity的三个配合原则

(1).当前任务栈S1的栈内情况为ABC,Activity D的TaskAffinity属性为任务栈S2,ActvityD以singleTask模式请求启动。

结果:系统先创建任务栈S2,新建D的实例入栈S2。最终S1的栈内情况为ABC,S2的栈内情况为D

(2).当前任务栈S1的栈内情况为ABC,Activity D的TaskAffinity属性为任务栈S1(即不特别指定,默认情况下),ActvityD以singleTask模式请求启动。

结果:系统直接创建D的实例入栈S1,最终S1的栈内情况为ABCD

(3).当前任务栈S1的栈内情况为ADBC,Activity D的TaskAffinity属性为任务栈S1(即不特别指定,默认情况下),ActvityD以singleTask模式请求启动。

结果:系统不创建D,切换D到栈顶并调用其onNewIntent方法,并将D上面的Activity全部出栈,最终S1的栈内情况为AD

 

3.TaskAffinity还有一个功能,就是和allowTaskReparenting结合:

allowTaskReparenting:官方定义是“Whether or not the activity can move from the task that started it to the task it has an affinity for when that task is next brought to the front — "true" if it can move, and "false" if it must remain with the task where it started.”简单翻译就是是否允许该Activity从启动他的任务(可以理解为activity栈)转移到与他有亲密关系(affinity)的任务中,当有亲密关系的任务再次启动时。 

举例说明:

ActvityA是应用1的主Actvity,ActivityB和ActvityC属于应用2,B为主Activity。

操作路径:A启动C-->点击Home键盘到Launcher->点击launcher上的应用2

情况1.ActivityC的allowTaskReparenting属性为false,此时会进入ActvityB        典型案例:将文字文件等,分享到短信

原因:当前任务栈1为AC,此时启动应用2,会启动任务栈2,然后将主ActivityB放入任务栈2中

情况2:ActivityC的allowTaskReparenting属性为true,此时会进入ActvityC       典型案例:将文字文件等,分享到微信

原因:当前任务栈1为AC,此时启动应用2,会启动任务栈2,然后系统发现C的taskAffinity属性任务栈2已经创建,就把C从任务栈1转移过来,这就是allowTaskReparenting的功能。

 

四、调试时,我们可以使用adb shell dumpsys activity命令来查看当前系统的任务栈信息

 

参考资料:《Android开发艺术探索》




丽江旅游团购优惠深圳去丽江旅游报价跟团去丽江旅游多少钱几月去丽江旅游最好去丽江的旅游团价格暑假出门注意事项有哪些? 暑假学生票什么时候开始可以买? 寒暑假购买学生票要符合什么条件? 夏天泡温泉会不会越泡越热? 两江四湖三月三有演出吗?桂林两江四湖三月三演出时间? 三月三两江四湖夜游时间?夜游桂林两江四湖几点开始? 两江四湖三月三有什么好玩的?桂林两江四湖三月三活动安排? 两江四湖三月三歌圩会时间?桂林两江四湖三月三歌圩会几号到几号? 桂林各个市县好玩的地方推荐 2015厦门中秋节有什么活动?2015中国厦门中秋旅游嘉年华 从北京西站到首都机场,坐大巴怎么坐? 2015年国庆三亚各个景点门票多少钱?门票会涨价吗? 长隆欢乐世界免费吃自助吗?广州长隆欢乐世界自助什么餐? 广州长隆野生动物园有专车吗?香江野生动物园在哪里上车? 香江野生动物园官网?广州香江野生动物园怎样预订? 香江野生动物园攻略?广州香江野生动物园在哪里坐车? IDT71T75702S75PFI Datasheet IDT71T75702S75PFI Datasheet IDT71T75702S75PFI8 Datasheet IDT71T75702S75PFI8 Datasheet IDT71T75702S80BG Datasheet IDT71T75702S80BG Datasheet 泡温泉泳衣 泡温泉泳衣 泡温泉泳衣 五星漂流 五星漂流 五星漂流 单身情人节怎么过 单身情人节怎么过 单身情人节怎么过