Tasks and Back Stack

原创
2015/09/16 15:52
阅读数 36

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

一个任务就是一个activity的集合,activity都被安排在一个栈里,按activity的打开顺序。

设备home界面是大部分任务启动的地方。当用户触摸应用的启动图标或是快捷方式,应用的任务就会来到前台,如果不存在这个应用的任务,就会创建新的任务,这个应用的mainactivity将作为栈的根activity打开。

当当前的activity启动了另一个,新的activity就会被放到栈的顶部,并获得焦点。而之前的activity则遗留在栈中,但是是暂停状态。当一个activtiy是暂停的,系统会保留当前用户接口的状态。当用户按了回退键,当前activity就会从栈的顶部移除,前一个activity就会恢复。当所有的activity都从栈中移除后,栈就不再存在。

当用户启动一个新的任务或是跳转到home界面,之前的任务就会移到后台。在后台的时候,任务重所有的activity都是暂停的,任务的回退栈会完整保留。

多个任务都会保存在后台,但是如果用户运行了很多任务,系统可能会销毁后台的activity来恢复内存 。这会导致activity 的状态丢失。

所有的activity都可以被实例化多次,甚至是从其他任务。

当系统暂停你的activity,系统如果需要内存可能会完全销毁activtiy。当这发生的时候,activity 的状态信息将会消失。为了避免丢失用户的操作,你需要实现onSaveInstanceState()方法保留他。

如果你想要启动一个activity在新的任务中,或是要启动一个activity,想从原来已存在的activity中获取,或是用户离开任务时,除了rootactivity,其他所有activity都被清除。

要实现这些可以给activity设置属性和flags

<activity>主要有:

taskAffinity、launchMode、allowTaskReparenting、clearTaskOnLaunch、alwaysRetainTaskState、finishOnTaskLaunch

主要的intent flags有:

FKAG_ACTIVITY_NEW_TASK  FKAG_ACTIVITY_CLEAR_TOP  FKAG_ACTIVITY_SINGLE_TOP  

区别activity如何关联任务可以使用<activity>的launchMode元素可以定义的类型有4种

standard(默认类型):默认,系统会创建一个新的activity实例。activity可以被实例化多次,每个实例可以属于不多的任务,一个任务可以有多个实例。

singleTop:如果当前任务的顶部存在这个activity实例,那么系统跳转到这个实力并调用onNewIntent()方法。否则就会创建一个新的activity实例。activity可以实例化多次,每个activity可以属于不同的任务,一个任务也可以有多个实例。

singleTask:系统创建一个新的任务,并且实力化这个activity作为新的任务的根activity。然而如果activity实例存在于一个不同的任务中,系统会跳转到这个已存在实例,调用onNewIntent()方法,而不是创建一个新的方法,只有一个activity实例可以创建。通过activity启动了一个新的任务,返回的时候还是到上一个activity。

singleInstance:和singleTask一样,这个activity总是他的任务重的唯一一个,他启动的其他activity都是在不同任务重。如果你启动的一个activity指定了singleTask模式,如果在后台任务重存在这个activity实例,那么这整个任务都会移到前台,

用launchMode指定的activity行为可以被flags覆盖。

FLAG_ACTIVITY_NEW_TASK:启动一个activity在一个新的任务中,如果一个任务已经运行了这个activity,那么将会把他从后台移到前台,activity会接收到onNewIntent()方法。这与singleTask很像。

FLAG_ACTIVITY_SINGLE_TOP:如果启动的activity就是当前的activity,将会调用onNewIntent()。否则就会创建一个新的activity,与singleTop很像。

FLAG_ACTIVITY_CLEAR_TOP:如果要启动的activity已经在当前的任务中运行了,不需要启动一个新的activity实例,只要恢复这个activity实例,并把他之前的activity都销毁。FLAG_ACTIVITY_CLEAR_TOP经常与FLAG_ACTIVITY_NEW_TASK配合。

affinity是activity属于任务的标志。

应用中所有的activity都有自己的affinity标志。默认一个应用中所有的activity都是属于一个任务。然而,你可以修改一个activity的affinity.不同应用的activity可以共享一个affinity,或是同一个应用的activity可以分配不同的任务affinities。

你可以通过<activity>的taskAffinity属性修改affinity。

taskAffinity是一个字符串,默认是包名。

affinity在两种情况下有用:

1、当启动一个activity使用FLAG_ACTIVITY_NEW_TASK标志,

启动一个activity默认都是在同一个任务中,如果带有FLAG_ACTIVITY_NEW_TASK标志,系统会在不同的任务中查找这个acitivity。通常都是新的任务,如果某个有同样affinity的任务存在那么将会在这儿任务中启动activity。如果没有,就会启动一个新的任务。

2、当一个activity的allowTaskReparenting属性为true

用于配制是否允许activity可以更换从属的task,通常和taskAffinity一起使用,表示能否从启动的task移动到taskAffinity指定的任务。









展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部