<activity>元素的android:launchMod属性的使用
2012-01-11 10:19
991 查看
AndroidManifest.xml文件中,<activity>元素是使用频率最高的元素,该元素声明了应用中的活动(Activity)。常用的形式如下:
另外,该<activity>元素还有个android:launchMode属性,该launchMode属性主要用来控制Activity和Task的关系,下面是该属性的取值及含义:
1,standard是该属性的默认值,是默认的任务模式。在没有其他因素的影响下,当调用方通过Intent启动此活动时,该Activity会被构造出一个新实例并被加入到调用者的任务栈中去。
2,singleTop与standard基本一致,仅在被请求的Activity正好位于栈顶时情况有所区别。对于launchMode属性等于singleTop的Activity,不再构造新的实例加入到Task栈中,而是将新收到的Intent发送给栈顶的Activity,栈顶的Activity可以通过重载onNewIntent方法来处理新的Intent。这个模式降低了activity位于栈顶时的一些重复开销。
3,singleTask,当启动具有此项配置的Activity的时候,会先在系统中查找和它的属性值 taskAffinity值相同的任务是否存在;如果存在这样的任务,此Activity就会在这个任务中启动,否则就在新任务中启动。因此,如果我们想使得"singleTask"配置模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。
如果设置了"singleTask"启动模式的Activity启动时找到了相同taskAffinity
的任务,系统将在已存在的任务中寻找该Activity的实例,并将此Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。另外,要想taskAffinity属性相同的Activity被放在同一个Task中,<activity>中的allowTaskReparenting属性需设置为true,或者调用方将Intent的flag添加FLAG_ACTIVITY_NEW_TASK时才会生效。
4,singleInstance,该Activity是它所在的任务栈中仅有的一个Activity,其它Activity会被放入别的Task中进行。
借用别人的总结:
standard模式,可以多次实例化,同一任务栈中可以存在多个该Activity的实例。
singleTop模式,可以多次实例化,但是不会有多个相邻的Activity实例,当堆栈的顶部为相同的Activity时,会调用onNewIntent函数。
singleTask模式,同一个应用中调用该Activity时,如果该Activity没有被实例化,会在本应用程序的Task内实例化,如果已经实例化,会将Task中其上的Activity销毁后,调用onNewIntent;其它应用程序调用该Activity时,如果该Activity没有被实例化,会创建新的Task并实例化后入栈,如果已经实例化,会销毁其上的Activity,并调用onNewIntent。
singleInstance模式,加载该Activity时如果没有实例化,则会创建新的Task后,实例化入栈,如果已经存在,直接调用onNewIntent,该Activity的Task中不允许启动其它的Activity,任何从该Activity启动的其他Activity都将被放到其他task中。
<activity android:label="@string/app_name" android:name=".HelloAndroidActivity" >
另外,该<activity>元素还有个android:launchMode属性,该launchMode属性主要用来控制Activity和Task的关系,下面是该属性的取值及含义:
1,standard是该属性的默认值,是默认的任务模式。在没有其他因素的影响下,当调用方通过Intent启动此活动时,该Activity会被构造出一个新实例并被加入到调用者的任务栈中去。
2,singleTop与standard基本一致,仅在被请求的Activity正好位于栈顶时情况有所区别。对于launchMode属性等于singleTop的Activity,不再构造新的实例加入到Task栈中,而是将新收到的Intent发送给栈顶的Activity,栈顶的Activity可以通过重载onNewIntent方法来处理新的Intent。这个模式降低了activity位于栈顶时的一些重复开销。
3,singleTask,当启动具有此项配置的Activity的时候,会先在系统中查找和它的属性值 taskAffinity值相同的任务是否存在;如果存在这样的任务,此Activity就会在这个任务中启动,否则就在新任务中启动。因此,如果我们想使得"singleTask"配置模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。
如果设置了"singleTask"启动模式的Activity启动时找到了相同taskAffinity
的任务,系统将在已存在的任务中寻找该Activity的实例,并将此Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。另外,要想taskAffinity属性相同的Activity被放在同一个Task中,<activity>中的allowTaskReparenting属性需设置为true,或者调用方将Intent的flag添加FLAG_ACTIVITY_NEW_TASK时才会生效。
<activity android:label="@string/app_name" android:launchMode="singleTask" android:name=".HelloAndroidActivity" android:taskAffinity="hello" android:allowTaskReparenting="true" >
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
4,singleInstance,该Activity是它所在的任务栈中仅有的一个Activity,其它Activity会被放入别的Task中进行。
借用别人的总结:
standard模式,可以多次实例化,同一任务栈中可以存在多个该Activity的实例。
singleTop模式,可以多次实例化,但是不会有多个相邻的Activity实例,当堆栈的顶部为相同的Activity时,会调用onNewIntent函数。
singleTask模式,同一个应用中调用该Activity时,如果该Activity没有被实例化,会在本应用程序的Task内实例化,如果已经实例化,会将Task中其上的Activity销毁后,调用onNewIntent;其它应用程序调用该Activity时,如果该Activity没有被实例化,会创建新的Task并实例化后入栈,如果已经实例化,会销毁其上的Activity,并调用onNewIntent。
singleInstance模式,加载该Activity时如果没有实例化,则会创建新的Task后,实例化入栈,如果已经存在,直接调用onNewIntent,该Activity的Task中不允许启动其它的Activity,任何从该Activity启动的其他Activity都将被放到其他task中。
相关文章推荐
- Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先看下面的代码: <shape>
- 使用<selector>风格化Android的GridView元素背景
- 在AndroidManifest.xml文件中<activity>的android:windowSoftInputMode属性使用
- <Android>在Activity被非正常杀死并重建时,使用savedInstanceState进行数据恢复的简单实例
- 使用<selector>风格化Android的GridView元素背景
- 使用<selector>风格化Android的GridView元素背景
- <转>Android ORM 框架子 greenDao 使用心得
- <activity>标签的一些属性
- <Android> 在Activity之间进行滑动效果的切换Anim动画
- <Activity>标签下常见属性介绍
- Android 配置文件<activity>元素
- AndroidMainifest标签使用说明3——<activity-alias>
- android studio <item/>标签下不能使用showAsAction属性
- <activity>属性设置
- <jsp:useBean>元素使用全解
- Android中View绘制优化二一---- 使用<include />标签复用布局文件
- android中配置文件property的用途以及使用&lt;转&gt;
- Android/ContentProvider使用<转载>
- <Android>使用系统时间命名文件夹
- <Android>使用ScrollView 实现 ListView 的下拉刷新