您的位置:首页 > 移动开发 > Android开发

<activity>元素的android:launchMod属性的使用

2012-01-11 10:19 991 查看
AndroidManifest.xml文件中,<activity>元素是使用频率最高的元素,该元素声明了应用中的活动(Activity)。常用的形式如下:

<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中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: