Android 进阶2:Activity 的 Task 与启动模式
2017-05-02 16:28
204 查看
读完本文你将了解:
Android 中的 Task 是什么
四种启动模式
标志位
Thanks
![](https://img-blog.csdn.net/20170501233623038?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTI0MDg3Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
有时候我们要进行一些跨应用的操作,比如拍照、P 图、分享到朋友圈,这一系列操作中会有多个应用的 Activity 互相调用,安卓系统是如何管理这些不同应用的 Activity 的呢?
答案你已经猜到了,就是使用 Task。
Task 是指在执行特定任务时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈中。
反应在界面上,当我们点击第三个导航菜单按钮,出现在列表中的就是一个个 Task。
![](https://img-blog.csdn.net/20170502102519260?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTI0MDg3Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
从上图中可看到,一个应用可以包含多个 Task。
(话说回来,微信小程序启动时应该就是新建一个 Task,这样在列表中就可以独立于微信存在。)
应用中的 Task 名默认为包名,我们可以使用
设备主屏幕是大多数 Task 的起点。当用户触摸应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的 Task 将出现在前台。
如果应用 Task 不存在(应用最近未曾使用),则会创建一个新 Task,并且该应用的“主”Activity 将作为堆栈中的根 Activity 打开。
正如我们的日常体验,用户通过按“Home” 键离开任务时,当前 Activity 将停止且其 Task 会进入后台。
![](https://img-blog.csdn.net/20170502102620605?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTI0MDg3Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
系统将保留 Task 中每个 Activity 的状态。如果用户稍后通过选择开始任务的启动器图标来恢复任务,则该 Task 将出现在前台并恢复执行堆栈顶部的 Activity。
注意:
后台可以同时运行多个任务。
但是,如果用户同时运行多个后台任务,则系统可能会开始销毁后台 Activity,以回收内存资源,从而导致 Activity 状态丢失。
非 Activity 类型的 Context (比如 ApplicationContext)没有所谓的任务栈。
重复创建多个实例
谁启动了这种模式的 Activity,新 Activity 就会运行在启动者所在的栈中
ApplicationContext 启动 standard 的 Activity,会报错
![](https://img-blog.csdn.net/20170502162230893?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTI0MDg3Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.singleTop:栈顶复用模式
如果位于栈顶则不会重复创建,不调用
![](https://img-blog.csdn.net/20170502162322691?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTI0MDg3Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3.singleTask:栈内复用模式
只要 Activity 在一个栈中有实例,多次启动此 Activity 都不会创建实例,也是直接调用
启动 singleTask 的 Activity 时,系统会先找有没有想要的任务栈,没有就新建个任务栈;有就看栈里有没有实例
栈内有实例,就会把该 Activity 调到栈顶,同时 clearTop(之前在它前面的都被清除)
一般用于 MainActivity,因为回到首页后需要清除之前的页面
![](https://img-blog.csdn.net/20170502162419162?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTI0MDg3Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4.singleInstance:栈内唯一
就是霸道一点的 singleTask
启动后新建一个任务栈,这个栈里只会有它一个
![](https://img-blog.csdn.net/20170502162528741?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTI0MDg3Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面是常见的三种与 Task 关联的标志位:
FLAG_ACTIVITY_NEW_TASK
和 singleTask 还是有一定区别的
如果 Activity 对应的 Task 已经存在就不会创建新的 Task,而是把旧的 Task 带到前台,同时其中的 Activity 也会保持之前的状态
一般用于一个类似“桌面”的 Activity,它的作用就是启动许多不同于当前 Task 的 Activity
FLAG_ACTIVITY_CLEAR_TOP
和 singleTask 还是有一定区别的
如果当前 Task 已经有要启动的 Activity,就不会直接创建新的,但是还要分下面两种情况
如果这个 Activity 的启动模式是
如果是其他启动模式或者使用了
一般结合
FLAG_ACTIVITY_SINGLE_TOP
和 singleTop 效果一致
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
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:栈顶复用模式
如果位于栈顶则不会重复创建,不调用
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 效果一致
标志位名称 | 作用 | 备注 |
---|---|---|
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
相关文章推荐
- Android 进阶2:Activity 的 Task 与启动模式
- Android中Activity四种启动模式和taskAffinity属性详解
- Android中Activity启动模式SingleTask时点击Home键问题
- Android中Activity四种启动模式和taskAffinity属性详解
- Android中Activity四种启动模式和taskAffinity属性详解
- Android进阶系列2-Activity启动模式
- Android中Activity四种启动模式和taskAffinity属性详解
- Android中Activity四种启动模式和taskAffinity属性详解
- Android中Activity和task,活动亲和力,启动模式,活动状态以及生命周期,激活钝化
- Android应用程序模块详解(任务、启动模式、进程和线程、FLAG_ACTIVITY_NEW_TASK)
- Android中Activity四种启动模式和taskAffinity属性详解
- # Android中Activity四种启动模式和taskAffinity属性详解 #(5)原创分享
- Android多任务切换与Activity启动模式SingleTask之间关系的分析
- Android中Activity四种启动模式和taskAffinity属性详解
- Android中Activity四种启动模式和taskAffinity属性详解
- Android中Activity四种启动模式和taskAffinity属性详解
- Android中Activity四种启动模式和taskAffinity属性详解
- Android多任务切换与Activity启动模式SingleTask之间关系的分析
- # Android中Activity四种启动模式和taskAffinity属性详解 #(2原创分享)
- Android中Activity四种启动模式和taskAffinity属性详解