android笔记--task和back stack_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > android笔记--task和back stack

android笔记--task和back stack

 2011/11/29 10:14:28  coolxing  http://coolxing.iteye.com  我要评论(0)
  • 摘要:[本文的图片来源于googleSDK文档]基本概念task是一系列activity的集合,这些activity通常因为同一目的而启动,系统将这些activity按照创建的顺序组织在栈中(也就是所谓的backstack).每一个task都拥有一个仅属于它的backstack.例如一个联系人app,当新建一个联系人时,需要为这个联系人指定头像.这时会启动图片浏览器选择一张图片作为头像,选择完成之后切换回联系人app.在这个过程中,至少会启动2个activity
  • 标签:笔记 android Android笔记

[本文的图片来源于google SDK文档]

?

基本概念

task是一系列activity的集合, 这些activity通常因为同一目的而启动, 系统将这些activity按照创建的顺序组织在栈中(也就是所谓的back stack). 每一个task都拥有一个仅属于它的back stack.

例如一个联系人app, 当新建一个联系人时, 需要为这个联系人指定头像. 这时会启动图片浏览器选择一张图片作为头像, 选择完成之后切换回联系人app. 在这个过程中, 至少会启动2activity, 系统会将这2activity安排在同一个task, 给用户的感觉就好像是这2activity是属于同一个app.

home screen是大多数task创建的场所. 当用户点击home screenapp图标时, 通常会新建一个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 stacktask将不复存在.

下图是一个简单的示例:???????

?

foreground taskbackground task

???????? Task可以分为foreground taskbackground task. 当用户按下home键时, 当前task就会从foreground task变成background task. 如果一个task变为background task, 那么栈中的所有activity都将处于stopped状态. Task也可以从background task恢复为foreground task, 比如用户在home screen界面中再次点击某个task根元素的activity的图标.下图演示了2task的情形: 如果用户重新点击了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文件中进行配置, 或者通过IntentFlag属性进行设定.

?

管理taskback stack

???????? 由系统自动管理的taskback stack通常情况下可以很好的工作, 开发者不应该介入. 如果出于某些特殊的考虑需要介入对taskback stack的管理, android也提供了相应的途径:可以为androidManifest.xml文件的<activity>标签设置相应的属性, 也可以给启动activityintent设置flag属性. 如果同时设置了2, 那么将以intentflag属性为准.

?

manifest文件中设置launch mode

<activity>标签的launchMode属性的值可能为:

1.?“standard”, launchMode属性的默认值. 表示该activity启动后将压入当前back stack, activity可以存在多重实例, 这些多重实例既可以分布在不同的task, 也可以分布在同一个task.

2.?“singleTop”. 表示启动该activity, 如果这个activity已经是当前task的栈顶activity, 那么将不再创建新的activity, 其余情形同”standard”. 例如某个task中包含4activity, 分别为A-B-C-D, activity D处于back stack的栈顶, DlaunchMode属性为”singleTop”. 如果此时再次启动了activity D, 由于activity D已经处于栈顶, 此时不会再次创建activity D的实例, 当前back stack中拥有的activity仍然是A-B-C-D. 但是如果DlaunchMode”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.

?

设置intentflag属性

通过startActivity()方法启动一个activity需要一个intent, 设置intentflag属性可以指定待启动的activitylaunchMode. Intentflag属性的可选值有:

1.?FLAG_ACTIVITY_NEW_TASK. 对应值为“singleTask”launchMode.

2.?FLAG_ACTIVITY_SINGLE_TOP. 对应值为” singleTop”launchMode.

3.?FLAG_ACTIVITY_CLEAR_TOP. launchMode中不存在对应的值. 表示如果待启动的activity已经在当前taskback stack, 那么不再创建该activity的实例对象, 并将销毁栈中所有位于该activity之前的activity.

  • 大小: 84 KB
  • 大小: 67.4 KB
  • 大小: 41.5 KB
  • 查看图片附件
发表评论
用户名: 匿名