本文共 1984 字,大约阅读时间需要 6 分钟。
前面的博客中介绍了Activity的生命周期。除了Activity的生命周期外,Activity的启动模式也是一个我们学习Android的难点。
首先我们来介绍一下什么是Activity的启动模式,以及为什么需要Activity的启动模式。下面我们用一个例子来说明:
当我们在默认情况下创建一个Activity的时候,在多次调用该Activity的时候,系统会创建多个该Activity的实例,并把他们放入任务栈中,当我们按back键的时候,会发现这些Activity会以“后进先出”的方式回退,直到栈空时,系统会回收任务栈。
在这之中我们会发现Activity这样重复创建是不是很麻烦,这就出现了Activity的启动模式,目前Activity的启动模式有四种:standard,singleTop,singleTask,singleinstance。
所谓标准模式就是我们最常用的系统默认模式,每次启动一个Activity不管这个Activity的实例是否存在,都会重新创建一个新的Activity实例,这种模式的Activity符合典型情况下的生命周期:它的OnCreat(),OnStart(),onResume()都会被调用。
栈顶复用顾名思义就是在栈顶重复使用,在这种模式下,如果需要启动的Activity已经在任务栈的栈顶,那么任务栈不会被重新创建,同时会调用它的onNewIntent方法,通过此方法的参数我们可以取出当前请求的信息,这种情况下不会调用OnCreat(),OnStart()。
例:当前栈内由栈底到栈顶有ABC三个Activity,假设再次启动C,若C的启动模式为singleTop那么就不会创建C,栈内仍然为ABC。若启动模式为standard,C会被再一次创建,那么栈内情况就是ABCC。
这是一种单例模式,在这种模式下只要Activity在栈中存在,那么多次启动该Activity都不会创建实例,和singleTop一样,系统也会回调其onNewintent。
这种模式下系统首先会寻找A所需要的任务栈,如果任务栈不存在则之间创建任务栈并创建A加入到栈中。如果A所需要的任务栈存在,则再寻找是否存在A的实例,如果存在则将A调到栈顶。如果不存在那么系统会创建A的实例,并压入栈中。
例1:当前栈S1内情况如下:系统要启动Activity的实例 C在栈S2中。则系统首先会创建栈S2,然后再创建Activity的实例C并压入栈中。
图1 图2 图3 图4 图5
例2:当前栈S1内情况如图2:系统要启动Activity的实例 C在栈S1中。则系统首先会找到栈S1,然后再在栈中寻找Activity的实例C,C不存在则创建C的实例并压入栈中(图3)。
例3:当前栈S1内情况如图4:系统要启动Activity的实例 C在栈S1中。则系统首先会找到栈S1,然后再在栈中寻找Activity的实例C,C在栈S1中,则调用C的实例到栈顶(图5)。
在这种模式下的Activity只能单独的运行在一个任务栈中。而且具有所有SingleTask模式的特性。也就是系统要启动A则会首先创建一个任务栈然后将A压入栈。
我在前面多次提到Activity的任务栈,用TaskAffinity这个参数来设置,这个参数用于表示一个Activity所需任务栈的名字,默认情况下所有Activity所需任务栈的名字为其包名。
给Activity指定启动模式有以下两种方法:
1、在AndroidMenifest.xml中设置
2、通过Intent中设置标志位 Intent intent = new Intent(MainActivity.this,MyActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);
其中标志Flags有: FLAG_ACTIVITY_NEW_TASK、 FLAG_ACTIVITY_SINGLE_OP FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS