以下:内容摘自《Android开发艺术探索》,内容仅用于自我记录学习使用。
任务栈:当启动一个Activity时,系统会创建其实力并把它们一一放入任务栈中,当点击back键时Activity会一一回退,直到栈空为止,系统便会回收这个任务栈。
Activity的启动模式有四种:
1. standard: 标准模式
系统模式模式,每启动一次Activity系统都会重新创建一个新的实例。即该模式允许一个任务栈中有多实例,或者多个实例分属不同的任务栈。这种实例的生命周期符合典型情况下的Activity的生命周期。
这种模式下谁启动了Activity,Activity就会在启动它的那个Activity的任务栈里。即Activity A启动了B,则B会进入到A的任务栈中。
注:非Activity类型的Context时(如ApplicationContext)没有所谓的任务栈,所以使用这种Context启动Activitity会出错。解决方法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,但这个方式启动的Activity是singleTask模式启动的。
2. singleTop: 栈顶复用模式
即新Activity位于栈顶时则不会被重新创建,同时会回调其onNewIntent方法,但不会执行onCreate,onStart方法。如果新Activity不位于栈顶,则会重新创建新Activity。
3. singleTask: 栈内复用模式
即只要新Activity在该任务栈内存在,都不会重新创建,和singTop相同也会回调其onNewIntent方法。在模式下,如果启动一个Activity A,系统首先会寻找是否存在A想要的任务栈,如不存在,则重新创建一个任务栈,否然后创建A的实例放入栈中。如存在该任务栈,系统会看A的实例是否存在该栈中,若存在则会把A调入栈顶,并调用onNewIntent方法。若不存在实例则会创建A的实例并压入栈中。这种模式默认具有clearTop特性,如在S1栈中,有ABC三个Activity, 其中A在栈底,C在镇定,若A以singTask模式启动,则会将BC全部出栈,最后栈中会变成只有A。
4. singleInstance: 单实例模式
这是singleTask的加强模式,即具有此模式的Activity是单独存在于一个任务栈中,即Activity A 是该模式时,若启动A,系统会为A创建一个新的任务栈,然后A独自在这个任务栈中,由于栈内复用特性,后续不会创建新的A实例。除非这个独特的任务栈被销毁。
指定启动模式的方法:
1. 通过AndroidMenifest.xml 配置指定
<activity
android:name="..."
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar" />
2.通过Intent设置标志位指定
Intent intent = new Intent();
intent.setClass(A.this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
FLAG_ACTIVITY_NEWTASK: 即singleTask 模式
FLAG_ACTIVITY_SINGLE_TOP: 即singleTop模式
FLAG_ACTIVITY_CLEAR_TOP: 即清理栈顶功能,会将启动Activity栈顶的Activity全部出栈, 一般和singleTask模式一起使用,在这种情况下,被启动的Activity实例如果已经存在,则系统调用其onNewIntent。如果被启动的Activity采用 standard模式启动,那么它连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶。
FLAG_ACTIVITY_EXCLUDE_FROM_REXENTS: 即该模式启动的Activity不会出资按在历史Activity的列表中,即用户无法通过历史列表回到具有该标志的Activity,相当于Activity xml中的android:excludeFromRecents=“true”
注:两种方式的区别:
1. 优先级: 第二种优先级高于第一种,即两种方式同时存在以第二种为准。
2. 第一种无法指定为FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法指定singleIntstance模式