Android 任务栈、Intent.FlAG_ACTIVITY_xxx、Activity四种启动模式

来源:互联网 发布:js 延迟1s 编辑:程序博客网 时间:2024/06/06 20:34

官网地址:http://developer.android.com/guide/components/tasks-and-back-stack.html


任务栈:

> 从主屏幕上点选一个app图标,进入一个app内部;那么即开始了一个task stack。

> 默认情况下,start的activity,都在同一个task stack。


后退栈:

> 从activity-A 跳转到 activity-B,且并没有finish A;

这时A就在back stack中,栈顶就是B

> 后进先出


总结各种活动(activity)和任务(task)的默认行为:
> 当活动A开始活动B,活动A被停止,但系统保持其状态(如滚动位置并输入到表单文本)。

在活动B,如果用户按下后退按钮,活动A恢复其状态的恢复。
> 当用户通过按home键时,当前活动停止,此前的任务进入后台。系统保留之前任务的各活动的状态。

如果用户稍后通过选择开始该任务的启动器图标恢复的任务,则恢复该任务栈顶的活动

> 如果用户按下后退按钮,当前的活动是从堆栈中弹出并销毁。在堆栈上一个活动重新开始。

当一个活动被破坏,系统 不会保留该活动的状态。
活动可以被实例化多次,即使从其他任务启动。(所谓其他任务可能是当前app进程,也可能是其他app进程) 


管理任务

默认情况下,任务里的Activity就是后进先出的

然而,你可能会决定要中断正常的行为。

也许你想在你的应用的活动启动时(而不是放在当前的任务范围内),开始一个新的任务; 

或者,当你开始一个活动,你要提出它的一个现有实例(而不是在后面堆栈的顶部创建一个新的实例); 

或者,你希望你的back栈的所有活动,当用户离开时,除任务栈中的root activity外都将被清除。

那么要实现这些乃至更多:可以在manifest中<activity>添加元素,或在startActivity时,传递一些Intent的Flag


清单元素

taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch  

详见这里


Intent的Flag

> FLAG_ACTIVITY_NEW_TASK  

功能同launchMode: singleTask 相同。(可以用getTaskId()可看当前任务id)

> FLAG_ACTIVITY_CLEAR_TOP

清除当前Activity之上的所有Activity。
比如现在依次打开了4个Activity,A、B、C、D,这时,想从D跳到B,那么在B中,再按back键,应该跳到A,那么C与D就是要清除的了。
Intent intent = new Intent(this, B.class);
Intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
如此,打开B时,C与D就被清除了

> FLAG_ACTIVITY_SINGLE_TOP

如栈中没有该Activity实例,或者有该实例,但不在栈顶,那么就会创建新的实例,并移到栈顶
如栈中已有该Activity实例,且在栈顶,则会调用onNewIntent()

> FLAG_ACTIVITY_REORDER_TO_FRONT

如栈中已有该Activity实例,则将该实例移到栈顶,并调用onNewIntent()

launchMode:

> standard(默认模式)

多次startActivity,会创建多个实例。一个task stack可以有多个实例;每个实例可以属于不同的task stack

> singleTop 

与 Intent.FLAG_ACTIVITY_SINGLE_TOP 功能相同

> singleTask

同一任务栈中,该标识的Acitivty实例只能有一个。(该栈中可以有其他Activity实例)

当start一个该标识的Activity时,会将其之上的其他Activity(如果有)都弹出,

如果实例已经存在,再次打开,会调用onNewIntent()

例,如依次打开Activity,A、B、C、B, 其中B是singleTask,其他为standard
结果:从C打开B,C被弹出,B的onNewIntent()被调用,从B按反回键,后退到A

> singleInstance

该标识的Activity实例存放于一个新的任务栈,栈中有且只有它一个实例
通过该实例start一个其他模式的Activity,如P-Activity,则P将置入之前的任务栈或新的任务栈(当singleInstance标识的Activity就是首次打开的Activity)
如果实例已经存在,再次打开,会调用onNewIntent(),
且不弹出、不影响其他栈中的Activity实例
例,如依次打开Activity,A、B、C、B, 其中B是singleInstance,其他为standard
结果:A、C在同一任务栈,B单独一个任务栈。
   从C打开B,B的onNewIntent()被调用。
   从B按返回键,后退到C


0 0
原创粉丝点击