在了解了基本的Activity的生命周期后,我们能够很好的在一个Activity上面做相关的业务。但是这是不够的,因为Android通过任务栈来保存整个APP的Activity,合理的调度任务栈才能够提供良好的用户体验。而栈的结构,相信大家都知道——先进后出的线性表,新启动的Activity会位于任务栈的栈顶,处于活动的状态,其他的Activity虽然不在活动状态了,但是依然保留在任务栈中,处于停止的状态(也就是onStop被触发了,但是onDestory没有被触发)。

一般情况下,返回键和调用finish方法会移除顶部的Activity,然后让后面的Activity恢复活动,但是这也就是在一般情况下。AndroidMainfest.xml文件下面的属性 android:LaunchMode或者Intent的flag能够打破这种状态。

下面会先介绍一下AndroidMainifest的启动模式

  • standard
  • singleTop
  • singleTask
  • singleInstance

1.standard

默认的启动模式,如果不指定Activity的启动模式,则使用这种方式来启动Activity,这种模式下,每次启动都会创建新的实例,创建后的Activity都会覆盖在原Activity上面.下图展示的就是此启动模式下的栈的状态:

  

2.singleTop

如果指定启动Activity为singleTop模式,启动时会判断当前栈顶是不是要启动的Activity,如果是则不创建新的Activity而是直接引用这个Activity,如果不是则创建新的Activity,这种模式通常适用于接受到消息后显示的界面。这种启动模式不会创建新的Activity,但在启动Activity的时候调用onNewIntent()方法。举个例子来说,当任务栈中有A、B、C三个Activity,而C的启动模式是singleTop的,那么在此启动C的时候,系统就不会创建C的实例了,而是会调用C的onNewIntent方法,当前任务栈中依然是A、B、C三个Activity。

3.singleTask

singleTask模式与singleTop类似,不过singleTop是检测栈顶是否是需要启动的Activity,而singleTask则是检测整个栈中是否存在当前需要启动的Activity,如果存在,就将该Activity置于栈顶,并将改Activity以上的Activity都销毁。不过这里是指在同一个App中启动这个singleTask的Activity,如果其他程序以singleTask模式来启动这个Activity,那么将创建一个新的任务栈。不过需要注意的是:如果启动的模式为singleTask的Activity已经在后台的一个任务栈里面了,那么启动后,后台的这个任务栈将一起被切换到前台,如图:

通过查看上图,我们也可以知道,使用这个模式创建的Activity不是在新的任务栈中被打开,就是将已打开的Activity切换到前台。使用的环境,读者自己去领悟吧,在这里就不多赘述了。

4.singleInstance

声明为singleInstance的Activity会出现在一个新的任务栈里面,这个任务栈只存在这一个Activity。此Activity被创建后是被共享的,也就是说再次激活此Activity的时候是不需要创建实例的,而是直接调出此Activity。

注意:如果在一个singleTop 或者 singleInstance 的ActivityA中通过startActivityForResult()方法来启动一个ActivityB,那么系统将直接返回Activity.RESULT_CANCELED而不会再去等待返回,这是由于系统在Framework层做了对这两种启动模式的限制,因为Android开发者认为不同的Task中间,默认是不能传递数据的,如果一定要传递,那就只能通过Intent。

除了在AndroidMainfest声明启动方式,也可以通过Intent来声明此次启动Activity的方式。 还有一些在AndroidMainfest里面做清理任务栈和其他的操作的标签,通过看相关的API文档能够很容易的了解到。这里不做过多的描述。还有就是,了解Activity的任务栈了,但是不要滥用,一定要根据项目的实际需求来使用任务栈.

最新文章

  1. springmvc的数据校验
  2. Android项目实战(二十六):蓝牙连接硬件设备开发规范流程
  3. cpu主频信息
  4. wp8 入门到精通 ImageCompress 图片压缩
  5. Ueditor 标签被过滤
  6. 【转】Linux Page Cache的工作原理
  7. sqoop的安装和使用
  8. jquery判断文本域长度
  9. Redis操作字符串工具类封装,Redis工具类封装
  10. hadoop 异常 datanode未启动
  11. Python实现类似switch...case功能
  12. SVN提交出现“< < < < < < < .mine’无效,路径中具有非法字符”的问题
  13. php soap调用asp.net webservice
  14. InfluxDB读写性能测试
  15. 打开vmvare出现The VMware Authorization Service is not running。
  16. Django处理流程
  17. 「2017 Multi-University Training Contest 7」2017多校训练7
  18. python中print(obj) 与sys.stdout.write()的区别
  19. Python第一个GUI
  20. Azure Powershell script检测登陆并部署ARM Template

热门文章

  1. ubuntu引导修复
  2. btn-default
  3. .net之微信企业号开发(三) 回调模式的接口开发
  4. sql 注入的防范(一)
  5. dom4j解析xml的增加信息
  6. Testng之使用@DataProvider注解做数据驱动【转】
  7. java分布式事务
  8. Yii2中的入口文件环境配置
  9. 网易云信,发送验证码短信C#版代码
  10. ie8下使用knockoutjs遇到的一个模板异常