Android Activity launchMode研究

Activity的Launch mode一共有四种:
standard, singleTop, singleTask, singleInstance, 默认情况下是standard.

四种启动模式分为两组

Activity的这四种启动模式可以分为两组:
standard和singleTop是一组, 这两种模式标记的activity可以有多个实例(被初始化多次), 这些实例可以属于任何task, 并且可以被放在activity stack中的任何位置. 通常情况下,这两种模式标记的activity会被启动到调用startActivity()的那个task里, 除非Intent对象包含了FLAG_ACTIVITY_NEW_TASK这个标记, 则会启动一个新的task.
singleTask和singleInstance是另一组, 这两种模式的activity只能开始一个task, 它们永远在activity stack的根部, 而且设备在一个时间内只能持有一个activity的实例, 也即只有一个这样的task.

launchMode说明

standard

默认模式.
每次有一个新的Intent对象来启动standard activity时, 这个activity的一个新的实例就会被创建,来处理这个intent,也即每一个activity实例处理一个intent.

singleTop

与standard模式类似,一个新的singleTop的activity的实例也可能被创建,来处理一个新的intent.
但是,如果目标task中已经有一个这个singleTop的activity的实例,并且它是在栈顶,则这个已经存在的实例将接受这个新的intent( onNewIntent() 方法被调用), 新的实例不会被创建. 
其他的情况,比如,存在实例在目标task,但是不在栈顶;或者它在一个栈顶,却不在目标task,则新的实例都会被创建,并且放在栈顶, 这时候的行为和standard一样.

singleTask

singleTask和singleInstance唯一的区别就是, singleTask的activity允许其他activity在它的task中.
启动模式为singleTask的activity永远在它的task的根部, 同时, 其他的activities (launch mode为standard和singleTop) 可以被启动到这个task中.
系统在启动一个activity的时候,发现它的launchMode是singleTask, 并不能保证就会真的开启一个新的task, 还会检查activity的taskAffinity属性.
如果taskAffinity属性没有指定,默认是application的taskAffinity,名称即包名.
如果发现这个taskAffinity指定的task已经存在,则会在该task中新建一个activity; 如果该task不存在,才会新建一个task.
做了一个实验,用一个standard的activity来start一个singleTask的activity:
没有指定taskAffinity时, 它们的taskId相同, 说明它们还是在同一个task里;
为singleTask的activity指定一个新的taskAffinity后,singleTask的activity得到的taskId就和standard的不同了, 说明这时候开启了一个新的task.
在启动一个singleTask的activity实例时, 如果系统中已经存在这样一个实例, 将会把这个实例调度到task栈顶, 并清除它的task中栈上方的所有activities.

singleInstance

一个launch mode为singleInstance的activity, 不允许其他的activity在它的task中, 它自己是这个task中唯一的activity. 如果它启动另一个activity, 那个新的activity会被分配到一个不同的task中去, 就好像intent中含有FLAG_ACTIVITY_NEW_TASK Flag一样.
系统在启动一个activity的时候,如果发现它的launchMode是singleInstance,就会启动一个新的task,因为这种activity不会跟别人共用task. 所以和singleTask不同, singleInstance不需要特殊指定taskAffinity.
在singleInstance中启动的activity也不会跟它放在同一个task里, 根据要启动的activity的taskAffinity选择,可能在其他已有的task里,也可能开启新的task, 总之不是在singleInstance的task里.

taskAffinity属性

taskAffinity属性规定了activity归属于什么task. 有相同这一属性的activities从概念上来讲, 应该属于同一个task, 从用户的角度来看, 属于同一个应用.
一个task的affinity是由它的根activity的affinity决定的.
affinity决定两件事情:
1.activity re-parented到哪个task; 可以查看allowTaskReparenting 属性的说明.
2.当activity被带有FLAG_ACTIVITY_NEW_TASK flag的Intent启动时,哪个task来收容这个activity.
默认情况下, 一个application中的所有activities拥有相同的affinity.
你可以设置taskAffinity这个属性来将activities分组,也可以将不用应用中定义的activities放在同一个task里. 也即: 跨应用,跨进程的activities可以在同一个task里.
如果要设定一个activity没有对任何一个task的affinity, 可以将这个属性设为一个空字符串.
如果Activity的taskAffinity属性没有被设置, activity会继承application的这个属性. 对于application来说, 默认的affinity的名字就是manifest元素指定的包名.
所以默认情况下, 一个application中的所有activities有着相同的affinity, 名称即应用包名.
注意: 自己指定taskAffinity时,需要以应用包名开头,或者是省略包名,用点开头,后面加上一个自己取的名字. 否则会在安装时报错.

Up Navigation

在App中,所有非Home的屏都应该提供给用户一种方法,让用户通过点击action bar上的Up键, 来返回到应用逻辑上的prarent screen.
从Android 4.1,即API 16开始,可以通过activity的android:parentActivityName 属性来指定每个activity逻辑上的parent.
通过上面的属性指定了parent之后,就可以通过 NavUtilsAPI来navigate Up到parent了.
具体可以参见: http://developer.android.com/training/implementing-navigation/ancestral.html
在这里想说的是, 在navigate up到一个当前stack上的activity时, 具体的行为是由parent activity的launch mode决定的.
如果parent activity是singleTop(或者up intent包含了FLAG_ACTIVITY_CLEAR_TOP Flag), parent activity就会被带到栈顶, 而且它的状态会被保存, Navigation intent被parent的 onNewIntent() 方法所接收.
如果parent activity的launch mode是standard(并且up intent不包含 FLAG_ACTIVITY_CLEAR_TOP Flag), 当前的activity和它的parent都会被弹出栈, 并且parent activity的新实例会被建立,来接收这个intent.

参考资料:

实验项目地址: https://github.com/mengdd/HelloActivityAndFragment
之前的博文:http://www.cnblogs.com/mengdd/archive/2013/06/13/3134380.html
别人的博文: http://blog.csdn.net/zhangjg_blog/article/details/10923643
Activity elements:
http://developer.android.com/guide/topics/manifest/activity-element.html
Tasks and Back Stack:
http://developer.android.com/guide/components/tasks-and-back-stack.html
Providing Up Navigation
http://developer.android.com/training/implementing-navigation/ancestral.html

转载于:https://www.cnblogs.com/mengdd/p/4531064.html

Android Activity launchMode研究相关推荐

  1. Android Activity的launchMode四种启动模式备忘

    Android Activity的launchMode四种启动模式备忘 Android的Activity的启动模式有四种,在AndroidManifest.xml通过配置Activity的androi ...

  2. Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?

    Android Activity为什么要细化出onCreate.onStart.onResume.onPause.onStop.onDesdroy这么多方法让应用去重载? 原创链接:http://bl ...

  3. Android Activity Launch Mode 启动模式详解

    简介 android:launchMode 属性能设置 Activity 对象启动时是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题. 它是 Androidmanifest.x ...

  4. Android Activity标签属性

    Android Activity标签属性 Activity 是 Android 系统四大应用组件之一,用户可与 Activity 提供的屏幕进行交互,以执行拨打电话.拍摄照片.发送电子邮件等操作开发者 ...

  5. android service交互,Android Activity与Service的交互方式

    参考: http://blog.csdn.net/gebitan505/article/details/18151203 实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通 ...

  6. android activity启动模式_Android知识点【Activity】清单文件

    哈喽 好久不见,最近太忙了 请大家原谅 今天我们来说一下android清单文件Activity都有哪些配置,来先上图: 大家一下子看了这么多属性可能觉得有些懵逼,我这边也是就常用的一些数据给大家做一下 ...

  7. (二)Android音频录制研究

    转载请标明出处:(二)Android音频录制研究_stormxiaofeng的博客-CSDN博客 上一篇实现了Android端文字的传输 点击打开链接,由于此系列要实现Android端语音的传输,所以 ...

  8. 【转】Android Activity原理以及其子类描述,androidactivity

        Android Activity原理以及其子类描述,androidactivity 简介 Activity是Android应用程序组件,实现一个用户交互窗口,我们可以实现布局填充屏幕,也可以实 ...

  9. 十九、Android Activity初探

    原文:十九.Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供 ...

最新文章

  1. pytorch numpy 数据类型转换
  2. Linux 01 Liunx目录结构及文件基本操作
  3. 北京站售票人员倒票视频
  4. 使用栈结构完毕四则运算
  5. 怎么卸载Apache_pn服务-PHPnow使用问题
  6. [YTU]_2617( B C++时间类的运算符重载)
  7. [BZOJ 1001] 狼抓兔子
  8. ps 毛发 边缘_不会抠图怎么办?PS画笔绘制毛发技巧,抠图流程解析
  9. Python基础——input交互功能
  10. bnx2: Can't load firmware file bnx2/bnx2-mips-09-6.2.1b.fw
  11. 团队博客-第三周:需求改进系统设计(科利尔拉弗队)
  12. 专业测试-自评抑郁量表SDS_悟sphenic_新浪博客
  13. c-lodop自定义分页打印
  14. 物联网应用技术竞赛 ——数据库添加新用户映射
  15. kubernet安装helm
  16. 苹果 M1 芯片首席设计师重回英特尔
  17. Tian Ji -- The Horse Racing(贪心+STL)
  18. Python 的 sum():Pythonic 的求和方法
  19. 一个故事搞懂经济危机(少儿不宜)
  20. esp32例子初始化流程

热门文章

  1. 用windows开发ios app_开发一个APP至少需要多少人|安卓|ios|产品经理
  2. 北京大学生物信息学(8)
  3. 开了立体声混音仍然不能内录_相位表是如何为你的混音工作带来帮助的
  4. 数据挖掘十大算法之C4.5
  5. 对于目前流行的量化投资与smart beta策略的一些看法
  6. 数据结构题及c语言版4.31答案,数据结构参考题及答案修正版.doc
  7. php逆波兰表达式,PHP逆波兰示意与表达式计算
  8. python中用箱线图分析异常值_[宜配屋]听图阁
  9. 【排序算法复习备忘】冒泡、选择、插入、归并、快排、堆排序
  10. 计算机存储系统中,有哪些措施可以提高 CPU 访问存储系统的速度?