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

android-activity启动模式

2016-02-21 11:06 274 查看
activity启动模式有四种,standard,singleInstance,singleTop,singleTask

standard标准模式
默认情况就是这个模式,activity会入栈并居于栈顶,每次启动都会新创建一个实例,但这种模式有个很不合理的地方,比如我们在A页面再次启动A,这样也会创建新实例,栈内就会变成两个A的实例。。

singleTop
这种模式下比默认的要合理一些,当我们要启动的activity已经位于栈顶时再启动它就不会创建实例,而是用我们栈顶已经有的activity,否则将新建实例,例如栈内最下面是A,A上面是B,当我们此时启动B时是不会创建新实例的,因为B已经在栈顶了,如果这时启动A的话A会创建实例,栈内就会变成ABA了。

singleTask

首先说明一点,activity入哪个栈是和调用者有关的,默认情况下是和调用者同栈

此模式下先查找需要的栈是否存在,不存在会创建该栈并创建activity,若该栈存在会在栈内查找是否已经存在将要启动的activity实例,若有则将其上面的所有activity出栈,这样使该activity置于栈顶,不会新建实例,若没找到则会新建实例

singleInstance
这种模式每个activity都会新建一个单独的栈,我们可以用getTaskId来追踪,这种模式有效的解决了不同
程序共享实例,两个程序各有自己栈的情况下想用对方的activity入栈,正常入栈必然会新建实例,现在

都用同一个栈了,则实例也就能共用了。singleInstance属于singleTask的一种特殊形式,它有singleTask的属性,只是每次要检测当前要启动的activity是否存在,不存在就建一个新栈压入activity。

这里说一下这个多栈的情况,我们的栈也是分前台和后台的,我们的activity需要放到什么栈是可以控制的,activity的TaskAffinity属性可以设置栈名,但这个名必须是类似包名的形式,而且不能为当前应用的包名,因为默认栈就是当前应用包名的,所以看不到效果,一般只有在singleTask模式才会去设置这些东西。

启动模式不仅可以在配置文件中用launchMode设置,也可以在代码中设置,intent有addFlags方法,像singleTask就可以在代码中设置intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK);但是这两种方式有些区别,在代码中设置优先级会高些,而且可以和其他的标示一起设置,如clearTop,但singleInstance模式必须要在配置文件中设置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息