Activity的4种启动模式(2)—Android开发进阶

发表于:2016-6-21 09:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:何红辉    来源:51Testing软件测试网原创

  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软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号