Activity的启动模式详解

1.1Activity为什么要有启动模式?

        首先得理解”栈”这个概念.所谓的任务栈,是一种”先进后出”的栈结构,就好比给弹夹上子弹,先进去的子弹总是在后面打出.一般情况下,启动一个应用,系统就会为之创建一任务栈,用于放置根Activity,我们如果多次启动同一个activity,系统会创建多个实例并依次将他们放入任务栈.此时如果按back键,这些Activity将依次出栈,当任务栈中没有Activity的时候,系统就会回收此任务栈.回到刚才的那个问题,Activity为什么要有启动模式,其实从刚才的例子就能找到答案:如果每次启动同个activity,系统都会重复创建实例,Android在设计的时候也考虑到这个问题,所以提供了启动模式来修改系统的默认行为.

1.2四种启动模式:standard,singleTop,singleTask,singleInstance

  • standard
           标准启动模式,也是系统默认的启动模式.每次启动一个Activity,都会创建一个新的实例,不管在任务栈中是否已存在相同实例,是一种典型的多实例实现.一个任务栈中可以有多个实例,而每个实例也可以属于不同的任务栈,这句话可能听着有点绕,这里举个例子说明下:
          有两个Activity,分别是A,B,B的启动模式是standard,A启动了B,B就会进入A所在的栈中.非Activity类型的Context(如getApplicationContext)调用startActivity会报错,因为该context没有所谓的任务栈,解决这个问题的方法是给这个待启动的Activity指定FLAG_ACTIVITY_NEW_TASK的标记,这样启动的时候就会为他创建一个新的任务栈,其实此时启动Activity是以singleTask模式启动的,这个需要注意下.

  • singleTop
    栈顶复用模式.在此模式下,如果新启动的Activity已位于任务栈的栈顶了,那么此Activity不会被重复创建,同时它的onNewIntent方法将被调用,我们可以在这个方法中获取当前请求的信息,需要注意的是,这个Activity中的onCreate,onStart,onResume方法不会被调用,因为它没有改变.如果新Activity的实例已经存在,但不在栈顶位置,那么新的Activity任会重新创建.

  • singleTask
    栈內复用模式.这是一种单实例模式,只要这个Activity在栈中存在,不管在栈顶还是栈低,多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会调用其onNewIntent方法,举个例子:如果A-Activity的启动模式是singleTask且请求启动,此时系统首先去找A-Activity需要的任务栈,如果存在,再确认该任务栈是否存在A-Activity的实例,如果有,则将A调到栈顶位置并调用A的onNewIntent方法;如果该任务栈中不存在此Activity实例,则重新创建实例;
    如果系统没有找到A-Activity需要的任务栈,则会创建一个任务栈,然后创建A-Activity的实例并放入栈中.需要注意的是singleTask默认具有clearTop的效果,如果A-Activity不位于目标任务栈的栈顶,启动此Activity的时候会将任务栈中A-Activity之上的实例弹栈

  • singleInstance
    单实例模式.这个singleTask的加强版,除了具备singleTask模式的所有特性外,还加强了一点,此种模式的Activity只能单独位于一个任务栈中,不存在其他的实例.例如:A-Activity的启动模式是singleInstance,被启动时,系统会为它创建一个新的任务栈,并创建A的实例,A单独在这个新的任务栈中.由于栈內复用的特性,后续的启动均不会创建新的A-Activity实例,除非这个任务栈被系统销毁.

1.3给Activity指定启动模式的常用方法及区别

常用方法
a.在menifest中配置launchMode属性:android:launchMode=”singleTask”
b. 通过Intent设置标识位:

        Intent intent = new Intent(this, HomeActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_NEW_TASK);
        BaseDialogHelper.dismissLoadingDialog();
        startActivity(intent)

区别
1.优先级:b>a;
2.限定范围上也有所区别,a无法直接为Activity设置Intent.FLAG_ACTIVITY_CLEAR_TOP,而b方法无法为Activity指定singleInstance模式,

猜你喜欢

转载自blog.csdn.net/Alrict/article/details/81806907