本系列文章目录更多精品文章分类

本系列持续更新中....

Activity 的启动模式一共有四种,分别是:standard、singleTop、singleTask、singleInstance 。在实际开发中根据特定的需求选择不同的启动模式。

启动模式的指定,在 AndroidManifest 中通过给 <activity> 标签指定 android:launchMode 属性来选择启动模式。下面来逐一学习。

2.5.1 standard

这种启动模式是 Activity 的默认启动模式。在不进行任何显示指定的情况下,所有的 Activity都是自动使用这种模式启动。前面我们学习过 Android 是通过返回栈来管理 Activity 的。在 standard 模式下,每次启动一个新的 Activity,就会在返回栈中入栈,并且处于栈顶的位置。在这种模式下,系统不会在乎这个 Activity 是否已经在返回栈中了,每次启动都会创建一个新的 Activity。

2.5.2 singleTop

有些情况下你可能觉得 standard 模式不合理,明明已经在栈顶了,为什么再次启动的时候还要创建一个 Activity 实例呢?

这个时候 singleTop 模式就排上用场了,在启动 Activity 的时候如果发现返回栈的栈顶已经是该 Activity 了,则认为可以直接使用它,不会再创建新的 Activity 。

2.5.3 singleTask

使用 singleTask 可以解决重复创建栈顶 Activity 的问题。但是如果 Activity 没有在栈顶的位置,还是可能会创建多个 Activity。

那么有什么版本可以让某个 Activity 在整个应用程序的上下文中只存在一个实例呢?

就要借助 singleTask 模式了,当 Activity 的启动模式指定为 singleTask 的时候,每次启动该 Activity 系统会首先在返回栈中检查是否存在该 Activity的实例,如果已经发现存在了,则直接使用,并 把这个 Activity 上面的所有的 Activity 全部移除栈 如果没有发现,则创建一个新的 Activity 实例。

2.5.4 singleInstance

这个种模式是四种启动模式中最特殊的最复杂的一个了。指定为 singleInstance 模式的 Activity 会启用一个新的返回栈来管理这个 Activity (其实如果 singleTask 模式指定了不同的 taskAffinity,也会启动一个新的返回栈)。这种启动模式的意义?假设一个 Activity 是允许其他的应用程序调用的,我们想实现其他应用程序和我们的应用程序共享这个实例,这个时候使用前面三种方式是无法实现的,因为每个应用程序都会有自己的返回栈,同一个 Activity 在不同的返回栈中入栈时必然是创建了新的实例。而使用 singleInstance 模式就可以解决这个问题了。

这种模式下会有一个单独的返回栈来管理这个 Activity,不管哪个应用程序来访问这个 Activity 都共用一个 返回栈,也就解决了共享 Activity 实例的问题。

在 Activity 中可以通过 getTaskId() 来获取返回栈的 id。

做一个实验:一个程序有 Activity A 、Activity B、Activity C ,其中 A 和 B 都是普通启动模式也就是 standard 模式,C 是 singleInstance 模式。

启动 A ,然后在 A 中启动 C,C 中启动 B。然后依次返回,看到的页面顺序是:B-->A--->C

最新文章

  1. 20145320GDB调试汇编堆栈过程分析
  2. (转)jquery easyui treegrid使用小结 (主要讲的是如何编辑easyui中的行信息包括添加 下拉列表等)
  3. Mysql怎样取消错误命令
  4. express再学习
  5. .NET平台一些概念
  6. 详细介绍Qt,ffmpeg 和SDL开发
  7. spring 5.1.2 mvc RequestMappingHandlerMapping 源码初始化过程
  8. 【转】Python的神奇方法指南
  9. 网卡最大传输单位MTU和巨型帧(Jumbo frame)设置
  10. SpringBoot 2.x 整合ElasticSearch的demo
  11. Windows操作系统下安装Ubuntu虚拟机
  12. 运行成功的Demo(Python+Appium)
  13. keepalived双机热备,安装部署文档
  14. C# Code First 配置
  15. TCP源码—epoll源码及测试
  16. JavaScript高级 面向对象(4)--值类型和引用类型
  17. hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理
  18. BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)
  19. DataGuard相关视图
  20. C#为何不推荐在构造函数中访问虚成员

热门文章

  1. CAS客户端与SpringSecurity集成
  2. Linux Ipsec
  3. 今天遇到的一些关于vsftp的坑!!!
  4. [C]struct结构化数据的一些要点
  5. PCA主成分分析(最大投影方差)
  6. webpack 打包less文件配置
  7. java开发,入职半年。对未来迷茫,如何发展
  8. KnockoutJS-自定义属性绑定
  9. ling to sql创建临时变量 let的使用
  10. Elasticsearch实现复合查询,高亮结果等技巧