Android 进阶2:Activity 的 Task 与启动模式

来源:互联网 发布:修改jenkins的端口 编辑:程序博客网 时间:2024/04/19 21:32

读完本文你将了解:

    • Android 中的 Task 是什么
    • 四种启动模式
    • 标志位
    • Thanks

Android 中的 Task 是什么

我们知道,一个应用中可能有多个 Activity,而这些 Activity 被以栈的形式管理。当我们新打开 Activity 或者按返回时,会导致 Activity 的入栈/出栈。

这里写图片描述

有时候我们要进行一些跨应用的操作,比如拍照、P 图、分享到朋友圈,这一系列操作中会有多个应用的 Activity 互相调用,安卓系统是如何管理这些不同应用的 Activity 的呢?

答案你已经猜到了,就是使用 Task。

Task 是指在执行特定任务时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈中。

反应在界面上,当我们点击第三个导航菜单按钮,出现在列表中的就是一个个 Task。

这里写图片描述

从上图中可看到,一个应用可以包含多个 Task。

(话说回来,微信小程序启动时应该就是新建一个 Task,这样在列表中就可以独立于微信存在。)

应用中的 Task 名默认为包名,我们可以使用 taskAffinity 标签在 AndroidManifest.xml 中指定某个 Activity 要属于的 Task 名称:

<activity    android:name=".activity.launchmode.SingleTaskActivity"    android:label="singleTask"    android:launchMode="singleTask"    android:taskAffinity="top.shixinzhang.task2"/>

设备主屏幕是大多数 Task 的起点。当用户触摸应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的 Task 将出现在前台。

如果应用 Task 不存在(应用最近未曾使用),则会创建一个新 Task,并且该应用的“主”Activity 将作为堆栈中的根 Activity 打开。

正如我们的日常体验,用户通过按“Home” 键离开任务时,当前 Activity 将停止且其 Task 会进入后台。

这里写图片描述

系统将保留 Task 中每个 Activity 的状态。如果用户稍后通过选择开始任务的启动器图标来恢复任务,则该 Task 将出现在前台并恢复执行堆栈顶部的 Activity。

注意:
后台可以同时运行多个任务。
但是,如果用户同时运行多个后台任务,则系统可能会开始销毁后台 Activity,以回收内存资源,从而导致 Activity 状态丢失。
非 Activity 类型的 Context (比如 ApplicationContext)没有所谓的任务栈。

四种启动模式

1.standard:标准模式,默认的

  • 重复创建多个实例
  • 谁启动了这种模式的 Activity,新 Activity 就会运行在启动者所在的栈中
  • ApplicationContext 启动 standard 的 Activity,会报错

这里写图片描述

2.singleTop:栈顶复用模式

  • 如果位于栈顶则不会重复创建,不调用 onCreateonStart,直接调用 onNewIntent() 方法

这里写图片描述

3.singleTask:栈内复用模式

  • 只要 Activity 在一个栈中有实例,多次启动此 Activity 都不会创建实例,也是直接调用 onNewIntent()
  • 启动 singleTask 的 Activity 时,系统会先找有没有想要的任务栈,没有就新建个任务栈;有就看栈里有没有实例
  • 栈内有实例,就会把该 Activity 调到栈顶,同时 clearTop(之前在它前面的都被清除)
  • 一般用于 MainActivity,因为回到首页后需要清除之前的页面

这里写图片描述

4.singleInstance:栈内唯一

  • 就是霸道一点的 singleTask
  • 启动后新建一个任务栈,这个栈里只会有它一个

这里写图片描述

标志位

除了 AndroidManifest 文件以外,我们也可以在 startActivity() 时,为 Intent add flag 来改变 Activity 的状态:

Intent intent = new Intent(this, SearchActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);

下面是常见的三种与 Task 关联的标志位:

  1. FLAG_ACTIVITY_NEW_TASK
    • 和 singleTask 还是有一定区别的
    • 如果 Activity 对应的 Task 已经存在就不会创建新的 Task,而是把旧的 Task 带到前台,同时其中的 Activity 也会保持之前的状态
    • 一般用于一个类似“桌面”的 Activity,它的作用就是启动许多不同于当前 Task 的 Activity
  2. FLAG_ACTIVITY_CLEAR_TOP
    • 和 singleTask 还是有一定区别的
    • 如果当前 Task 已经有要启动的 Activity,就不会直接创建新的,但是还要分下面两种情况
    • 如果这个 Activity 的启动模式是 standard 并且也没有使用 FLAG_ACTIVITY_SINGLE_TOP,会销毁已有的,新建 Activity
    • 如果是其他启动模式或者使用了 FLAG_ACTIVITY_SINGLE_TOP,就会直接调用已有的的 onNewIntent
    • 一般结合 FLAG_ACTIVITY_NEW_TASK 使用,达到的效果就和 singleTask 差不多了,比如用于通知栏中启动 Activity ,以达到将 Activity 所在 Task 调到前台,同时 clearTop 的效果
  3. FLAG_ACTIVITY_SINGLE_TOP
    • 和 singleTop 效果一致
标志位名称 作用 备注 FLAG_ACTIVITY_REORDER_TO_FRONT 将该 Activity 调整到栈顶 原来栈中情况是A,B,C,D,在D中启动B(加入该flag),栈中的情况会是A,C,D,B.(调用onNewIntent())

Thanks

安卓开发艺术探索

https://developer.android.com/guide/components/tasks-and-back-stack.html?hl=zh-cn

http://blog.csdn.net/guolin_blog/article/details/41087993

http://www.jianshu.com/p/c1386015856a

1 0
原创粉丝点击