关于android任务Task及回收栈back stack介绍

来源:互联网 发布:阳西县网络问政首页 编辑:程序博客网 时间:2024/05/16 16:37

概述

一个手机应用程序通常包含多个Activities。每个Activity的设计,都是为了完成某种明确的功能及跳转到其他应用程序的Activity。比如,一个邮件收发应用程序,有一个Title的列表Activity,当点击列表标题时,跳转到另外一个Activity去显示邮件内容。

一个Activity中,也可以去打开另外一个在同一设备上的其他应用程序的Activity。比如,当你发送邮件时,你发出一个发送邮件的意图Intent,这个Intent包含了邮件地址,邮件消息。另外一个发送邮件应用程序定义了接收这个意图Intent的处理方式,那么就可以打开发送邮件的应用程序进行邮件发送了。如果多个应用程序支持处理这个意图Intent,那么系统会提示选择其中一个执行。当你发送完成之后,就会回到你自己的应用程序,这样看起来就好比邮件发送应用程序是你自己应用程序中的一部分。不管怎么样,毕竟是不同应用程序的Activities,是Android系统的Task让用户感知完全不一样了。

Task是一个Activities的收集器,专门收集用户操作交互所打开的Activity。这些Activities都被安排在一个回收栈back stack中,安排的顺序和它们打开的顺序一致。即先打开的安排在最底部,最后一个打开的安排在顶部。

设备的主屏幕就是为了放置更多的任务。当用户点击某个应用程序图标打开一个应用时,那么这个任务就处于前端。如果这个应用程序之前未被打开过,就会创建一个新的任务Task

当当前的Activity打开其他Activities时,新打开的Activity处于back stack的最顶端并处于用户获取焦点状态,当前的Activity被保存置于stack中,处于stopped状态。当用户点击BACK键时,stack最顶部的Activity被销毁,前一个Activity被恢复。Back stack的操作遵循“后进先出”的原则。

Android 开发指南(一) 任务Task及回收栈back stack介绍 - Android  鱼 - Android 鱼

 

back stack中所有的Activities都出栈了,那么任务将不存在,应用程序也就随即推出。

一个Task任务是一个完整的单元,它可以运行于后台。当用户开启一个新的任务Task,或者通过HOME键跳到主屏幕时,这个任务就处于后台运行,不过这个Task包含所有的Activities都处于Stopped状态。但back stack维护者这个任务的完整数据,只是简单的被其他task替换焦点而已。

Android 开发指南(一) 任务Task及回收栈back stack介绍 - Android  鱼 - Android 鱼

 

 

在同一时刻,允许多个任务Task运行于后台,但当系统资源不足,需要结束掉某些状态为Stopped的任务时,Activities的状态数据将被丢失。

由于ActivitiesTask中并不支持重新排列,因此当你的一个Activity在一次应用中打开多次,那么每次都创建一个新的Activity实例,而不是引用旧的Activity实例。也就是说,一个Activity在你的应用中会多次实例化。

Android 开发指南(一) 任务Task及回收栈back stack介绍 - Android  鱼 - Android 鱼

 

当然你也可以通过其他方式使得同一Activity在一个任务中只实例化一次,Task任务管理一节将介绍如何实现。

如何进行任务管理

         你不必要去担心你的Activites如何与Task任务进行交互,它们是如何存在于back stack中。但是,你也许想改变这种正常的管理方式。比如,你希望你的某个Activity在一个新的任务中进行管理,或者你只想对某个Activity实例化,又或者你想在用户离开任务时清理Task中的所有Activities,除了根Activity

         要完成这些特殊的管理方式,你可以通过在manifest中使用Activity的属性,或者在代码中通过传递特殊标识的IntentstartActivity()方法。

         Activitymanifest可配置的属性有:

l  taskAffinity

l  launchMode

l  allowTaskReparenting

l  clearTaskOnLaunch

l  alwaysRetainTaskState

l  finishOnTaskLaunch

Intents 标识有:

l  FLAG_ACTIVITY_NEW_TASK

l  FLAG_ACTIVITY_CLEAR_TOP

l  FLAG_ACTIVITY_SINGLE_TOP

运行模式介绍

你可以通过定义运行模式来定义Activities如何与Task进行交互。定义的两种方式如下:

l  使用manifest配置文件

l  使用intent的标识

例子:Activity A 启动 Activity B。如果Bmanifest中定义了运行模式,并且A在启动B时,也在Intent中指定了B的运行模式,那么AIntent的定义将覆盖Bmanifest中的定义。

注:有些运行模式在manifest中定义有效未必在Intent中也有效,同样,在Intent定义有效的运行模式在manifest中未必生效。

 

如何使用manifest配置管理

manifest配置文件中,你可以通过ActivitylaunchMode属性来指定4中不同的运行模式。

1.         Standard:标准默认模式

在这种默认模式下,Activity可以被多次实例化,也可以运行在多个Task中,一个Task可以拥有多个Activity实例。

2.         singleTop

在这种模式下,如果一个Activity实例已经存在于当前Task的最顶部,那么系统将调用onNewIntent()方法路由到这个实例,而不是创建一个新的Activity实例。

一个Activity可以被实例化多次,且可以从属于不同的Task任务,且一个任务中可以存在多个Activity实例(这情况仅仅存在于Activity实例不在Task任务的顶端)

A-B-C-D:再开启Dback stack中的情形:

在标准模式下,则为 A-B-C-D-D

singleTop模式,则为A-B-C-D

如果开启B

则在singleTop模式下为 A-B-C-D-B

3.         singTask

这种模式下,系统创建一个新的Task,并在Task的底部实例化Activities。然而,当一个实例存在于一个独立的Task时,系统不是去创建一个新的实例,而是调用onNewIntent()路由到其他任务的实例。在同一时间,只存在一个Activity实例。

4.         singInstance

singTask相似,唯独一点不同的是,这个实例只能在一个单独的Task中使用。

如何使用Intent配置管理

在启动Activity时,你可以通过传递一个Intent入参给startActivity()方法,来实现与manifest配置类似功能,改变Activitytask中的行为。

l  FLAG_ACTIVITY_NEW_TASK

 singleTask 一样

l  FLAG_ACTIVITY_SINGLE_TOP

singleTop一样

l  FLAG_ACTIVITY_CLEAR_TOP

这个模式是没有属性配置支持的。在这种模式下,如果启动一个已经存在于当前Task任务的Activity,那么Task顶部所有的Activity将被销毁,并且为将要启动的Activity新建一个Activity实例,存放在taskback stack的顶部。

 

FLAG_ACTIVITY_CLEAR_TOP通常与FLAG_ACTIVITY_NEW_TASK一起结合使用,结合使用可以达到这样的效果:找到在其他Task中存在的Activity,并将它放置到一个可以相应Intent的地方。如果是standard模式,那么它将从stack移除,并新建一个Activity去相应Intent,因为这种模式下,总是新建Activity

 

taskAffinity属性:字符串取值,在一个命名空间里唯一。

这个属性在以下2中情况下起作用:

1、  当启动一个ActivityIntent包含了FLAG_ACTIVITY_NEW_TASK标识.

在默认情况下,新建一个Activity,会调用startActivity()方法进入Task当中。它放置到和启动它的Activity相同的back stack。但是,如果启动的Intent包含了FLAG_ACTIVITY_NEW_TASK标识,系统将为这个Activity寻找一个不同的Task。通常是新建一个新的Task。但是也未必全是这样,如果存在一与之相同taskAffinity定义Task,那么这个Activity将运行在那里,否则新建Task

2、  当一个Activity的属性allowTaskReparenting设置为true.

举个例子说明这个属性的作用:

假设一个选择城市查看天气的Activity是一个旅游应用程序的一部分。这个Activity与这个应用中的其他Activity有相同affinity,并且设置了这个属性为true。当你的其他Activity启动这个查看天气的Activity时,它和你的Activity属于同一个Task。但是,当你的旅游应用程序再次展现在前端时,这个查看天气的Activity会重新分配到旅游应用程序的Task中,并显示天气情况。

如何清理回收栈back stack

如果一个用户离开一个Task很长时间,系统会清理这个Task,当然除了跟Activity。当用户回来时,只剩下这个跟Activity,其他的都被销毁了。

以下属性可以设置并改变这种行为方式:

 

alwaysRetainTaskState

如果在Task的跟Activity中设置这个属性为true,默认的行为将不再发生,所有Activity的状态数据将永久保存。

clearTaskOnLaunch

如果在Task的跟Activity中设置这个属性为true,当用户离开或者回到这个Task时,都会清理除了跟Activity之外的Activity

finishOnTaskLaunch

类似clearTaskOnLaunch ,但只在一个Activity中生效,而不是整个Task,它可以清理任何的Activity,包括跟Activity。你为当期会话保存Activity,当用户回来或者离去,都不将再恢复呈现。

0 0
原创粉丝点击