相关的基本概念:

1、任务栈(Task)

  若干个Activity的集合的栈表示一个Task。
  栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于保障用户体验,维护用户操作体验上的完整性。
例如:微信ActivityA 分享文章到QQActivityB,两个activity是存在于不同app中的,但是被系统放在一个任务中,分享后,用户按back键返回,可以返回到原来的微信Activity A中,这就确保了用户体验。
 
2、查看当前系统的任务栈
  命令行中 --> adb shell dumpsys activity
 
3、Activity 的相关属性
  android:taskAffinity:是否定义了该属性,对接下来讨论到的singleTask影响甚大,如果设置了Activity的taskAffinity属性值,Activity将在TaskName为指定值的独立Task中启动,否则,将在原来的默认Task中。
 
  android:allowTaskReparenting:主要作用是activity的迁移,程序A已经启动了若干个Activity,其中包含Activity1(这个Activity1拥有该属性),当程序B也要启动它的时候,其可迁移到程序B内。
 
 android:alwaysRetainTaskState:操作系统会在程序长时间不会动的时候,清除Task状态,如果开启这个,系统会继续保持直到再次打开,只对根Activity生效(ABC,A是栈底,C是栈顶,只能对A即可)。例如微信在后台,当我们再次打开应用时,系统会判断是否已经存在以A为根Activity的栈,如果有,直接使用该栈,并显示栈顶的Activity。
 
  android:clearTaskOnLaunch:用来标记是否在启动该Activity时,清除除根目录的其他Activity
 
  android:exported:是否支持其它应用调用当前组件。默认值:包含有intent-filter 默认值为true(); 没有intent-filter默认值为false。
 
四种启动模式:
 
  standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;
 
  singleTop:如果该Activity位于任务栈栈顶,则不需要创建,复用实例并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中,其余情况都要创建Activity实例;(singleTop模式,只在当前任务栈中生效、startActivityForResult启动一个设置了singleTop的activity,singleTop模式将无效)
 
关于onNewIntent():根据文档知,当Activity的启动模式是singleTop或者使用FLAG_ACTIVITY_SINGLE_TOP这个标记启动新的Activity并且Activity栈顶就是待启动的Activity的时候,会调用原Activity的这个方法;例子:QActivity为栈顶复用模式,当Qactivity位于栈顶时,再次打开,onResume()  -->onPause() -->onNewIntent() -->onResume() 。当Qactivity不位于栈顶时,onNewIntent-->onRestart-->onStart-->onResume(也就是说只要栈顶不是Qactivity ,都会创建新的实例,是Qactivity则重用不新建)。
 
  singleTask:使用好栈内复用模式对taskAffinity属性的理解很重要。
存在相同taskAffinity属性值的Task:不存在实例,则新建Activity实例。如果存在则把当前实例中复用实例, 这个 Activity 启动并且清除顶部的 Acitivity ,通过标识 CLEAR_TOP。
taskAffinity属性值不一样的Task:在这个 Task 中新建这个 Activity 实例。
 
  singleInstance:和singleTask差不多,唯一不同的是singleInstance Activity实例的Task只能存放一个该模式的Activity实例,例如Qactivity加载Wactivity都会被放入其它的Task中,如果存在与Wactivity相同affinity的Task,则在该Task内创建Wactivity。如果不存在,则重新生成新的Task并入栈。
 
常用Intent Flags:
 
  FLAG_ACTIVITY_NEW_TASK: 如果task中已经有了你要启动的activity的话,当前task会被带到前台(不管这个activity是否在前台,有可能activity上边还压有别的activity)。如果配合FLAG_ACTIVITY_NEW_MULTI_TASK,则无论什么情况都会创建新的Task,就成了类似 singleInstance 的情况了。如果配合    FLAG_ACTIVITY_CLEAR_TASK,则会先清空该栈,然后向栈中添加目标Activity,栈ID不变。
例如:Flag为FLAG_ACTIVITY_NEW_TASK,Qactivity(栈为LOL)启动Wactivity(栈为DOTA),接着启动Eactivity(栈为DOTA),Home回桌面。打开该应用,Qactivity启动Wactivity,Eactvity会出现在前台,因为它是整块栈启动(里面顺序不变)。

FLAG_ACTIVITY_SINGLE_TOP: 相当于launchMode中的singleTop。

FLAG_ACTIVITY_CLEAR_TOP: 与singleTask类似,但有极大区别,它会销毁目标Activity和它之上的所有Activity,重新创建目标Activity,并没有执行onNewIntent()。

 
tips:指定启动模式时,Flags的优先级大于launchMode,当两者都有时,以Intent Flag有效。
 
注意事项:
 
  1、当目标的启动模式不为标准模式时,不要使用startActivityForResult去启动目标,容易出现你意想不到的结果。
例如:(大概意思,startActivityForResult相当于白设置,会返回一个取消的结果)
**if the activity you
* are launching uses the singleTask launch mode, it will not run in your
* task and thus you will immediately receive a cancel result
  2、当Activity执行了onDestroy,没有执行finish,那么实例都还是存在栈里的。但Activity被finish掉了,则它会是新建实例重新入栈,不会按启动模式想的那样。
 
转载注明来自:http://www.cnblogs.com/wujiancheng/
关于Activity其他知识点:详解Android Activity的生命周期

详解Android Activity启动模式的更多相关文章

  1. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  2. 详解Android Activity---启动模式

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

  3. AndroidのActivity启动模式

    Activity启动模式      .概念      Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否    .属性     Activity的启 ...

  4. Android Activity 启动模式和任务栈

    在了解了基本的Activity的生命周期后,我们能够很好的在一个Activity上面做相关的业务.但是这是不够的,因为Android通过任务栈来保存整个APP的Activity,合理的调度任务栈才能够 ...

  5. Android Activity启动模式

    <activity android:name=".MainActivity" android:launchMode="singleTask"> &l ...

  6. 【Android】详解Android Activity

    目录结构: contents structure [+] 创建Activity 如何创建Activity 如何创建快捷图标 如何设置应用程序的名称.图标与Activity的名称.图标不相同 Activ ...

  7. android:Activity启动模式之singleTask(一)

    先看一下standard启动模式的说明: 仅仅有一个实例.在同一个应用程序中启动他的时候.若不存在此Activity实例.则会在当前栈顶创建一个新的实例.若存在,则会把栈中在其上的其他Activity ...

  8. 详解Android Activity生命周期

    转载注明来自:  http://www.cnblogs.com/wujiancheng/ 一.正常情况下Activity的生命周期:  Activity的生命周期大概可以归为三部分 整个的生命周期:o ...

  9. 详解 Android Activity 生命周期

    从以下几个方面详细说一下Activity的生命周期: 1.回到主屏幕再打开和退出程序的时候. 2.屏幕旋转的时候. 3.打开其它的Activity的情况. 4.打开一个Layou透明的Activity ...

随机推荐

  1. 像感冒一样的contains error

    转自 http://blog.csdn.net/zhufuing/article/details/8135270          Android开发中的问题总是多种多样,今天我来总结一个浪费了我一个 ...

  2. angularjs学习之六(angularjs中directive指令的一般编程事件绑定 模板使用等)

    angular js 中模板的使用.事件绑定以及指令与指令之间的交互 相应教学视频地址(需FQ):v=aG8VD0KvUw4">angularjs教学视频 <!doctype h ...

  3. jQuery 1.x and 2.x , which is better?

    1. jQuery 1.x和2.x的区别 或者可以说是jQuery 2.x有什么新特征? jQuery官方发布2.x原话 不再支持IE6/7/8,如果在IE9/10里只用“兼容性视图”模式也将会受到影 ...

  4. YTU 2800: 逗逗泡泡的保密电文

    2800: 逗逗泡泡的保密电文 时间限制: 1 Sec  内存限制: 128 MB 提交: 229  解决: 114 题目描述 某电报局的电文保密的规律是将每个英文字母变成其后的第4个字母(很原始的那 ...

  5. servlet简单例子1

    servlet简单例子1 分类: servlet jsp xml2012-04-18 21:54 3646人阅读 评论(3) 收藏 举报 servletloginjspaction浏览器 LoginS ...

  6. python利用决策树进行特征选择

    python利用决策树进行特征选择(注释部分为绘图功能),最后输出特征排序: import numpy as np import tflearn from tflearn.layers.core im ...

  7. BZOJ4561: [JLoi2016]圆的异或并 计算几何+treap

    因为本题保证两圆之间只有相包含或相离(不用担心两圆重合 因为我没有RE) 所以每个圆之间的相对位置是确定的  也就是可以按极角排序的, 所以可以按横坐标排序后 扫描同时用treap维护加圆删圆(即遇到 ...

  8. bzoj 3714 [ PA 2014 ] Kuglarz —— 思路+最小生成树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3714 因为每个杯子下最多一个小球,所以从奇偶性就可以看出有没有球: 询问一段区间,等于知道一 ...

  9. hdu1026(bfs+优先队列+打印路径)

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  10. 解决Linux与Windows压缩解压中文文件名乱码(转载)

    转自:http://crazyfeng.com/linux-windows-compress-chinese-filename.html 由于Linux与Windows编码问题,使用Zip Tar 压 ...