Activity回退栈使用

当一个APP启动时,系统会为这个APP创建一个回退栈(任务),用于保存APP所有已经创建的额Activity。当应用启动时,主窗口将第一个被压入回退栈,当显示本应用的其他窗口时,也会按显示顺序创建窗口压入回退栈。回退栈的顶层窗口将会获得焦点,可以与用户交互。当执行Activity的finish方法或者按Back键时,顶层窗口将出栈被销毁,下一个窗户获得焦点同用户交互。例如一个APP有3个窗口,分别为:A、B、C,其中A为主窗口,当从A启动B,在从B启动C,从C启动A时,此时回退栈的顺序为AàBàCàA,最顶层和底层都为A,当按Back时,顶层A会出栈销毁,窗口C会获得焦点,在按Back时,C会出栈,以此类推,当最后A出栈了,回退栈会销毁,程序退出,释放相应资源。

在正常情况下,APP没跳转一个窗口,回退栈就会将新建的这个窗口压入进来,但是我们可以通过设置窗口的launchMode属性或者在跳转时设置通话Intent的setFlags()方法设置窗口的启动模式,来改变回退栈默认的压栈操作。

launchMode的属性有四种种分别为: standard、singleTop、singleTask、singleInstance,其中standard为默认的启动模式。

singleTop模式:

当一个Activity的启动模式设置成singleTop时,当其启动时,会检测回退栈的顶端是不是就是这个窗口,如果是,就不会新建窗口压入回退栈,而是直接显示顶层的窗口,并调用其onNewIntent方法。如果定层不是这个窗口,就会新建窗口压入回退栈。例如一个应用有两个Activity(A,B)其中B的启动模式的singleTop,用户执行的操作为,主窗口启动B,B又启动B,执行完这些回退栈的顺序为 AàB,而不是AàBàB。

singleTask模式:

singleTask模式比较复杂些,可以分为如下几种情况,

在同一个应用内,跳转到一个定义为singleTask模式的窗口,会检测回退栈是否已经有该窗口了,如果有,会销毁压在上面的所有窗口,使其在回退栈顶层获取到焦点,并调用该窗口的onNewIntent方法。如果一个应用有三个Activity(A、B、C)其中B的启动方式为singleTask,用户执行操作为:主窗口A启动B,B启动C,C启动B,这时回退栈里窗口顺序为AàB。

如果调用另一个应用的声明为singleTask模式的窗口,如果该窗口存在,会进行回退栈(任务)切换到该窗口所在的任务中。如果该窗口不存在,会心建一个回退栈,并把该窗口压入新建回退栈中,也会将当前任务切换到新建的回退栈来。

singleInstance模式:

singleInstance模式和singleTask模式非常相似,区别就是singleInstance模式新建的回退栈只能包含一个窗口,貌似这种模式非常少用。

使用Intent的setFlags()方法设置窗口的启动模式。常用的有:

Intent.FLAG_ACTIVITY_SINGLE_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP

Intent.FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_CLEAR_TASK

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

Intent.FLAG_ACTIVITY_SINGLE_TOP:与在launchMode设置singleTop是完全一样的。

Intent.FLAG_ACTIVITY_CLEAR_TOP:

当跳转到一个单独使用Intent.FLAG_ACTIVITY_CLEAR_TOP的Activity时,会检测回退栈是否已经有该窗口了,如果有就会清空压在上面的窗口和自己本身,然后在新建一个新的窗口压入回退栈。如果窗口A跳转到B,B跳转到C,C又调转到B(跳转时给Intent设置了Intent.FLAG_ACTIVITY_CLEAR_TOP),此时回退栈顺序为:AàB,并且会执行B的onCreate方法。

当Intent.FLAG_ACTIVITY_CLEAR_TOP与Intent.FLAG_ACTIVITY_SINGLE_TOP

同时使用,就与在launchMode设置singleTask,并跳转到程序内部的窗口的作用是一样的。

Intent.FLAG_ACTIVITY_NEW_TASK:

与在launchMode设置singleTask,并调用其它应用的声明的singleTask的窗口作用是一样的。

Intent.FLAG_ACTIVITY_CLEAR_TASK:

会清除回退栈中的所有窗口,在新建要显示的窗口并压入回退栈中。但必须与

Intent.FLAG_ACTIVITY_NEW_TASK共同使用才有作用。

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

比较有意思,当设置了Intent.FLAG_ACTIVITY_REORDER_TO_FRONT进行跳转时,会检测回退栈是否有该窗口,如果没有,就新建窗口压入回退栈中。如果有,就把该窗口提到回退栈的顶层。例如 窗口A调转到B,B跳转到C,C调转到B(设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT),那么此时回退栈顺序为AàCàB,而不是 AàBàCàB了。

时间: 2024-08-24 03:37:07

Activity回退栈使用的相关文章

Task 和 Activity 回退栈操作。

首先说一下Task是一个什么概念吧:Task是一个包含activity的列表.没 错,简单的说就是按照启动的先后来排队的一个队列.Back Stack,就是回退栈的意思:那么有什么用?Back Stack是存储一个Task的实现方式,一个容器.它具有栈的特性:后进先出. 那么,依据什么来把activity指定给某个Task? ------默认情况下,根据activity的启动的顺序,加入A启动了B,那么B默认情况下就放到了 A的Task的Back Stack里面啦.当然,你也可以去修改这一个默认

【鹅厂修炼日记(0.1)】几种改变Activity回退栈默认行为的Intent Flag

FLAG_与LaunchMode相比最大的不同是临时性 1.FLAG_ACTIVITY_NEW_TASK: Developer.android.com的说法: (1)在新的task中启动这个Activity, (2)如果已有一个task包含这个Activity,则这个task被带到前台. (3)效果与SingleTask相同. 实验发现,只有从外部(另外的App)启动Activity,并添加FLAG_ACTIVITY_NEW_TASK标识时,表现才与上述相符: 但不具有singleTask的cl

Fragment 事务 回退栈

一些相关API 1.Fragment常用的三个类: android.app.Fragment 定义android.app.FragmentManager 用于在Activity中操作Fragmentandroid.app.FragmentTransaction 保证一些列Fragment操作的原子性.事务 2.FragmentManager可以做的事情:  使用findFragmentById (适用于在静态fragment,不常用)或 findFragmentByTag (适用于动态加载的fr

Android Api Component---翻译任务和回退栈(Tasks and Back Stack)

一个应用程序通常包含多个activity.每一个activity应当围绕一个指定的用户可以执行的并且可以开启其它activity的动作种类被设计.例如,一个emali应用程序也许有一个activity展示新消息列表.当用户选择了一个消息的时候,一个新的activity会打开查看这个消息. 一个activity甚至可以开启设备上的其它应用程序的activity.例如,如果你的应用程序向发送一个邮件消息,你可以定义一个intent执行一个"send"动作并且包含一些像email地址和消息的

Fragment 回退栈 传递参数,点击切换图片使用Fragment ListView

Fragment回退栈  类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化. 如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment. 一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity.   transaction.add(R.id.right, rightFragment); transaction.addToBack

android之Task和Back Stack(回退栈)

通常一个应用程序包括多个Activity,我们在使用程序是,一个Activity到另一个Activity,又到别的Activity,然后我们按下返回键又能按打开的顺序,倒叙返回.android中是怎么做到的?Task和Back Stack与此密不可分. Task存储了一组页面的集合,并且这个集合会被排列到一个叫Back Stack中,保存的目的在于记录Activity的打开顺序. 特点:系统会给每个程序分配唯一的Task和回退栈. 回退栈的特点:先进后出. 改变Activity的排序方式:是通过

任务和回退栈

任务和回退栈 任务(task)是为了完成某种工作而有序地组合在一起的Activity集合.这些Activity可能来自一个应用,也可能来自多个应用.这些Activity按照被打开的顺序被保存在回退栈(back stack)中. 任务通常开始于桌面,当桌面的应用图标被点击时,应用任务来到前台.如果对应的应用的任务还没有,给此应用创建一个新的任务,并且将"main"Activity作为回退栈的根Activity. 当一个Activity打开另一个时,新的Activity将被压入回退栈的栈顶

Android开发-API指南-任务和回退栈

Task 和 Back Stack 英文原文: http://developer.android.com/guide/components/tasks-and-back-stack.html 采集(更新)日期:2014-12-16 在本文中 保存 Activity 状态 管理多个 Task 指定启动模式 处理 affinity 清理回退栈k 启动任务 相关文章 Multitasking the Android Way 参阅 Android 设计 : 导航 <activity> manifest

清空Fragment回退栈中某个Fragment之上的所有Fragment

根据debug信息查看Fragment回退栈的情况,具体debug代码如下: int num = getActivity().getSupportFragmentManager().getBackStackEntryCount(); String numString = "++++++++++++++++++++++++++++++++++Fragment回退栈数量:"+num; TALogger.d("Fragment", numString); for (int