Android 进阶2:Activity 的 Task 与启动模式
Android 中的 Task 是什么
我们知道,一个应用中可能有多个 Activity,而这些 Activity 被以栈的形式管理。当我们新打开 Activity 或者者按返回时,会导致 Activity 的入栈/出栈。
[图片上传失败…(image-b73788-1548163287120)]
有时候我们要进行少量跨应用的操作,比方拍照、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 会进入后端。
[图片上传失败…(image-3ba444-1548163287121)]
系统将保留 Task 中每个 Activity 的状态。假如客户稍后通过选择开始任务的启动器图标来恢复任务,则该 Task 将出现在前端并恢复执行堆栈顶部的 Activity。
注意:
后端可以同时运行多个任务。
但是,假如客户同时运行多个后端任务,则系统可能会开始销毁后端
Activity,以回收内存资源,从而导致 Activity 状态丢失。
非 Activity 类型的 Context (比方ApplicationContext)没有所谓的任务栈。
标题四种启动模式
1.standard:标准模式,默认的
- 重复创立多个实例
- 谁启动了这种模式的 Activity,新 Activity 就会运行在启动者所在的栈中
ApplicationContext 启动 standard 的 Activity,会报错
在这里插入图片形容
2.singleTop:栈顶复用模式
假如位于栈顶则不会重复创立,不调用 onCreate 和 onStart,直接调用 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 关联的标志位:
FLAG_ACTIVITY_NEW_TASK
- 和 singleTask 还是有肯定区别的
- 假如 Activity 对应的 Task 已经存在就不会创立新的 Task,而是把旧的 Task 带到前端,同时其中的 Activity也会保持之前的状态
- 一般用于一个相似“桌面”的 Activity,它的作用就是启动许多不同于当前 Task 的 Activity
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 的效果
FLAG_ACTIVITY_SINGLE_TOP
- 和 singleTop 效果一致
[图片上传失败…(image-71e730-1548163287121)]
喜欢的话请帮忙转发一下能让更多有需要的人看到吧,有些技术上的问题大家可以多讨论一下。
image
image
以上Android资料以及更多Android相关资料及面试经验可在QQ群里获取:936903570。有加群的朋友请记得备注上简书,谢谢。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android 进阶2:Activity 的 Task 与启动模式