http://www.cnblogs.com/yaozhongxiao/p/3365345.html

Activity之间的跳转,或者说加载一个新的Activity,一般对于开发者来说,都不是一个太难的问题。直到后来随着不断的深入,才发现原来Activity的加载还分为四种不同加载模式。灵活的使用合适的加载模式,可以避免产生大量的重复的Activity,从而优化性能,减少系统资源消耗。

四种加载模式具体为:

  • standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
  • singleTop: 检查是否已经存在了一个实例位于Activity Stack的顶部,如果存在就不产生新的实例,反之则调用Activity的newInstance()方法产生一个新实例。
  • singleTask: 在一个新的Task中产生这个实例,以后每次调用都会使用此实例,而避免产生新的实例。
  • singleInstance: 这个基本上跟singleTask一样,只是有一点不同,那就是在这个模式下的Activity实例所处的Task中,只能有这一个Activity实例,而不能有其他的实例。

1.  这些启动模式可以Android清单文件AndroidManifest.xml中,通过<activity>中的launchMode属性进行设置,如:

<activity android:name="MainActivity" android:launchMode="singleTop"><intent-filter><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

2.    另外也可以在代码中通过一些标志进行设置。如:

Intent intent = new Intent(SrcActivity.this, TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent); 


四种加载模式的区别如下:
1. 所属Task的区别:

一般情况下,,“standard”和”singleTop”两种加载模式 源Activity(即new Intent(arg0,arg1)中的第一个参数)和目标Activity(即new Intent(arg0,arg1)中的第二个参数)在同一个Task内 , 除非Intent包括了参数FLAG_ACTIVITY_NEW_TASK,如包含了此参数,目标Activity会起动到新的Task里;

“singleTask”和“singleInstance” 总是把目标Activity作为一个Task的根元素,他们不会被启动到一个其他Task里。

2.  是否允许多个实例的区别:

standard”和”singleTop”可以允许有多个实例,并且可以位于不同的Task中;

singleTop要求如果Activity Stack顶部已经有目标Activity实例,则直接讲Intent发送给该实例,而不创建新实例。如Activity Stack没有该实例,则创建新实例;

“singleTask”和”singleInstance”则只产生一个实例,并且是Task的根元素。“standard”和”singleTop”可以被实例化多次,并且是可以存在于不同的task中;这种实例化时一个task可以包括一个activity的多个实例;

“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。

3、 是否允许其他Activity存在于本Task内的区别:

“singleInstance”独占一个Task,其他Activity均不能存在于此Task中,如果它启动一个新的Activity, 不管新的Activity的launch mode如何,新的Activity都将运行于其他Task里;(intent flag 标志 覆盖activity launchMode 设置 ??)

另外三种模式则可以和其他Activity共存。

4、 是否每次都生成新实例的区别:

“standar” 模式每次都生成一个新的Activity实例;

“singleTop” 的Activity如果在Task的Activity Stack顶部则不生成新实例,直接使用此实例,否则生成一个新实例。

“singleeInstance” 是其所在Task的Activity Stack里的唯一Activity实例,它每次都会被重用。

“singleTask” 如果在Task的Activity Stack的顶部,则接收intent,否则该intent会被丢弃,但仍然会该Task返回前台。

二、 跟Task 有关的 Intent对象中内置的Flag

Intent对象在Android开发中起着举足轻重的作用,其内置了丰富的常量,用于传递数据,下面本文将介绍跟Task有关的一些Flag参数

FLAG_ACTIVITY_BROUGHT_TO_FRONT

这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。

FLAG_ACTIVITY_CLEAR_TOP

如果目标Activity已经运行于当前的Task中,则关闭Activity Stack中在此Activity上方的所有Activity,然后将此Intent传递到该Activity实例内。例如,               假设一个Task的Activity Stack中包含这些Activity:A,B,C,D。如果D调用了startActivity(),并且Intent指向B,那么,C和D都将结束,然后B接                 收到这个Intent,因此,目前stack的状况是:A,B。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

如果设置,这将在Task的Activity Stack中设置一个还原点,当Task恢复时,需要清理Activity。例如下一次Task带着                                                      FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时,这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但是可以回到之前的              Activity。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

如果设置,新的Activity不会在最近启动的Activity的列表中保存。

FLAG_ACTIVITY_FORWARD_RESULT:

如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式                下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的Activity。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY: 这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。

FLAG_ACTIVITY_MULTIPLE_TASK: 不建议使用此标志,除非你自己实现了应用程序启动器。

FLAG_ACTIVITY_NEW_TASK: 将使Activity成为一个新Task的开始。

FLAG_ACTIVITY_NO_ANIMATION: 这个标志将阻止系统进入下一个Activity时应用Acitivity迁移动画。

FLAG_ACTIVITY_NO_HISTORY: 新的Activity将不再历史stack中保留。一旦离开,此Activity就关闭了。

FLAG_ACTIVITY_NO_USER_ACTION: 这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。

FLAG_ACTIVITY_PREVIOUS_IS_TOP: If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.

FLAG_ACTIVITY_REORDER_TO_FRONT: 这个标志将引发已经运行的Activity移动到历史stack的顶端。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED: If set, and this activity is either being started in a new task or bringing to the top an existing task, then it will be launched as the front door of the task. This will result in the application of any affinities needed to have that task in the proper state (either moving activities to or from it), or simply resetting that task to its initial state if needed.

FLAG_ACTIVITY_SINGLE_TOP: 如果Activity位于Activity Stack的顶端,则不再创建一个新的实例。

上面纷杂的Intent内置参数在简单的Android应用时,可以启到比较好的控制作用,但是一旦Android应用过于复杂,那么自定一个Activity List以管理Activity不失于一种更好更高效的管理方法。

参考:

  1. activity 加载模式          http://www.cnblogs.com/wisekingokok/archive/2011/08/21/2147879.html
  2. intent 对象内置flag       http://www.cnblogs.com/wisekingokok/archive/2011/08/21/2147897.html
  3. task and back statck   http://developer.android.com/guide/components/tasks-and-back-stack.html

转载于:https://www.cnblogs.com/leihupqrst/p/3696812.html

Tasks、 activity 及 activity stack - 人间奇迹(转)相关推荐

  1. 【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task

    文章目录 一.打印 Android 中当前运行的 Activity 任务栈信息 二.Activity 任务栈信息分析 三.Activity 在相同 Stack 的不同 Task 情况 一.打印 And ...

  2. this Activity.this Activity.class

    1. this 与 Activity.this this是你当前对象的引用,在你的例子中你肯定在内部类ClickEvent里面实现intent,他指向的是ClickEvent,而不是你要传入的Acti ...

  3. 什么是Activity 和 Activity分类

    什么是Activity:     现在提供的Activity大约有28种,分成8大类.Activity 是workflow一个已经编译的模块,是一个可执行的.可重用和可以组合的单元.基础的Activi ...

  4. Android---Activity 生命周期(三)Stopping Activity Restarting Activity

    1>There are a few of key scenarios in which your activity is stopped and restarted: <翻译>Act ...

  5. 【Android界面实现】Starting an Activity(Activity生命周期金字塔模型)

    转载请注明:http://blog.csdn.net/zhaokaiqiang1992 本文翻译自http://developer.android.com/training/basics/activi ...

  6. 父activity启动子activity并传递数据

    1. Intent component : activity,service,broadcast receiver以及content provider component 与操作系统 通信的一种媒介工 ...

  7. Could not identify launch activity: Default Activity not foundError while Launching activityFailed

    当Android Studio出现这种错误提示时,是未设置默认activity导致的 以下为个人解决方法 点开你的AndroidManifest.xml,找到 <activityandroid: ...

  8. Android studio报错:Could not identify launch activity: Default Activity not found

    报错内容: Could not identify launch activity: Default Activity not found Error while Launching activity ...

  9. Android中Activity各种页面跳转并传值(Activity -> Activity)(Activity -> Fragment)(Activity -> Service)

    目录 Activity -> Activity Activity -> Fragment Fragment -> Activity Activity -> Service Ac ...

最新文章

  1. OC基本数据存储方式
  2. 0102 项目经理的精神病(二)完美
  3. 中画图title函数_MATLAB-基础画图meshgrid
  4. 《精通Python设计模式》学习结构型之享元模式
  5. Java设计链表(不带头结点的单链表)
  6. 边缘计算比云计算强在哪里?终于有人讲明白了
  7. html做预约人数显示,添加预约用户.html
  8. python替换文件中的字符串_Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)...
  9. ABBYY FineReader PDF for Mac(PDF转换工具)
  10. python @staticmethod方法
  11. python曲线拟合预测_python曲线拟合
  12. 一文带你掌握监控进程技术实现
  13. 6.SSH框架整合及简单使用示例
  14. 在Excel中查找/替换时使用换行符
  15. 关于.Net MAUI
  16. Python包 - networkx
  17. React的项目创建
  18. C++实现扫雷(最简单版)
  19. 5+API,AD广告组件
  20. AfterEffect插件-图层排序-js脚本开发-AE插件

热门文章

  1. 蓝桥杯之暴力破解、枚举
  2. crontab——2.php 的 计划任务——Crontab
  3. Centos7 上 用crontab 实现php计划任务
  4. bindService流程
  5. 传马化腾过问“露露事件”启动反腐 腾讯暂无回应
  6. 什么是CCF期刊?CCF期刊中有哪些国内期刊? - 易智编译EaseEediting
  7. win10安装mysql及配置密码演示及服务没有响应控制功能错误处理
  8. 发明专利、实用新型、外观专利有什么区别?
  9. 图解linux netlink
  10. FastGithub:github加速神器,解决github