关于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开发艺术探索》

singleTask TaskAffinity allowTaskReparenting的更多相关文章

  1. 对SingleTask和TaskAffinity的理解(转至 http://www.2cto.com/kf/201311/254450.html)

    最近研究微信调起自己客户端的事情,对于SingleTask和TaskAffinity的理解又多了一些理解.   以前对于Android的四种LaunchMode有一些了解,其中比较有意思的就是Sing ...

  2. 对SingleTask和TaskAffinity的理解

    最近研究微信调起自己客户端的事情,对于SingleTask和TaskAffinity的理解又多了一些理解. 以前对于Android的四种LaunchMode有一些了解,其中比较有意思的就是Single ...

  3. Android -- taskAffinity

    每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task.如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Ap ...

  4. taskAffinity属性

    Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系.我们知道,一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Tas ...

  5. [转]Android的taskAffinity

    Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系.我们知道,一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Tas ...

  6. Android堆栈分析

    在开发中,与界面跳转联系比较紧密的概念是Task(任务)和Back Stack(回退栈).activity的启动模式会影响Task和Back Stack的状态, 进而影响用户体验.除了启动模式之外,I ...

  7. Activity的任务栈Task以及启动模式与Intent的Flag详解

    什么是任务栈(Task) 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity. 这些 Activity 按照各自的打开顺序排列在堆栈(即“返回栈”)中. 其实就是以栈的 ...

  8. Android开发艺术2之Activity的启动模式

    Activity是Android的四大组件之一,他的重要性毋庸置疑,对于这么重要的一个组件,我们首先要知道这些都是由系统进行管理和回调的,要理解Activity的启动模式,我们首先来了解一下Andro ...

  9. 喜闻乐见-Android LaunchMode

    launchMode,通俗点说,就是定义了Activity应该如何被launch的.那么这几种模式的区别以及应用场景,会有何不同呢?谷歌是基于什么原因设计这几种模式的呢?这几种模式背后的工作原理是什么 ...

随机推荐

  1. (摘录)data guard switchover切换异常

    查看DG数据库备份库发现,switchover_status为SWITCHOVER LATENT SQL> select OPEN_MODE,PROTECTION_MODE,PROTECTION ...

  2. android 如何进入某个具体的应用管理页面

    http://stackoverflow.com/questions/4421527/start-android-application-info-screen/4772481#4772481 pri ...

  3. yum命令常见方法

    yum check-update 检查可更新的所有软件包 yum update 下载更新系统已安装的所有软件包 yum upgrade 大规模的版本升级,与yum update不同的是,连旧的淘汰的包 ...

  4. COJ 0346 WZJ的旅行(二)更新动态树分治版本

    WZJ的旅行(二) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 时隔多日,WZJ又来到了幻想国旅行.幻想国由N个城市组成,由 ...

  5. 男人的网站—Indochino不完全解析 | 曾亮.ME

    男人的网站-Indochino不完全解析 | 曾亮.ME 亮兄 可以参考一下国内的 ROMWE SHEINSIDE

  6. 关于ETL的几种运行

    一:代码部分 1.新建maven项目 2.添加需要的java代码 3.书写mapper类 4.书写runner类 二:运行方式 1.本地运行 2. 3. 三:本地运行方式 1.解压hadoop到本地 ...

  7. ionic2 干货

    亲爱的程序员童鞋 分享干货啦 最近在研究ionic2 ,公司也在用ionic2 和typescript,angular2以及cordova做混编APP 我的博客随笔都是随性写的,做了某个功能就想分享一 ...

  8. 滑动到底部或顶部响应的ScrollView实现

    关于使用可见:滚动到底部或顶部响应的ScrollView使用 示例APK可从这些地址下载:Google Play,  360手机助手,  百度手机助手,  小米应用商店,  豌豆荚 两种实现方式的主要 ...

  9. 小胖学PHP总结1-----PHP的数据类型

    PHP一共支持8种原始类型.包含4中标量类型,即:boolean(布尔型).integer(整形).float/double(浮点型)和string(字符串型):两种复合类型,即:array(数组)和 ...

  10. java——递归调用

    递归函数调用调用本身,并通过自己的相应参数,这个计算过程中进行层,直到满足某些条件,只要停止呼叫. 递归函数的特点 1.函数要直接或间接调用自身. 2.要有递归终止条件检查.即递归终止的条件被满足后. ...