activity任务堆栈

来源:互联网 发布:迅雷5 for mac下载 编辑:程序博客网 时间:2024/05/12 14:31
Activities and Tasks
1,activity 用任务来组成堆栈。堆栈里可以有别的应用里的activity 。
2,用户感知一个应用不是看开发包(.apk文件),是看任务堆栈。一个任务堆栈对用户来说就是一个应用。
3,任务堆栈只对activity做入栈,弹出操作。
4,任务堆栈只能设置一个值:偏好。
5,任务堆栈中的activity是作为一个整体停留在前台或者后台。
6,任务堆栈和其中的activity的行为可以用启动该activity的intent的标志位和AndroidManifest.xml文件里<activity>的属性信息来控制。


Affinities and new tasks
1,应用程序里的每一个activity都有自己的偏好,默认情况下,应用程序里的activity有一样的偏好,他们在一个任务堆栈里。可以通过<activity>标签的taskAffinity 属性来设置偏好。一个应用程序中可以设置不同的偏好。偏好也可以跨应用程序,不同的应用程序可以用同一个偏好。偏好在两种环境下生效:intent使用FLAG_ACTIVITY_NEW_TASK标志位,或者activity的allowTaskReparenting(同意任务重排根目录)属性设置成true。
2,默认的情况:startActivity()启动的新Activity和调用startActivity()方法的Activity在一个任务堆栈中。
3,The FLAG_ACTIVITY_NEW_TASK flag
     在默认情况下,startActivity()总是和调用者在一个任务堆栈里,但是如果使用了FLAG_ACTIVITY_NEW_TASK标志就会在不同的任务堆栈中(发现在一个apk里加上FLAG_ACTIVITY_NEW_TASK也会在一个堆栈里,不管要启动的activity是不是设置了不同的偏好)。但是如果已经有一个和将要运行的Activity偏好相同的堆栈,就会运行在那个堆栈上,不开辟新堆栈。
4,The allowTaskReparenting attribute
如果allowTaskReparenting属性设置true。这个Activity就可以从它最初开始的堆栈,移动到和它偏好相同的堆栈,当和它偏好相同的堆栈的到前台的时候。比如一个旅游程序里有一个天气预报的Activity,在另外一个程序里打开了这个Activity, 当旅游程序被调到前台的时候,那么这个天气预报Activity显示在前台。


注意:如果一个.apk文件的程序里有多个从用户角度看起来像单独应用的观点,应该给每一个观点包含的Activity设置不同的偏好。


Launch modes
在运行模式在<activity>的launchMode属性设置。可以设置成:


"standard" (标准模式,默认,“standard”模式总是构造一个新的实例来响应新的intent。见Clearing the stack章节最后部分)


"singleTop" (独享堆栈顶端)


"singleTask" (独享任务堆栈)


"singleInstance"(单例)


从4点区分这4种模式:
1)        什么样的任务堆栈接受要启动的activity。
在standard和singleTop模式,除非是使用FLAG_ACTIVITY_NEW_TASK标志位,否则要启动的activity总是在启动它们的堆栈中。singleTask和singleInstance模式一旦存在了一个堆栈中,就不再运行在其他堆栈。
2)        是否可以有多个实例。
standard和singleTop模式,可以有多个实例,可以多个实例分属多个任务堆栈,也可以在一个任务堆栈中有多个实例。singleTask和singleInstance模式只有一个实例。
3)        是否同意有其他的activity实例在他们的任务堆栈中
singleInstance模式一直保持只有自己一个activity在它的任务堆栈中。如果它启动了其他activity,那个activity在其他的堆栈中,不管是否加了FLAG_ACTIVITY_NEW_TASK标志。其他方面singleInstance和singleTask相同。
其余的三种模式可以允许在自己的堆栈中有多个activity。singleTask模式一直保持着自己是这个任务堆栈的根activity(最底部,不过没有验证到它一直在最底部)。
4)        当被Intent启动时,是否会生成一个新实例。
Standard模式会每次都生成一个新实例。每个实例对应一个Intent。
singleTop模式:如果要启动的activity在目标堆栈的顶部,就不新实例化使用现有的activity(但这个会触发onNewIntent(Intent intent)事件)。如果不在顶部,那么就新实例化一个放在堆栈顶部。
"singleTask" 和 "singleInstance"模式,不生成新的实例来处理Intent。 "singleInstance"模式一直在它自己的Task堆栈中,所以它一直在堆栈的顶部,它一直能响应到新的Intent。但是singleTask模式,允许别的activity在它的堆栈里,如果它在堆栈的顶部,他就可以响应新到的Intent。如果它不在堆栈的顶部,那么新到的Intent会调用失败,虽然会调用失败但是singleTask模式所在得堆栈还是会被整体调到前台。
注意:1.当已存在的activity去响应新的Intent的时候,不实例化新的activity,但现有的activity的onNewIntent()方法会被调用。要找回最初启动它的Intent可以用getIntent()
方法。
2.如果没有实例化一个新的activity,点返回键,多个任务堆栈都会更改状态。比如A-B-C,C启动了D,在和另外一个堆栈E-F-D共享一个D,点返回键结束D,变成A-B-C和E-F。
Clearing the stack
如果用户离开一个任务堆栈很长时间,系统会自动清除所有的activity,除了根activity。当用户返回的时候,就像用户自己不用了该任务堆栈一样,只有最开始的activity呈现出来。这样做的思想是:很长时间以后用户会忘记之前他打开这个任务堆栈做什么的了,再返回的时候,是去开始做其他事情了。这是默认行为,但也有一些属性会改变默认行为。
alwaysRetainTaskState属性:
如果一个任务堆栈的跟activity设置这个属性是TRUE,那么在这个任务堆栈中的所有activity会被保留,不会在很长时间以后自动清除。
clearTaskOnLaunch属性:
和alwaysRetainTaskState属性相反,如果这个属性设置成TRUE,不保持任务堆栈的状态,每当用户点击程序运行,都会把任务堆栈全部清空再重新开始(经验证:跟activity也会被清空,清空后新运行的任务堆栈ID不变。)
finishOnTaskLaunch属性:
和clearTaskOnLaunch一样,不过这个属性是作用在单独的activity上不是整个任务堆栈上。
当这个任务堆栈再次运行的时候,finishOnTaskLaunch设置成TRUE的activity会被清除,其他activity保持不变。
另一种强行清除activity的方法是在Intent中加上FLAG_ACTIVITY_CLEAR_TOP标志,目标堆栈如果存在Intent将要启动的activity,那么目标堆栈在这个activity之上的activity都会被清除。如果这个activity的运行模式是“standard”,它本身也会被清除,再重新构造一个这个activity的新实例来响应Intent。因为“standard”模式总是构造一个新的实例来响应新的intent。
Starting tasks
一个activity使用android.intent.action.MAIN和android.intent.category.LAUNCHER的Intent Filters来表示它是一个任务的入口。这样,在程序运行管理器会建立这个任务的图标。这代表了2点:1,用户可以通过它运行任务2,在一段时间以后,用户可以返回它。
重要的是第2点。用户必须能够离开和返回任务。因此,singleInstance和singleTask应该和MAIN ,LAUNCHER过滤器一起使用,因为这两种模式的activity总是初始化一个任务。假设,如果没有MAIN ,LAUNCHER过滤器,还使用了singleTask模式的activity开始了一个新任务,用户在这个任务上操作了一些东西,然后点了home键,任务现在被调到了后台看不到了。但是它又不能在程序运行管理器中启动这个任务,用户没办法回到这任务了。
需要同样小心的是FLAG_ACTIVITY_NEW_TASK标志。使用这个标志开启了一个新任务用户点home离开的时候要保证有一种导向让用户可以从新回到这个任务。一些实体总是开始新的任务比如notification manager。notification manager总是加带FLAG_ACTIVITY_NEW_TASK标志去启动activity。如果你有一个activity使用这个标志区调用一个外部的任务,注意用户有一个独立的途径返回到这个任务。
你不想让用户启动一个程序的时候看到一个activity,可以使用finishOnTaskLaunch标志。



原创粉丝点击