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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spring相关

使用Intent在活动之间穿梭

Intent是Android中各组件进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据.

8520
来自专栏Android干货

Android项目实战(四十九):Andoird 7.0+相机适配

一、在AndroidManifest.xml 文件中添加 四大组件之一的 <provider>

9800
来自专栏上善若水

036android初级篇之Activity的启动模式

你可以通过定义运行模式来定义Activities如何与Task进行交互。定义的两种方式如下:

13430
来自专栏增长技术

Android finish All activity

25710
来自专栏林冠宏的技术文章

android 如何获取手机的图片、视频、音乐

在android 开发中,很多时候,我们会需要调用到用户本机的照片、视频或者是音乐让用户选择,来进行我们APP对应的操作。 1 button.setOnCli...

22350
来自专栏世界第一语言是java

Android N 7.0、8.0 上自动安装apk问题

如果安装报错,可能是临时文件访问路径没有配置,或者百度上找到的安装代码是旧版本的,7.0以后不在支持,文章最下面有适配的代码。

16720
来自专栏飞雪无情的博客

Android中我为什么发不了邮件--Android邮件发送详解

Android中我为什么发不了邮件???我手机里明明有邮件客户端的,可我为什么不能调用它发送邮件???相信这是很多人会问的问题,手机里有Email客户端,可是偏...

12440
来自专栏非著名程序员

我所理解的Intent 和Intent-filter

1.Intent Intent 是一个消息传递对象,可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包...

21090
来自专栏刘望舒

Android解析ActivityManagerService(二)ActivityTask和Activity栈管理

前言 关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远不够。这一篇我们接着来学习与AMS相关的ActivityTask和Activ...

44390
来自专栏码农笔录

Android N 7.0 上安装apk问题

14330

扫码关注云+社区

领取腾讯云代金券