android中activity的启动模式

二、启动模式作用

做Android开发朋友都应该知道,应用中每个有效的Activity组件都必须需要在AndroidManifest.xml工程配置文件夹中注册声明。在里面中有很多属性我们可以去配置,如果不配置就使用系统默认的配置属性。其中,我们今天要讨论的Activity启动模式就是属于Activity配置属性之一,叫launchMode,它具有四种启动模式,分别是:1.standard,2.singleTop,3.singleTask,4.singleInstance,一般如果不显示声明,默认为standard模式。

二、启动模式作用
launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。这这里就不详细介绍task,

三、分别详细介绍每种启动模式

1、standard

standard模式是默认的启动模式,不用为<activity>配置android:launchMode属性即可,当然也可以指定值为standard。
standard模式是所启动的Activity都是在同一个task容器栈下,不会重新创建新的task容器栈。先压入栈的Activity实例按顺序入栈底,后入栈在栈顶,处于栈的顶部Activity实例处于活动状态,其他处于非活动状态。按物理返回键,退出当前所处活动状态Activity窗口,这样就会从task容器栈中弹出,显示在手机主屏幕上,从而,有非活动状态转换成活动的状态。其次,standard容器栈可能会存在着相同的Activity实例,只有没调用一次startActivity方法,就会创建目标Activity实例对象压入task容器栈

比如现在有activity1 和 activity2 ,activity1有一个跳转到activity2的button,而activity2又有跳转到activity1的button,测试步骤为

startAvtivity1 — startActivity2 — startAvtivity1 — startAvtivity2,然后点击返回键,界面活动的activity依次是Avtivity1 — Avtivity2 — Avtivity1,由此见得标准启动模式下,你无论启动多少次activity,都会重新实例化该activity,

1、singleTop

AndroidManifest.xml文件中<activity>launchmode属性配置singletop,那么启动实例化Activity,如果task容器栈顶存在已经激活的Activity实例,就会重用当前栈顶的Activity实例,不会再重新去实例化Activity对象。善于思考的朋友可能会问,如果要启动的目标Activity已经有实例化对象存在task容器栈里面,只是现在不处于栈顶,这样情况下,singletop启动模式会创建目标Activity实例吗?答案是肯定的。要启动的目标Activity实例正好处于栈顶,才能重用该实例,其他情况必须创建新实例。

步骤:

在activity2中添加一个startAvtivity2的button,并为startAvtivity2设置singleTop模式,然后

startAvtivity1 — startAvtivity2 — startAvtivity2 — startAvtivity2

点击返回键:

当前栈顶的activity为Avtivity1,由此可见,只要是栈顶存在该实例,则不会再创建新的实例;

3、singleTask

singletask模式,启动的目标Activity实例如果已经存在task容器栈中,不管当前实例处于栈的任何位置,是栈顶也好,栈底也好,还是处于栈中间,只要目标Activity实例处于task容器栈中,都可以重用该Activity实例对象,然后,把处于该Activity实例对象上面全部Activity实例清除掉,并且,task容器栈中永远只有唯一实例对象,不会存在两个相同的实例对象。所以,如果你想你的应用不管怎么启动目标Activity,都只有唯一一个实例对象,就使用这种启动模式。

场景:3个activity,activity2启动模式为singleTask其他俩个为standard;

startAvtivity1 — startAvtivity2 — startAvtivity3 — startAvtivity2

点击返回键,结果:

当前栈顶的activity为Avtivity1,正应正了上面的描述

4、singleInstance

singleInstance启动模式,简单说就是可以共享某个Activity。比如,应用1的任务容器栈中创建了MainActivity实例,应用2也要激活MainActivity,则不需要创建MainActivity实例,直接可以公用MainActivity实例。

尤其值得注意:应用1启动MainActivity,按home键;打开应用2启动应用1的MainActivity实例。在按home键,打开应用1,这时候应用1的界面是应该是处于MainActivity界面实例。
这个还不太好应正,本人暂时也没用过这个模式,但是意义很明确,个人认为最现实的场景应该就是拨打电话这个页面了,无论被哪个应用调用,都能保证这个手机上只开启了一个这样的界面,谁也没见过你手机上有两个打电话的页面吧,呵呵….

总结:

总之,无外乎这4中启动模式,也不难,只是我自己工作中还没尝试过singleInstance这个模式,希望有看到的朋友指点一二;谢谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值