Android Activity的启动模式
Android系统采用任务栈的方式来管理Activity实例。
栈是后进先出的数据结构。通常一个应用程序对应一个任务栈,默认情况下,每启动一个Activity都会入栈,处于栈顶位置。用户操作的永远都是栈顶的Activity。
Activity可以层叠摆放,每启动一个新的Activity都会覆盖在原Activity之上(入栈),单击返回按钮,最上面的Activity会被销毁,下面的Activity重新显示。
Activity有4种启动模式:
1、standard模式
上面介绍的模式就是standard模式。standard模式是Activity默认的启动模式。每启动一个Activity就在栈顶创建一个新的实例。
闹钟通常采用此种模式。
2、singleTop模式
如果有时候satndard模式并不合理,比如当前Activity已处于栈顶,再次启动此Activity会重新创建实例,不会直接复用。
singleTop顾名思义,栈顶单例。
将某个Activity的启动模式设置为singleTop,启动此Activity时,会先检查栈顶是否是此Activity的实例,如果是,则直接复用,如果不是,才创建实例。
浏览器的书签通常采用此种模式。
3、singleTask模式
singleTop模式有一定的缺陷,当栈中有此Activity的实例,但未处于栈顶时,仍会创建实例,栈中可能会存在此Activity的多个实例。
singleTask,顾名思义,任务栈中只有一个实例。
启动某个Activity时,会先检查任务栈中是否有该Activity的实例,有就直接复用(把前面所有的Activity出栈),没有才创建并入栈。
浏览器的主界面通常采用此模式。
4、singleInstance模式
会启动一个新的任务栈来管理当前程序中singleInstance模式启动的Activity,在Android系统中,该Activity只有一个实例。
这种模式主要是为了,在不同程序间共享同一个Activity实例。
启动Activity时,若Android系统中不存在该Activity的实例,则创建并入栈;若已存在,不管此实例位于哪个程序的哪个任务栈中,系统都会把该任务栈转移到前台,显示该实例。
来电界面通常使用此模式。
可在AndroidManifest.xml文件对应的 <activity />元素中用 launchMode属性 指定启动模式:
1 <activity 2 android:name=".Activity2" 3 android:label="@string/title_activity_2" 4 android:theme="@style/AppTheme.NoActionBar" 5 android:launchMode="singleTask"> <!-- 指定此Activity的启动模式--> 6 </activity>
缺省时默认为standard模式。