一个应用程序通常包含了多个Activity,每个Activity都应该围绕一个用户能够执行的特定动作类型来进行设计,并且能够启动其他的Activity。例如,一个电子邮件的应用程序可能有一个用于显示新邮件列表的Activity。当用户选择一个电子邮件时,就会有一个用于打开电子邮件的新的Activity。
一个Activity甚至能够启动设备上其他应用程序中存在的Activity。例如,如果你的应用程序想要发送一个电子邮件,你能够定义一个执行“发送”动作的Intent,并且可以包含某些数据,如电子邮件地址和邮件内容。然后打开这个来自另一个应用程序的声明了处理这种Intent类型的Activity。在这种场景中,Intent是要发送一封电子邮件,因此一个电子邮件应用程序“撰写”Activity就启动了(如果有多个Activity支持同一个Intent,那么系统会让用户选择其中之一来使用)。当电子邮件被发送后,你的Activity就恢复了,并且这个电子邮件的Activity就像是你的应用程序的一部分。即使这些Activity来自不同的应用程序,Android也能把这些Activity保持在同一个任务中,从而给用户维持这样无缝的用户体验。
一个任务(task)就是一个在执行某项工作时与用户进行交互的Activity的集合。这些Activity按照被打开的顺序依次被安排在一个堆栈中(回退堆栈)。
设备的主屏是大多数任务的启动位置,当用户触摸一个应用程序启动器中图标(或者触摸主屏上的一个快捷图标),应用程序的任务就会在前台显示。如果相关应用程序的任务不存在(最近没有使用对应的应用程序),那么就会有一个新的任务被创建,并且应用程序打开的“主”Activity会作为任务中的根Activity。
在当前的Activity启动了另一个Activity时,这个新的Activity被放到了堆栈的顶部,并且带有焦点。前一个Activity依然保持在堆栈中,但是它出终止状态。当一个Activity终止的时候,系统会保留用户界面的当前状态。当用户按下回退按钮时,当前的Activity从堆栈的顶部弹出(这个Activity被销毁),并且前一个Activity恢复(之前UI被保存的状态)。堆栈中的Activity不会被重新排列,它只是被压入和弹出堆栈---被当前Activity启动时压入到堆栈的顶部,在使用回退按钮离开时从堆栈中弹出。因此,回退堆栈的操作跟后进先出的对象结构是一样的。图1用一个时间表显示了当前回退堆栈中的Activity之间在每个时间点的处理过程
图1. 显示了如何把任务中的每个新的Activity添加到回退堆栈中。在用户按下回退按钮时,当前Activity被销毁,并且前一个Activity被恢复。
如果用户继续按回退按钮,那么堆栈中的每个Activity会被依次弹出,前一个Activity会被显示,直到用户返回主屏(或者返回到任务开始时运行的那个Activity)。当所有的Activity从堆栈中被删除时,这个任务就不再存在了。
一个任务是在用户开始一个新任务或通过主页(Home)按钮返回主屏时,能够转移到后台的一个内聚单元。在后台的时候,任务中的所有Activity都是被终止的,但是针对这个任务的回退堆栈则完整的保留着---这个任务只是在另一个任务发生时失去焦点,如图2中所示,
图2. 两个任务:任务B在前台接受用户交互,而任务则A在后台等待被恢复。
一个任务能够返回到前台,以便用户能够取回他们离开时的状态。例如,假设当前任务A在它的堆栈中有三个Activity---有两个在当前Activity之下。用户按下主页(Home)按钮,然后从应用程序启动器中启动一个的新的应用。当这个新的应用在主屏中显示时,任务A就会被转移到后台。在新的应用启动时,系统会给这个应用启动一个带有自己的Activity堆栈的任务B。跟这个任务B的应用交互后,用户再次返回到主页(Home),并且选择了最初启动任务A的应用。现在,任务A会返回到前台---它的堆栈中所有的三个Activity是完整的,并且在堆栈顶部的Activity被恢复。在这个时点,用户也能够通过主页按钮和选择启动任务B的应用的图标返回到任务B(或者通过触屏和控制主页按钮来显示最近的任务,并选择其中之一)。这就是基于Android的多任务的例子。
注意:后台中可以同时拥有多个任务,但是如果用户同时运行了很多后台任务,系统为了回收内存可能开始销毁一些后台的Activity,从而导致Activity的状态丢失。
因为回退堆栈中的Activity不曾被重新排列,因此如果允许用户从多个Activity中启动一个特殊的Activity,那么就会创建一个新的Activity实例,并且在堆栈的顶部弹出(而不是把之前的Activity实例带到堆栈的顶端)。这样在你的应用程序中一个Activity就可能被实例化多次(甚至来自不同任务),如图3所示。
图3. 一个Activity被实例化多次
这样,如果用户使用回退按钮向后导航,那么Activity的每个实例就按照被打开顺序依次显示(每一个都带有自己的UI状态)。但是如果你不想让一个Activity被实例化多次,你可以编辑这个行为,如何编辑会在稍后的管理任务(Managing Tasks)一节中讨论。
Activity和task的默认行为的总结:
1.当Activity A启动Activity B时,ActivityA被终止,但是系统保留了它的状态(如滚动条的位置和录入表单的文本)。如果用户在Activity B中按回退按钮,Activity A会使用被保存的状态来进行恢复。
2.当用户通过按主页(Home)按钮离开一个任务时,当前的Activity会被终止,并且被放入后台。系统会保留任务中每个Activity的状态。如果用户随后通过选择启动图标来恢复这个任务,那么任务会来到前台,并且恢复了堆栈顶部的Activity。
3.如果用户按下回退按钮,当前的Activity会从堆栈中被弹出并且被销毁。堆栈中的前一个Activity会被恢复。Activity被销毁时,系统不会保留Activity的状态。
4.Activity能够被实例化多次,甚至来自其他任务。
注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。
如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar
分享到:
相关推荐
android 任务跟回退堆栈
Android提供了一种叫做“回退栈”(Back Stack)的概念,即当用户点击设备的返回键时,系统会从当前Activity弹出,恢复上一个Activity,这就是任务的回退操作。在任务栈中,Activity的顺序反映了用户的历史操作路径...
这样,库会自动处理Fragment的添加和回退操作。 除了基本的切换功能,`InstaLikeFragmentTransaction`还提供了其他实用功能,比如监听Fragment的切换事件,以便在切换时执行特定的操作,或者在用户回退时做出相应的...
综上所述,升级回退概要设计围绕finwatch、upgrade与rollback三个核心接口展开,通过多层设计确保了系统升级与回退操作的全面性、灵活性和安全性。每层设计都细致地考虑了功能实现、环境适应与错误预防,构成了一个...
下面将详细介绍Android Fragment回退栈的原理、使用方法以及实践中的常见问题。 ### 1. Fragment回退栈的原理 Fragment回退栈是由Android系统自动维护的一个数据结构,本质上是一个`FragmentManager`内部的`...
"Android Fragment堆栈控制器"主要涉及到如何有效地管理Fragment的生命周期和导航状态,确保用户在应用程序中的操作流程得以正确记录和恢复。 在Android中,FragmentManager是管理Fragment的主要工具,它提供了添加...
工作流中的回退业务实现是流程管理中的一个重要环节,它涉及到流程执行的错误纠正和效率优化。回退,或者说Rollback WorkItem,是指在工作流系统中,参与者主动将已经执行过的任务从待办任务列表中回退,以便某个...
支持Git和其他版本控制系统,开发者可以方便地进行版本控制操作,如提交、回退、分支管理和合并。 ### 8. **单元测试与UI测试** Android Studio内置JUnit和 Espresso测试框架,支持编写单元测试和UI测试,确保代码...
11. **Jetpack Navigation**:Android Jetpack组件之一,它提供了一种统一的方式来管理应用内的导航,包括设置目的地、处理动作和回退栈。 12. **LiveData与Room数据库**:LiveData是一种观察者模式的实现,能够...
- **任务(Task)**:在Android中,任务是一系列按堆栈方式组织的Activity,它们共享相同的上下文,用户可以通过返回键逐个回退。任务可以看作是用户完成一项操作的一组界面。 - **任务管理器**:负责创建、维护和...
然而,许多设备仍然运行着低于API Level 11的系统,这就需要v7 AppCompat库来提供一个回退解决方案。通过AppCompat库,开发者可以在API Level 8及以上版本的设备上使用ActionBar特性,从而实现统一的用户界面。 ...
在升级或回退Gradle版本时,开发者通常需要确保与Android Studio和项目的兼容性。可以访问官方分布网址(https://services.gradle.org/distributions/)来查找不同版本的Gradle,以满足特定需求。 在使用这个压缩包...
所谓**回退(RollbackWorkItem)**,是指参与者主动将自己待办任务列表中的任务回退到已执行过的人工节点,以便进行重新处理或修正错误。这种机制的存在极大地增强了工作流系统的灵活性和适应性。 #### 为什么需要...
此外,自Android 3.0(API级别11)开始,系统引入了`ActivityOptions`和`TaskStackBuilder`,允许开发者更灵活地控制任务切换和回退行为。例如,你可以通过`TaskStackBuilder`创建一个新的任务栈,使得按下多任务键...
`DialogFragment`是`Fragment`的子类,可以直接托管一个`Dialog`,并且可以更好地处理生命周期和回退栈管理。 8. **资源文件管理** - 项目中的资源文件,如图片、字符串、颜色等,都被放在相应的资源目录下,如`...
总的来说,理解如何在Android中管理和利用Activity堆栈以及选择合适的方法(如ActivityGroup或Fragment)来实现自定义回退功能,对于开发具有深度导航的应用至关重要。随着Android API的不断更新,开发者应始终关注...
- `fragment`:扩展了Android的Fragment类,使得在低版本Android上也能使用Fragment特性,如回退栈管理和多屏幕支持。 - `design`:包含了Material Design组件和行为,如TabLayout、Snackbar和CoordinatorLayout。...
2. **DialogFragment**: Android 推荐使用 DialogFragment 替换直接使用 Dialog,因为它更好地处理了生命周期和回退栈管理。源码中会包含 DialogFragment 的子类,展示了如何扩展它以实现自定义功能。 3. **Builder...
在安卓(Android)系统中,任务管理器是一个至关重要的组件,它负责监控和管理设备上运行的应用程序和服务。本资源“基于安卓Android的任务管理器源码.zip”提供了一个实现此类功能的源代码实例,这对于理解Android...
1. **Activity Manager**:负责管理所有应用程序生命周期和通常的导航回退堆栈。 2. **Window Manager**:管理所有屏幕窗口的布局,决定每个窗口的位置和大小。 3. **Content Providers**:提供数据访问机制,使不同...