初识:Activity的启动模式

Activity(界面)启动就会在任务栈中生成“它”的实例(简单理解就是把这个页面放到一个盒子里),用户每次按一下“back键”就会有一个Activity出栈(把这个页面从盒子里取出来扔掉)。那么不可能每次都会去创建一个新的Activity界面实例(每次都整个新的页面往盒子里放,盒子受不了特么爆炸了),当当当。。。Activity启动模式就出现了。废话不多说上图。


初识:Activity的启动模式_第1张图片
四种启动模式

Activity指定启动模式:

方法一:通过AndroidMenifest指定

android:name="com.antonty.MainActivity"

android:configChanges="screenLayout"

android:taskAffinity="com.antony.task1"  //这个taskAffinity

android:launchMode="singleTask"

android:label="@string/app_name">

方法二:通过Intent设置标志位来为Activity指定启动模式

Intent  intent  = new Intent();

intent.setClass(MainActivity.this, SecondActivity.class);

intent.addFlags(Intent);

startActivity(intent);

简单了解四种启动模式:

(1)standard: 标准模式

我们假设界面A, C在一个任务栈中,它们都可以启动界面B

Activity—A 启动 Activity—B(标准模式)  那么创建 B就会进入到任务栈中。

Activity—C 启动 Activity—B(标准模式)  那么又创建个新的 B 进入到任务栈中。

注意:

当我们使用ApplicationContext去启动standard模式的Activity的时候会报错--》

Error: AndroidRuntime: android.util.AndroidRunTimeException , 这是因为standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但是由于非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈,所以就会报错。解决方法是给待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候就会为他创建一个新的任务栈

(2)singleTop:栈顶复用模式。

我们假设目前任务栈中有四个Activity—  A, B, C  D。  A位于栈低,D位于栈顶。 这时候假设又要再次启动D(它为singleTop模式), 那么此时就不会再次创建D了 栈内的情况仍然是 ABCD

(3)singleTask:栈内复用模式

我们假设目前任务栈中有三个Activity— X, Y , Z。  X在栈低, Z在栈顶。这时候假设又要启动X(它为singleTask模式)。 那么此时就不会再创建X了。 系统会把Y,  Z扔出去。把X这个界面放到上面来。

    注意:android:taskAffinity="com.antony.task1"这个属性。

    标识Activity所需要的任务栈名字,默认情况下为应用的包名, TaskAffinity主要和singleTask模式 或者 allowTaskReparenting属性配对使用,其他情况下没有意义。(我们这里只是简单介绍,使用的话大家去搜索一下)

(4)singleInstance: 单实例模式

我们假设Activity—A(singleInstance模式)  当启动A后, 系统单独为它(A) 创建一个新的任务栈,然后A独自在这个新的任务栈中,后续其他请求启动A 都不会再创建A的实例啦,除非这个独特的任务栈被系统销毁。

几个常用的Activity  Flag标记位

FLAG_ACTIVITY_NEW_TASK : 指定Activity为 "singleTask"启动模式

FLAG_ACTIVITY_SINGLE_TOP:指定Activity为 “singleTop”启动模式

FLAG_ACTIVITY_CLEAR_TOP: 具有此标记的Activity 当启动的时候,任务栈中位于这个Activity上面的页面(activity)都要出栈

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。【它等同于在xml中指定activity属性 android:excludeFromRecents="true"】

你可能感兴趣的:(初识:Activity的启动模式)