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

正文

在这里插入图片描述

Android 中的 Task 是什么

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

img

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

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

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

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

img

从上图中可看到,一个应用可以包含多个 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 会进入后台。

img

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

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

四种启动模式

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

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

img

2.singleTop:栈顶复用模式

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

img

3.singleTask:栈内复用模式

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

img

4.singleInstance:栈内唯一

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

img

标志位

除了 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())

后文

更多Android 进阶资料可以扫描免费领取!

目录

img

一、架构师筑基必备技能

1.深入理解Java泛型 2.注解深入浅出 3.并发编程 4.数据传输与序列化 5.Java虚拟机原理 6.高效IO ……img

二、Android百大框架源码解析

1.Retrofit 2.0源码解析 2.Okhttp3源码解析 3.ButterKnife源码解析 4.MPAndroidChart 源码解析 5.Glide源码解析 6.Leakcanary 源码解析 7.Universal-lmage-Loader源码解析 8.EventBus 3.0源码解析 9.zxing源码分析 10.Picasso源码解析 11.LottieAndroid使用详解及源码解析 12.Fresco 源码分析——图片加载流程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ssYMFzmE-1684137918217)(https://docimg3.docs.qq.com/image/UsyU33KyA7r5ekMKwSeO1A.png?w=1080&h=617)]

三、Android性能优化实战解析

1.腾讯Bugly:对字符串匹配算法的一点理解

2.爱奇艺:安卓APP崩溃捕获方案——xCrash

3.字节跳动:深入理解Gradle框架之一:Plugin, Extension, buildSrc

4.百度APP技术:Android H5首屏优化实践

5.支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」

6.携程:从智行 Android 项目看组件化架构实践

7.网易新闻构建优化:如何让你的构建速度“势如闪电”?

…[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aNMom3In-1684137918217)(https://docimg2.docs.qq.com/image/EMPhOtqB9madLlgfPqT4Gg.png?w=1080&h=570)]

四、高级kotlin强化实战

1.Kotlin入门教程 2.Kotlin 实战避坑指南 3.项目实战《Kotlin Jetpack 实战》

​ ● 从一个膜拜大神的 Demo 开始

​ ● Kotlin 写 Gradle 脚本是一种什么体验?

​ ● Kotlin 编程的三重境界

​ ● Kotlin 高阶函数

​ ● Kotlin 泛型

​ ● Kotlin 扩展

​ ● Kotlin 委托

​ ● 协程“不为人知”的调试技巧

​ ● 图解协程:suspendimg

五、Android高级UI开源框架进阶解密

1.SmartRefreshLayout的使用 2.Android之PullToRefresh控件源码解析 3.Android-PullToRefresh下拉刷新库基本用法 4.LoadSir-高效易用的加载反馈页管理框架 5.Android通用LoadingView加载框架详解 6.MPAndroidChart实现LineChart(折线图) 7.hellocharts-android使用指南 8.SmartTable使用指南 9.开源项目android-uitableview介绍 10.ExcelPanel 使用指南 11.Android开源项目SlidingMenu深切解析 12.MaterialDrawer使用指南 img

猜你喜欢

转载自blog.csdn.net/Misdirection_XG/article/details/130721135
今日推荐