[本文的图片来源于google SDK文档]
基本概念
task是一系列activity的集合, 这些activity通常因为同一目的而启动, 系统将这些activity按照创建的顺序组织在栈中(也就是所谓的back
stack). 每一个task都拥有一个仅属于它的back stack.
例如一个联系人app, 当新建一个联系人时, 需要为这个联系人指定头像.
这时会启动图片浏览器选择一张图片作为头像, 选择完成之后切换回联系人app. 在这个过程中, 至少会启动2个activity, 系统会将这2个activity安排在同一个task中, 给用户的感觉就好像是这2个activity是属于同一个app的.
home screen是大多数task创建的场所. 当用户点击home
screen的app图标时, 通常会新建一个task, 并将该app的"main activity"作为back stack中的root元素. 如果当前activity启动了另一个activity,
新的activity会被压入back stack中并获得焦点. 前一个activity仍然在back stack栈中, 但处于stopped状态. 一个处于stopped状态的activity在内存中存有它的状态数据.
如果用户点击back键, 当前activity将从back stack中弹出并被系统销毁(调用了onDestroy()方法), 栈中的前一个activity成为新的栈顶元素并获得焦点(它的状态数据不会丢失).
栈中的activity不会有重新排序的机会,
back stack只是简单的压入或弹出activity--当前activity启动了新的activity时将新的activity压入栈中, 当用户点击back键时弹出当前的activity, 仅此而已.
如果用户不停的点击back键, back stack中的activity将不断从栈中弹出, 直到回到home
screen. 当栈中所有的activity都已出栈时, 这个back stack和task将不复存在.
下图是一个简单的示例:
foreground task和background task
Task可以分为foreground
task和background task. 当用户按下home键时, 当前task就会从foreground task变成background task. 如果一个task变为background task, 那么栈中的所有activity都将处于stopped状态. Task也可以从background task恢复为foreground task, 比如用户在home screen界面中再次点击某个task根元素的activity的图标.下图演示了2个task的情形: 如果用户重新点击了activity1的图片, 那么task A将重新成为foreground task, 而且task A中的activity3将恢复为运行状态.
Background
task中的所有activity均处于stopped状态, 而foreground task中除栈顶activity之外的其他activity也处于stopped状态, 系统可能由于内存不足的缘故摧毁后台activity—这可能导致数据的丢失. 关于如何防止数据丢失, 请参考我的另一篇博文http://coolxing.iteye.com/blog/1279447. 如果一个后台activity被系统摧毁, 其在栈中的位置仍然保留着, 当用户按下back键定位到已被摧毁的activity时, 会重建这个activity.
Activity的多重实例
一个activity可能会被多次实例化, 这些activity的实例化对象可能存在与同一个task中, 也可能存在于不同的task中.
上图的HomeActivity用于2个实例, 且这2个实例存在于同一个task中.
如果开发者不希望一个activity存在多个实例对象, 可以在androidManifest.xml文件中进行配置, 或者通过Intent的Flag属性进行设定.
管理task和back stack
由系统自动管理的task和back stack通常情况下可以很好的工作,
开发者不应该介入. 如果出于某些特殊的考虑需要介入对task和back stack的管理, android也提供了相应的途径:可以为androidManifest.xml文件的<activity>标签设置相应的属性, 也可以给启动activity的intent设置flag属性. 如果同时设置了2者, 那么将以intent的flag属性为准.
在manifest文件中设置launch mode
<activity>标签的launchMode属性的值可能为:
1. “standard”, launchMode属性的默认值. 表示该activity启动后将压入当前back
stack中, 该activity可以存在多重实例, 这些多重实例既可以分布在不同的task中, 也可以分布在同一个task中.
2. “singleTop”. 表示启动该activity时, 如果这个activity已经是当前task的栈顶activity, 那么将不再创建新的activity,
其余情形同”standard”. 例如某个task中包含4个activity, 分别为A-B-C-D, activity D处于back stack的栈顶, 且D的launchMode属性为”singleTop”. 如果此时再次启动了activity D, 由于activity D已经处于栈顶, 此时不会再次创建activity D的实例, 当前back stack中拥有的activity仍然是A-B-C-D. 但是如果D的launchMode为”standard”, 那么会再次创建新的activity D的实例, 并将其压入栈中, back stack中拥有的activity将变化为A-B-C-D-D.
3. “singleTask”. 表示启动该activity时, 如果这个activity尚未在任何task中存在实例, 将新建一个task, 然后把该activity压入这个新的task中. 如果在某个task中已经存在一个该activity的实例对象, 将不再创建这个activity,
但是activity所在的task将成为foreground task.
4. “singleInstance”. 与”singleTask”类似, 不同的是”singleInstance”的activity所在的task不能拥有其他activity.
设置intent的flag属性
通过startActivity()方法启动一个activity需要一个intent, 设置intent的flag属性可以指定待启动的activity的launchMode. Intent的flag属性的可选值有:
1. FLAG_ACTIVITY_NEW_TASK. 对应值为“singleTask”的launchMode.
2. FLAG_ACTIVITY_SINGLE_TOP. 对应值为” singleTop”的launchMode.
3. FLAG_ACTIVITY_CLEAR_TOP. 在launchMode中不存在对应的值. 表示如果待启动的activity已经在当前task的back stack中, 那么不再创建该activity的实例对象, 并将销毁栈中所有位于该activity之前的activity.
- 大小: 84 KB
- 大小: 67.4 KB
- 大小: 41.5 KB
分享到:
相关推荐
redis-stack-server-7.2.0-v9.arm64.snap redis-stack-server-7.2.0-v9.bionic.arm64.tar.gz redis-stack-server-7.2.0-v9.bionic.x86_64.tar.gz redis-stack-server-7.2.0-v9.bullseye.x86_64.tar.gz redis-stack-...
### Android NDK-Stack 使用说明 #### 一、概述 在使用Cocos2d-x、JNI及Android NDK进行开发时,经常会遇到调试困难的问题。尤其是对于C/C++代码的调试,由于涉及到本地代码与Java层之间的交互,使得调试过程变得...
5. **文档完善**:随Z-Stack 3.0.2 SDK一起提供的说明文档详细介绍了如何使用这个协议栈进行开发,包括安装指南、配置步骤、编程示例和故障排查,对于初学者和经验丰富的开发者来说都是宝贵的资源。 6. **跨平台...
**imsdroid与Android Ngn-stack详解** imsdroid是一个专为Android平台设计的开源项目,它致力于实现IP多媒体子系统(IMS)的功能。IMS是一种基于IP网络的通信架构,主要用于提供传统移动通信网络中的语音、视频通话...
在Bacnet-stack-0.8.0中,对BVLL的详细实现意味着堆栈能够有效处理不同大小和类型的数据包,保证了信息传递的准确性和效率。 在实际应用中,开发者可以利用Bacnet-stack-0.8.0提供的API来创建定制化的BACnet应用...
Fragment-Back-Stack Fragment Back Stack manager while displaying fragments on single activity and need to maintain on back press Purpose We know that there is activity stack in Android. We don't need ...
总之,`redis-stack-server-6.2.6-v7.rhel7.x86-64.tar.gz` 是一个包含全套 Redis 功能的打包软件,对于需要强大、灵活和高度可扩展的数据存储和处理解决方案的开发者来说,这是一个理想的选择。通过熟练掌握 Redis ...
Android-SimpleStack项目提供了一个轻量级、易于理解和使用的Backstack实现,它基于Flow库的0.9版本。 Flow是一个由Zhuinden开发的库,用于构建可响应的Android界面,其目标是简化UI组件之间的数据流管理。Simple ...
通过深入阅读和分析这些源码,开发者可以了解Android NGN Stack如何在移动设备上实现高效、可靠的通信服务,并且可以根据自己的需求进行二次开发和创新。无论是对移动通信有兴趣的初学者,还是有经验的开发者,都能...
Z-Stack是TI为Zigbee开发的一套完整的软件解决方案,它包含了网络层、应用层和中间件,为开发者提供了构建Zigbee网络的基础。 在Z-Stack 3.0.2版本中,TI引入了多项改进和优化,以提高网络的稳定性和效率。这一版本...
该压缩包中的"Z-Stack-Mesh-1.0.0 (1).exe"文件很可能是Z-Stack-Mesh-1.0.0的安装程序,用于在开发环境中设置和配置ZigBee协议栈。通常,这个安装包会包含以下组件: 1. **开发工具**:如IAR Embedded Workbench或...
Z-Stack 3.0.2包含了一系列的组件和工具,用于构建、配置和调试Zigbee 3.0网络。这些组件包括网络层、应用层以及中间件,它们协同工作以实现设备间的通信。网络层主要负责网络的形成、维护和管理,应用层则提供了...
Stack-Stack-Stack
3. **Task和Back Stack**:在Android中,Task是执行一系列相关Activity的容器,而Back Stack则是Task内Activity的管理结构,它维护了Activity的历史记录,使得用户可以通过返回键按顺序回到先前的Activity。...
为了确保通信的可靠性和效率,Z-Stack还包括错误检测和纠正机制,如CRC校验和重传策略。此外,Z-Stack还支持安全功能,如AES-128加密,以保护数据不被非法截取或篡改。 在实际应用中,可能还需要考虑一些额外的因素...
ndk-stack 是 Android NDK 中的一个命令行工具,用于分析和调试Native 代码。它可以将崩溃的日志信息转换成可读的调用栈信息,从而帮助开发者快速定位和解决问题。 ndk-stack 的使用方法 在使用 ndk-stack 之前,...
Z-Stack是TI公司开发的一款专门用于Zigbee网络的软件协议栈,它为开发者提供了构建无线传感器网络和物联网应用的基础。Zigbee是一种低功耗、低成本、自组织的无线通信技术,常用于智能家居、工业自动化、智能照明等...
【标题】"f-stack-server-client.rar" 是一个包含F-stack客户端和服务器端实现代码的压缩文件,这为我们提供了一个深入理解F-stack网络框架如何在实际应用中处理客户端和服务器通信的绝佳机会。F-stack通常是一个高...
首先,`CardStackView`基于Android的`RecyclerView`和`CardView`组件。`RecyclerView`是一个高效的数据列表视图,它可以动态地加载和移除视图,以优化内存使用。而`CardView`则提供了具有阴影效果和圆角的卡片样式,...
一个activity也可以打开同一设备上存在于其它应用的activitie,例如,如果你的应用想要发送一个邮件,你可以定义一个intent来执行一个"send"动作并包含一些数据,比如一个地址和一条信息.另一个应用中的一个叫嚣自己...