Android中Activity launchMode简单介绍

来源:互联网 发布:getopt python 编辑:程序博客网 时间:2024/05/08 00:40
 

如何使用

使用很简单,只需要在manifest中对应的Activity元素加入 android:launchMode 属性即可。如下述代码

<activity    android:name=".SingleTaskActivity"    android:label="singleTask launchMode"    android:launchMode="singleTask"></activity>


1.standard

这是launchMode的默认值,Activity不包含android:launchMode或者显示设置为standard的Activity就会使用这种模式。

一旦设置成这个值, 每当有一次Intent请求,就会创建一个新的Activity实例 。举个例子,如果有10个撰写邮件的Intent,那么就会创建10个ComposeMailActivity的实例来处理这些Intent。结果很明显,这种模式会创建某个Activity的多个实例。

小提示:本人曾遇到一个问题,项目中所有Activity继承BaseActivity,BaseActivity继承Activity,所有Activity启动必须走StartActivity.

所以xml中启动Activity设置为StartActivity,没有设置launchMode,所以按照默认的应该为standard,但重复启动,后面的根本无任何响应。手动修改为standard,现象一样。但是改为singleTask,启动Activity后,后面再启动相同或不同的Activity都有响应。原因未知???还请知情者告诉一下,谢谢。

使用场景:standard这种启动模式适合于撰写邮件Activity或者社交网络消息发布Activity。如果你想为每一个intent创建一个Activity处理,那么就是用standard这种模式。

2.singleTop

singleTop其实和standard几乎一样,使用singleTop的Activity也可以创建很多个实例。唯一不同的就是, 如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent方法 。 在singleTop这种模式下,我们需要处理应用这个模式的Activity的onCreate和onNewIntent两个方法,确保逻辑正常。

使用场景

关于singleTop一个典型的使用场景就是搜索功能。假设有一个搜索框,每次搜索查询都会将我们引导至SearchActivity查看结果,为了更好的交互体验,我们在结果页顶部也放置这样的搜索框。

假设一下,SearchActivity启动模式为standard,那么每一个搜索都会创建一个新的SearchActivity实例,10次查询就是10个Activity。当我们想要退回到非SearchActivity,我们需要按返回键10次,这显然太不合理了。

但是如果我们使用singleTop的话,如果SearchActivity在栈顶,当有了新的查询时,不再重新创建SearchAc实例,而是使用当前的SearchActivity来更新结果。当我们需要返回到非SearchActivity只需要按一次返回键即可。使用了singleTop显然比之前要合理。


3.singleTask

singleTask模式和后面的singleInstance模式都是只创建一个实例的。

当intent到来,需要创建singleTask模式Activity的时候,系统会检查Task栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。

 如果singleTask Activity实例已然存在,那么在Activity回退栈中,所有位于该Activity上面的Activity实例都将被销毁掉(销毁过程会调用Activity生命周期回调),这样使得singleTask Activity实例位于栈顶。


4.singleInstance

这个模式和singleTask差不多,因为他们在系统中都只有一份实例。无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来装载该Activity实例。


总结:自己遇到的问题是,已经启动一个App内的某个Activity后,想再启动该App内的其他Activity,发现程序根本不响应。

解决步骤:1. 在xml中的StartActivity中,新增launchMode为singleTask

2.为防止同一个Activity被一直启动多次,再将那些需要保持单例的Activity设置launchMode为singleTask即可。



1 0
原创粉丝点击