Android四大启动模式详解

Android的Activity是四大组件之一,除了Activity的生命周期外,Activity的启动模式也是非常重要的。为了了解Activity的启动模式,首先我们要知道我们为什么要使用启动模式?启动模式存在的意义是什么?
我们知道,在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例,并把它们一一放入任务栈中,当我们点击back键时,会发现这些Activity会一一回退。知道了Activity的默认启动模式之后,我们就会发现一个问题:多次启动同一个Activity,系统会重复创建多个实例,这样很明显是不合理的,为了解决这个问题就要用到我们说的Activity的启动模式。目前安卓有四种启动模式:standard、singleTop、singleTask和singleInstance,想要更改模式可以在AndroidManifest.xml中activity标签下添加launchMode标签。下面是各种模式的详细介绍:

(一)standard:标准模式,这也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管实例是否已经存在。被创建的实例的生命周期符合典型的Activity的生命周期。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。比如ActivityA 启动了ActivityB(B也是standard模式),那么B就会进入到A所在的栈中。

《Android开发艺术探索》中介绍了:如果我们用ApplicationContext去启动standard模式的时候Activity的时候会报错,错误的原因是因为standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但是由于非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈,所有这就有问题了。解决这个问题的方法是为待启动Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候就会为它创建一个新的任务栈,这时候待启动Activity实际上是一singleTask模式启动的。

活动启动图:
这里写图片描述
上图可以看出来,我们每次启动一个A活动的时候,都会创建一个新的A活动放在当前栈的顶端。点击返回键会回到前一个A活动,直到退出程序。你们可以写一个小Demo自己测试亲自体验一下。

(二)singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶(处于完全可见状态),那么此Activity不会被重新创建。但是如果新的Activity不是位于栈顶(处于不完全可见状态),那么新Activity仍然会重新创建。
在singleTop(栈顶复用模式)下,如果Activity位于栈顶,我们再次启动该方法,那么该方法会回调onNewIntent方法,而onCreate、onStart方法不会被调用。
活动启动图:
这里写图片描述
上图可以看出来,如果活动B位于栈顶时,我们再次启动活动B,则不会创建新的活动B,如果B不位于栈顶,则会创建新的活动B。

(三)singleTask:栈内复用模式。这是一种单实例模式,在这种模式下,一个Activity在一个栈中只能有一个实例,类似单例模式。详细讲解,当一个具有singleTask模式的Activity请求启动后,例如Activity A,系统首先会寻找是否存在A想要的任务栈,如果不存在,就重新创建一个新的任务栈,然后创建A的实例后把A 放到栈中。如果存在A所需要的任务栈,再看Activity A 是否在栈中有实例存在,如果有实例存在,那么系统就会把A调到栈顶并调用onNewIntent方法,如果实例不存在,就创建A的实例并把A压入栈中。
活动启动图:
这里写图片描述
上图可以看出来,活动启动的顺序是A→B→C→D→B,第一次启动B的时候栈内没有实例,系统会创建新的B的实例,但第二次启动B的时候,系统查询任务栈,发现有实例,系统就会把活动B移到栈顶,并且把B之上的所有活动出栈。

(四)singleInstance:单实例模式。这是一种加强的singleTask模式,它除了具有singleTask模式所具有的所有特性外,还加强一点,那就是具有此种模式的Activity只能单独的位于一个任务栈中。简单而言,如果一个活动是singleInstance的启动模式,那么该活动就只能单独位于一个栈中。
活动启动图:
这里写图片描述
图中看出,如果一个活动是singleInstance模式,那么活动C会单独创建一个新的任务栈,而返回栈中,活动C处于的任务栈会先压入返回栈的栈低,再把另外一个活动栈放入返回栈中。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值