Acitivty的四种启动模式

  在清单文件中声明 Activity 时,您可以使用 <activity> 元素的 launchMode 属性指定 Activity 应该如何与任务关联。

launchMode 属性指定有关应如何将 Activity 启动到任务中的指令。您可以分配给 launchMode 属性的启动模式共有四种:

1.standard(默认模式)

  默认。系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。

2.singleTop

  如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建 Activity 的新实例。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例(但前提是位于返回栈顶部的 Activity 并不是 Activity 的现有实例)。

  例如,假设任务的返回栈包含根 Activity A 以及 Activity B、C 和位于顶部的 D(堆栈是 A-B-C-D;D 位于顶部)。收到针对 D 类 Activity 的 Intent。如果 D 具有默认的 "standard" 启动模式,则会启动该类的新实例,且堆栈会变成 A-B-C-D-D。但是,如果 D 的启动模式是 "singleTop",则 D 的现有实例会通过 onNewIntent() 接收 Intent,因为它位于堆栈的顶部;而堆栈仍为 A-B-C-D。但是,如果收到针对 B 类 Activity 的 Intent,则会向堆栈添加 B 的新实例,即便其启动模式为 "singleTop" 也是如此。  

  注:为某个 Activity 创建新实例时,用户可以按“返回”按钮返回到前一个 Activity。 但是,当 Activity 的现有实例处理新 Intent 时,则在新 Intent 到达 onNewIntent() 之前,用户无法按“返回”按钮返回到 Activity 的状态。

3.singleTask

  系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的onNewIntent() 方法向其传送 Intent,而不是创建新实例。一次只能存在 Activity 的一个实例。

  注:尽管 Activity 在新任务中启动,但是用户按“返回”按钮仍会返回到前一个 Activity。

4.singleInstance

  与 "singleTask" 相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。

  再来看另一示例,Android 浏览器应用声明网络浏览器 Activity 应始终在其自己的任务中打开(通过在 <activity> 元素中指定 singleTask 启动模式)。这意味着,如果您的应用发出打开 Android 浏览器的 Intent,则其 Activity 与您的应用位于不同的任务中。相反,系统会为浏览器启动新任务,或者如果浏览器已有任务正在后台运行,则会将该任务上移一层以处理新 Intent。

  无论 Activity 是在新任务中启动,还是在与启动 Activity 相同的任务中启动,用户按“返回”按钮始终会转到前一个 Activity。 但是,如果启动指定singleTask 启动模式的 Activity,则当某后台任务中存在该 Activity 的实例时,整个任务都会转移到前台。此时,返回栈包括上移到堆栈顶部的任务中的所有 Activity。 图 4 显示了这种情况。

  上图显示如何将启动模式为“singleTask”的 Activity 添加到返回栈。 如果 Activity 已经是某个拥有自己的返回栈的后台任务的一部分,则整个返回栈也会上移到当前任务的顶部。

  如需了解有关在清单文件中使用启动模式的详细信息,请参阅 <activity> 元素文档,其中更详细地讨论了 launchMode 属性和可接受的值。

:使用 launchMode 属性为 Activity 指定的行为可由 Intent 附带的 Activity 启动标志替代,下文将对此进行讨论。

5.如何清空返回栈里的activity

   Intent intent = new Intent(getContext(),HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(intent);
getActivity().finish();

配置HomeActivity时

 <activity android:name="HomeActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
>

最新文章

  1. ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
  2. CentOS 6.6 安装 Node.js
  3. Socket编程注意接收缓冲区大小
  4. gcc -fvisibility=hidden,-fPIC选项
  5. ClassLoader,Thread.currentThread().setContextClassLoader,tomcat的ClassLoader
  6. Android Material Design:ViewPager与android.support.design.widget.TabLayout双向交互联动切换
  7. 【官方文档】《暗黑世界V1.4》API说明!
  8. ZOJ3765---Lights (Splay伸展树)
  9. C# 弗洛伊德(Floyd)算法
  10. 各浏览器的cookie的name个数/最大容量限制测试
  11. 路由页面缓存开启 以及 keep-alive 给你埋下的坑
  12. c# 操作word demo
  13. 导出生成xsl文件
  14. Mac新系统常用设置
  15. war 包tomcat部署和maven的tomcat插件部署的不同
  16. submit插件安装的问题与集成了插件的submit
  17. select * 和select 所有字段的区别
  18. Linux发展历程
  19. Leetcode 1006. 笨阶乘
  20. Node.js内置的文件系统模块(fs)

热门文章

  1. [RxJS] Create a Reusable Operator from Scratch in RxJS
  2. hdu1181 dfs搜索之变形课
  3. Swift String 一些经常用法
  4. 2 AngularJS 1 概念浓缩
  5. ARGB,RGB颜色值表示
  6. 【iOS系列】- iOS吸附效果的实现 之 UICollectionView的使用全解
  7. Android开发pool解析xml
  8. [IT学习]Greatwall
  9. 转载 Url编码
  10. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词