浅析Android启动模式和标志位

浅析Android启动模式和标志位

1.Android启动模式

首先我们思考这样一个问题,为什么需要不同的启动模式?
不设置其他的启动模式,那么当我们跳转到一个Activity时,不论之前有没有创建过该Activity的实例,系统都会重新创建一个实例,那么重复创建同一个Activity的实例真的有必要嘛?是不是有点傻?优秀的谷歌工程师肯定不会允许这样不合理的情况出现,所以提供了不同的启动模式,那我们来看看四种启动模式,以及他们适用的场景。

  1. standard(默认)
    典型的启动模式也是系统默认的启动模式,当我们跳转到一个Activity时,不管任务栈中有没有该Activity的实例,系统都会重新创建一个实例。在这种模式下,如果是由Activity A跳转到Activity B,那么B实例就会入栈到A所在的任务栈。

  2. singleTop[(栈顶复用模式)
    在该模式下,如果需要跳转的Activity处于任务栈的栈顶,则系统不会创建该Activity的新的实例,而是使用栈顶的Activity,同时调用onNewIntent的回调。如果任务栈中存在该Activity的实例但是不处于栈顶,系统仍然会创建该Activity的实例。

  3. singleTask(栈内复用模式)
    在该模式下,如果需要跳转的Activity A在任务栈中已经存在实例,那么系统不会创建,系统首先会查询是否存在A想要的任务栈,如果不存在,创建一个新的任务栈,然后创建A的实例把A放进该任务栈中,如果存在,这时就要看该任务栈中是否存在该Activity A的实例,如果存在,那就回调onNewIntent,如果不存在,就创建该Activity A的实例,然后放入该任务栈中。假设以下场景,存在任务栈S1,栈内有ABCD四个活动,现在系统想要跳转到B活动,B活动想要的任务栈就是S1,那么此时会回调onNewIntent将B置于栈顶,并将CD活动出栈。

  4. singleInstance(单实例模式)
    这是一种加强版的singleTask模式,此种模式的Activity只能处于一个任务栈中,比如A处于singleInstance模式下,当A启动后,系统会为他单独创建一个任务栈,然后A独自在这个任务栈中,由于栈内复用的特性。后续的请求均不会创建新的实例。

2.如何给Activity指定启动模式?

我们有两种方式给Activity设置启动模式,第一种就是在配置文件中的Activity节点中指定,第二种使用标志位。那我们首先讲讲这两种设置标志位的区别。
区别1:优先级不一样,标志位的优先级高于配置文件,如果同时使用配置文件和标志位,最后结果按照标志位设置。
区别2:限定范围不同,配置文件无法设置FLAG_ACTIVITY_CLEAR_TOP标识,标志位方式无法设置SingleInstance

3.你了解Activity Flags嘛?

Activity的Flags很多,在大部分情况下我们不需要为Activity设置标志位,但是我们还是需要了解,有的Flags对应启动模式,有的Flags会影响Activity的运行状态,简单介绍下面几种重要的Flags

  • FLAG_ACTIVITY_NEW_TASK
    这个Flags的作用是为Activity指定启动模式为:SingleTask,效果和在配置文件中设置相同。

  • FLAG_ACTIVITY_SINGLE_TOP
    看名字就知道这个Flags的作用是为Activity指定启动模式:SingleTop

  • FLAG_ACTIVITY_CLEAR_TOP
    具有此标志位的活动,当他启动时,同一个任务栈中位于他上面的活动都需要出栈。在这种情况下,如果被调用的Activity实例已经存在就会回调onNewIntent方法,SingleTask启动模式默认具有此标志位。

猜你喜欢

转载自blog.csdn.net/weixin_43927892/article/details/105422776