关于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. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

  2. 基于 SWTBot 进行 Eclipse GUI 自动化测试

    背景简介 在软件开发领域,持续集成和部署对于软件测试自动化提出了越来越高的要求,基于 Eclipse 应用在这一需求中仍然占据重要的组成部分.目前主流的测试自动化工具主要以录制回放的功能为主,辅助以脚 ...

  3. Truck History(poj 1789)

    Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for v ...

  4. memcached采用的网络模型

    memcached采用的网络模型是早前提到的半同步半异步的网络模型. 简 单的说,大致流程就是:主线程负责接收新的连接,接收到新的连接之后,选择一个worker副线程,将该新连接push到副线程的连接 ...

  5. 禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)

    一般我们不想让窗体能够关闭, 首先想到的是在OnCloseQuery事件里设置CanClose := False, 不过在某些情况下这个会和程序关闭窗体的业务逻辑产生冲突 所以写了下面这个函数, 可以 ...

  6. linux eclipse c++配置

    安装cdt: https://www.eclipse.org/cdt/downloads.php 新建一个c++工程,运行发生错误: Eclipse CDT launch failed.Binary  ...

  7. 用c写99乘法表

    int main(int argc,char **argv){ int a; for(a=1;a<=9;a++){ int b; for(b=1;b<=a;b++){ printf(&qu ...

  8. 构造函数语义学之Copy Constructor构建操作(2)

    二.详述条件 3 和 4 那么好,我又要问大家了,条件1 和 2比较容易理解.因为member object或 base class 含有copy constructor.那么member objec ...

  9. 嵌入式设备web服务器比较

    目录(?)[-] Boa Thttpd Mini_httpd Shttpd Lighttpd Goahead AppWeb Apache 开发语言和开发工具 结论 备注   现在在嵌入式设备中所使用的 ...

  10. 字符串(后缀自动机):USACO Dec10 恐吓信

    [题目描述] FJ刚刚和邻居发生了一场可怕的争吵,他咽不下这口气,决定佚名发给他的邻居一封脏话连篇的信.他有无限张完全相同的已经打印好的信件,都包含 N个字母(1<=N<=50,000). ...