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

Activity指定启动模式:
方法一:通过AndroidMenifest指定
<activity
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"】
网友评论