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模式。
推荐阅读