所谓的 task ,是指用户完成某一项任务时与之交互的一组 Activity。比如用户要向开发者汇报 bug,先打开程序主页,然后打开关于页面,再点击报告 bug 按钮,打开编辑邮件页面。当前这三个 Activity 就构成了一个 task 。 task 中的 Activity 以栈的形式管理,遵循”先进先出“的原则 。通常我们不需要关心其组织方式,但在一些情况下你可能想自定义 task 的一些行为。要实现这一点,需要了解以下属性:

  • taskAffinity
  • launchMode
  • allowTaskReparenting
  • clearTaskOnLaunch
  • alwaysRetainTaskState
  • finishOnTaskLaunch

Manifest.xml 中并没有 task 对应的元素或属性,因此这些属性都在 <activity> 元素下。有些属性是针对整个 task 的,只有在根 Activity 下才会生效。

 

Launch Modes

Launch Mode 决定了 Activity 在 task 中的行为与组织方式。有两种方式可以一定义 Activity 的 Launch Mode,一种是通过 Intent Flags,另一种是在 Manifest.xml 中 <activity> 标签下定义 launchMode 属性,launchMode 属性的值包括 standard,singleTop,singleTask,singleInstance 四种。(如果两种方式都有声明,则 Intent 中的 flag 值会覆盖 Manifest 中的 launchMode 属性。

注意:Intent Flag 值与 launchMode 并不一一对应。因此某些行为只能通过其中一种方式实现

以下主要讲 launchMode 属性。 standard 是默认的启动方式,允许多个 Activity 实例存在,singleTop 要求栈顶只存在一个 Activity 实例,类似于在 Intent 中添加 FLAG_ACTIVITY_SINGLE_TOP 标记。

如:栈中有 A,B,C,D,在 D 中再启动 D ,默认情况下会变为 A,B,C,D,D,而加上此标记后仍为 A,B,C,D ,而 D 的 onNewIntent() 方法会被回调到。

当 Activity 的启动方式为 singleTask 或 singleInstance 时,该 Activity 在系统中只会有一个实例。即系统在启动 Activity 时,如果当前某个 task 中存在 Activity 实例,则直接将该 task 推至前台。区别在于,singleInstance 要求其任务栈中只能有这一个 Activity,通过此 Activity 启动的 Activity 会被放至另外的 task 中,而singelTask 则无此要求。 如果 task 被推至前台时,singleTask 的 Activity 的顶层还有其它 Activity,则顶层的 Activity 会被全部清除掉。因此使用 singleTask 启动模式类似于 Intent 中添加 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP 标记。(仍有轻微区别:使用 singleTask launchMode 时,Activity 不会重新创建,只会调用 onNewIntent()方法;而使用 intent flag 时,Activity 被重新创建

如果 lauch mode 为 singleTask 的 Activity 不是根 Activity,则按返回键时,会一直返回到该 task 的根 Activity,再返回到之前启动它的 Activity。如下图所示:

关于 launch mode 的更多详细内容请看这里

 

Task Affinity

taskAffinity 属性,可理解为 Activity 所从属的 task。默认情况下,同一个应用程序下的 Activity 都从属于一个 task,但是可以对该属性进行修改使之依附不同 task。 该属性常用在两个地方:

  • 当启动 Activity 的 Intent 包含 FLAG_ACTIVITY_NEW_TASK 标记时。如果系统中已经存在一个 task 与要启动的 Activity 有相同的 taskAffinity ,该 Activity 被压入该 task 中,否则启动一个新的 task。
  • 当 Activity 的 allowTaskReparenting 属性值为 true 时。通过程序 X 的 Activity A 启动程序 Y 的 Activity B,默认情况下 B 会被放入 A 所在的 task 中,再启动 Y 程序时 B 所在的 task 不变。如果 B 的 allowTaskReparenting 值为 true,则当启动 Y 程序时 B 会被转压入到 Y 程序的 task 中。
 

清除任务栈

用户通过按 Home 键则最近程序列表离开当前应用程序,超过一定时间后(比如30分钟),系统会将 task 中的 Activity 清除掉,只保留根 Activity。因为用户长时间离开程序,可能想放弃或已经遗忘之前操作,重新打开程序时期待看到程序首页。 我们可以更改 Activity 的一些属性来改变这种行为。

  • alwaysRetainTaskState:始终保持所有 Activity,不清除。
  • clearTaskOnLaunch:始终清除非根 Activity,即使只离开很短时间。
  • finishOnTaskLaunch:与 clearTaskOnLaunch 类似,但是只针对单个 Activity 而不是整个 task。(通过最近程序列表打开时不会清除)

原文地址:http://multi-thread.com/?p=74


参考:
  1. Android 官方文档
  2. Android Activities and Tasks series – Activity Attributes
  3. Activity的Launch mode详解 singleTask正解

Android Activity task 相关属性的更多相关文章

  1. Android总结篇系列:Activity Intent Flags及Task相关属性

    同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 ...

  2. 【转】Android总结篇系列:Activity Intent Flags及Task相关属性

    [转]Android总结篇系列:Activity Intent Flags及Task相关属性 同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http:// ...

  3. Activity Intent Flags及Task相关属性

    转自http://www.cnblogs.com/lwbqqyumidi/p/3775479.html 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式 ...

  4. 查看activity task相关信息

    可以使用命令 adb shell dumpsys activity 查看的结果如下 ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents ...

  5. 基础总结篇之三:Activity的task相关

    http://blog.csdn.net/liuhe688/article/details/6761337 古人學問無遺力,少壯工夫老始成.紙上得來終覺淺,絕知此事要躬行.南宋.陸遊<冬夜讀書示 ...

  6. Activity的task相关 详解

    task是一个具有栈结构的容器,可以放置多个Activity实例.启动一个应用,系统就会为之创建一个task,来放置根Activity:默认情况下,一个Activity启动另一个Activity时,两 ...

  7. AndroidManifest.xml中<activity></activity>相关属性说明

    虽说,从事android开发有一定时间了,对于Activity大家也都不陌生,但是具体的对于Activity中相关属性的含义有必要做一个系统的总结: intent-filteraction: 来指定响 ...

  8. android的task任务栈

    转自http://blog.csdn.net/liuhe688/article/details/6761337 古人學問無遺力,少壯工夫老始成.紙上得來終覺淺,絕知此事要躬行.南宋.陸遊<冬夜讀 ...

  9. 详解Android Activity启动模式

    相关的基本概念: 1.任务栈(Task)   若干个Activity的集合的栈表示一个Task.   栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...

随机推荐

  1. 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本

    某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...

  2. 如何方便的保存WinForm窗体控件的位置大小等等配置信息

    由于分辨率.屏幕主题.字体大小的不同,窗体显示效果在不同机器上不尽相同.窗体的弹性设计并不能满足多样的需求.为保证在各种情况下,能有满意的效果.窗体的多样显示方式能改变,并且保存.载入配置,显得很重要 ...

  3. 备份了我的CSDN博客

    刚用cnblogs的“博客搬家”功能把我此前在csdn发的所有文章都备份过来了. 发现cnblogs的博客备份功能比较好的一点是——文章的发表时间和原来的一致! 上次在CSDN发博客的时间是2015- ...

  4. tornado 异步调用系统命令和非阻塞线程池

    项目中异步调用 ping 和 nmap 实现对目标 ip 和所在网关的探测 Subprocess.STREAM 不用担心进程返回数据过大造成的死锁, Subprocess.PIPE 会有这个问题. i ...

  5. iOS self

    如果self在对象方法中 那么self就代表调用当前对象方法的那个对象 如果self在类方法中 那么self就代表调用当前类方法的那个类 总结:self的使用只需关注self在哪个方法中 如果在类方法 ...

  6. STM32F412应用开发笔记之三:SPI总线通讯与AD采集

    本次我们在NUCLEO-F412ZG试验模拟量输入采集.我们的模拟量输入采用ADI公司的AD7705,是一片16位两路差分输入的AD采集芯片.具有SPI接口,我们将采用SPI接口与AD7705通讯.两 ...

  7. mysql 分页查询

    mysql,; : mysql,; -last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql; 个记录行 ,n. 动态传参的分页查询 SELECT * FROM table LI ...

  8. javascript中的预编译问题

    Js作为脚本语言,可以不需要编译直接运行,但遇到类似变量或者函数同名,预编译方面的知识可以帮助我们更好解决问题. 示例: 这是一段js中普通的函数调用代码 <script>1.    // ...

  9. hibernate映射文件

    Hibernate的持久化类和关系数据库之间的映射通常是用一个XML文档来定义的.该文档通过一系列XML元素的配置,来将持久化类与数据库表之间建立起一一映射.这意味着映射文档是按照持久化类的定义来创建 ...

  10. node(Buffer缓存区)

    // 创建buffer类 var buf=new buffer(10); var buf=new buffer([10,20,30,40]); var buf=new buffer("www ...