1.1.2 Activity的4种启动模式
每个应用程序都是由一个或者多个Activity组成,因此,Android内部使用通过回退栈来管理Activity实例。栈是一种后进先出的集合,对于Android来说,当前显示的Activity就在栈顶,当用户点击后退键或者点击应用上的返回按钮,系统就会将栈顶的Activity出栈,此时原来栈顶下的Activity就会变为栈顶显示到设备上。
然而事情可能并不是那么简单,在一些特殊情况下我们可能需要对Activity实例做一些特殊的处理,例如,为了避免重复创建Activity,我们要求一个Activity只有一个实例。好在Android系统为我们提供了这些功能,也就是我们本节要说的Activity的4个启动模式。用户可以在AndroidManifext.xml注册Activity时设置它的启动模式,例如:
<activity
android:name=".MyActivity"
android:launchMode=" singleTask"
android:label="@string/app_name" >
</activity>
Activity的启动模式有4个,分别为standard、singleTop、singleTask、singleInstance,下面我们逐个介绍它们。
1.standard(标准启动模式)
这是Activity的标准启动模式,也是Activity的默认启动模式。在这种模式下启动的Activity可以被多次实例化,即在同一个任务栈中可以存在多个Activity实例,每个实例都会处理一个Intent对象。如果ActivityA的启动模式为standard,并且已经有一个ActivityA被启动,在该ActivityA中调用startActivity时会启动一个新的ActivityA实例。栈的变化如图1-4所示。
▲图1-3 用户界面▲图1-4 栈中有多个ActivityA实例
如果ActivityA是一个非常耗资源的类,那么将会使它所依附的应用消耗更多的系统资源。
2.singleTop
如果一个以singleTop模式启动的Activity的实例已经存在于任务栈的栈顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()函数将Intent对象传递到这个实例中。例如,ActivityA的启动模式为singleTop,并且ActivityA的一个实例已经存在于栈顶中。那么再调用startActivity启动另一个ActivityA时,不会再次创建ActivityA的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()函数。此时任务桟中还是这一个ActivityA的实例。栈内变化如图1-5所示。
如果以singleTop模式启动的Activity的一个实例已经存在于任务桟中,但是不在桟顶,那么它的行为和standard模式相同也会创建一个新的实例。栈内变化如图1-6所示。
▲图1-5 栈顶的ActivityA被重用▲图1-6 不在栈顶,重新创建一个ActivityA
3.singleTask
singleTask模式是常用的启动模式,如果一个Activity设置了该启动模式,那么在一个任务栈中只能有一个该Activity的实例。如果任务栈中还没有该Activity,会新创建一个实例并放在栈顶。但是,如果已经存在Activity,系统会销毁处在该 Activity上的所有Activity,最终让该 Activity实例处于栈顶。最终让该 Activity实例处于栈顶,同时回调该Activity的onNewIntent()函数。栈内变化如图1-7所示。
本文选自《Android开发进阶—从小工到专家》第一章,本站经人民邮电出版社和作者的授权。
版权声明:51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。