任务和返回栈

来源:互联网 发布:vm虚拟机安装mac dmg 编辑:程序博客网 时间:2024/04/29 22:24

打开一个最近未使用过的APP时,系统会创建一个新的任务(它是一个后进先出的栈),把APP的主Activity放入其中。默认模式下,后续启动的获得用户焦点的Activity会堆叠在栈顶。当用户按下返回键时,栈顶的Activity会被弹出销毁,并返回前一个Activity(此时为新的栈顶)。一个任务可以包含不同APP的Activity(比如APP A启动了APP B的Activity来拍照),一个Activity在启动新Activity时也可以让后者创建在新任务中(详见下文)。系统有一个唯一的返回栈,它装载的对象是任务。后续创建的获得用户焦点的任务会堆叠在栈顶。用户按下Home键时,当前任务从返回栈中弹出,进入后台。当用户点击主页APP图标重新打开APP的主Activity时,或者用户导航回某个Activity时,该Activity所在的任务就回到返回栈的栈顶。

一、设置Activity启动模式

1、使用manifest文件:

<activity android:launchMode=["standard" | "singleTop" |                              "singleTask" | "singleInstance"]          android:allowTaskReparenting=["false" | "true"]          android:alwaysRetainTaskState=["false" | "true"]          android:clearTaskOnLaunch=["false" | "true"]          android:finishOnTaskLaunch=["false" | "true"]          ... >    ...</activity>

“standard”(默认模式)
系统在启动该Activity的任务中创建一个它的新实例。每个任务中可以有多个它的实例。

“singleTop”
在当前任务的栈顶若已有该Activity实例,则不创建,而是调用其onNewIntent()方法。每个任务中可以有多个它的实例,但栈顶只能有一个。

“singleTask”
首次启动该Acitity时,把它放到一个新的任务中。此后若再启动就调用其onNewIntent()方法。整个系统只有一个它的实例。

“singleInstance”
在”singleTask”的基础上,该Activity所在的任务仅有它这个Activity。它启动的其他Activity都会在新的任务中开启。

allowTaskReparenting
如果设为”true”,且该Activity已启动,则当它被其他任务中的Activity再次启动时,系统会把它移动到刚启动它的任务中。

alwaysRetainTaskState
默认情况下,在某个任务失去用户焦点一段时间后,系统会保留根Activity并清除其他Activity。如果任务中的根Activity把它设为”true”,则系统会一直保留所有Activity(除非系统内存不足需要腾地方)。

clearTaskOnLaunch
与上一个相反,如果任务中的根Activity把它设为”true”,则当任务失去用户焦点后,将保留根Activity并清除其他Activity。

finishOnTaskLaunch
若设为”true”,则当任务失去用户焦点后,该Activity将被销毁。

2、使用Intent标志:
// 给启动Activity所用的intent添加标志
intent.addFlags(Intent.FLAG_ACTIVITY_xxx);

FLAG_ACTIVITY_NEW_TASK
与上述”singleTask”等同。

FLAG_ACTIVITY_SINGLE_TOP
与上述”singleTop”等同。

FLAG_ACTIVITY_CLEAR_TOP
若任务中已有该Activity实例,则清除在其上方的所有Activity,恢复该实例并调用其onNewIntent()方法。

参考资料:
Android > Develop > API Guides > Tasks and Back Stack
https://developer.android.com/guide/components/tasks-and-back-stack.html

备注:
与总览屏幕(Overview Screen)相关的内容请参看:
Android > Develop > API Guides > Overview Screen
https://developer.android.com/guide/components/recents.html

0 0