Tasks、 activity 及 activity stack
一、 Activity的四种加载模式
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. 是否允许多个实例的区别:
二、 跟Task 有关的 Intent对象中内置的Flag
Intent对象在Android开发中起着举足轻重的作用,其内置了丰富的常量,用于传递数据,下面本文将介绍跟Task有关的一些Flag参数
FLAG_ACTIVITY_SINGLE_TOP:
如果Activity位于Activity Stack的顶端,则不再创建一个新的实例。
FLAG_ACTIVITY_NEW_TASK
将使Activity成为一个新Task的开始。
FLAG_ACTIVITY_BROUGHT_TO_FRONT
这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。
FLAG_ACTIVITY_MULTIPLE_TASK
不建议使用此标志,除非你自己实现了应用程序启动器。
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_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.
上面纷杂的Intent内置参数在简单的Android应用时,可以启到比较好的控制作用,但是一旦Android应用过于复杂,那么自定一个Activity List以管理Activity不失于一种更好更高效的管理方法。
三、 Affinity 和 新Task
默认情况下,一个应用程序中的所有Activity都有affinity------也就是说,属于同一个Task中所有Activity有一个设定。然而,每个Activity都可以在元素的taskAffinity特性上设置单独的值。定义在不同应用程序中的Activity可以共享同一个affinity,或者定义在同一个应用程序中的Activity设置不同的affinity。Affinity在两种环境下工作:Intent对象包含FLAG_ACTIVITY_NEW_TASK标志,和Activity的allowTaskReparenting特性设置为“true”。
FLAG_ACTIVITY_NEW_TASK:
之前描述的,一个Activity一般通过调用startActivity()启动并加入到Task中。它同调用者一样,进入同一个Task。然而,如果传递给startActivity()的Intent对象中包含FLAG_ACTIVITY_NEW_TASK时,系统会搜索一个新的Task来容纳新的Activity。通常,如标志的名字所示,是一个新的Task。然而,并不是必须是。如果已经存在一个Task与新Activity的affinity相同,这个Activity就会加入到那个Task中。如果不是,启动一个新的Task。
allowTaskReparenting
如果一个Activity的allowTaskReparenting特性设置为“true”,它就能从启动的Task中移到有着相同affinity的Task(这个Task进入到前台的时候)。例如,在一个旅游的程序中定义了一个可以报告选择城市的天气情况的Activity。它和同一个应用程序的其它Activity一样,有着相同的Affinity(默认的Affinity),并且它允许重新宿主。你的Activity中的一个启动了天气预报,因此,它初始化到和你Activity相同的Task中。然而,当旅游应用程序下一次进入到前台时,天气预报那个Activity将会重新编排并在那个Task中显示。如果从用户的角度出发,一个.apk文件包含多个“应用”的话,你可能希望为关联的Activity设置不同的affinity。
参考:
activity的task相关 http://www.360doc.com/content/12/0118/10/8134611_180127417.shtml
- activity 加载模式 http://www.cnblogs.com/wisekingokok/archive/2011/08/21/2147879.html
- intent 对象内置flag http://www.cnblogs.com/wisekingokok/archive/2011/08/21/2147897.html
- task and back statck http://developer.android.com/guide/components/tasks-and-back-stack.html
Tasks、 activity 及 activity stack的更多相关文章
- Tasks、 activity 及 activity stack - 人间奇迹(转)
http://www.cnblogs.com/yaozhongxiao/p/3365345.html Activity之间的跳转,或者说加载一个新的Activity,一般对于开发者来说,都不是一个 ...
- this Activity.this Activity.class
1. this 与 Activity.this this是你当前对象的引用,在你的例子中你肯定在内部类ClickEvent里面实现intent,他指向的是ClickEvent,而不是你要传入的Acti ...
- Android群英传》读书笔记 (4) 第八章 Activity和Activity调用栈分析 + 第九章 系统信息与安全机制 + 第十章 性能优化
第八章 Activity和Activity调用栈分析 1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重 ...
- Android群英传笔记——第八章:Activity与Activity调用栈分析
Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...
- Android提升篇系列:Activity recreate(Activity 重新创建/自我恢复)机制(一)
注:本文中的recreate是指当内存不足时,Activity被回收,但再次来到此Activity时,系统重新恢复的过程.例如:当Activity A到Activity B时,如果内存不足,A被回收, ...
- 深入Activity,Activity启动模式LaunchMode完全解析
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53221384本文出自[DylanAndroid的博客] 在平时的开发中,我们可 ...
- android Studio项目运行时报错“Could not identify launch activity: Default Activity not found”
出现红色的小叉叉,有点蒙圈的感觉 其实只是因为AndroidManifest.xml里面没有设置运行初始的activity <activity android:name=".MainA ...
- 关于通过adb启动Activity、activity、service以及发送broadcast的命令
一.启动activity: $ adb shell$ am start -n {包名}/{包名}.{活动名称} 如:启动一个名叫MainActivity的活动 # am start -n com.ex ...
- 第四章 Activity和Activity调用栈分析 系统信息与安全机制 性能优化
1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重新回到前台状态的时候会先调用onRestart方法,然 ...
随机推荐
- python使用xlrd模块读写Excel文件的方法
本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...
- Keepalived高可用软件的安装与配置
监听和替换多台服务器之间的来回切换 一.安装tar zxvf keepalived-1.1.15.tar.gzcd keepalived-1.1.15./configure --prefix=/usr ...
- objective-c中自己创建的对象为什么不能调用release
dealloc方法,本就不应该手动调用. 你自己创建的对象,看你代码怎么写的了.例子:NSString *str1 = [NSString stringWithString:@"abc&qu ...
- codeforces 553A . Kyoya and Colored Balls 组合数学
Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are ...
- input file 上传文件
面试的时候遇到一个问题,要求手写的方式上传文件. 本来觉得很简单,但是结果怎么也成功不了. 前台: <form ID="form1" action="AcceptF ...
- Linq常用操作
http://www.cnblogs.com/knowledgesea/p/3897665.html
- jquery ready 延迟
$.holdReady(true);//延迟 $.holdReady(false);//解延迟 用于下载文件的时候,异步操作 $.holdReady(true); $.getScript(" ...
- Guava 9-I/O
字节流和字符流 Guava使用术语”流” 来表示可关闭的,并且在底层资源中有位置状态的I/O数据流.术语”字节流”指的是InputStream或OutputStream,”字符流”指的是Reader ...
- 怎样查看oracle当前的连接数
SQL> select count(*) from v$session #当前的连接数SQL> Select count(*) from v$session where status='A ...
- C++学习2
命名空间(Namespace)主要为了避免命名冲突,其关键字为namespace 在多人代码整合过程中常用到: namespace Li{ //小李的变量声明 ; } namespace Han{ / ...