Android API Guides 阅读笔记(6)----Task and Back Stack

Task是当用户操作时用到的一组Activity的集合,运行中的Activity放在回退栈中存储(back stack),按执行顺序排列。系统会为每一个运行的应用程序分配一个Task和对应的回退栈,一个系统中可以同时存在多个Task,但是同一时间只能有一个Task显示在前台,其他Task将处于后台,并且其中的Activity都将处于stop状态,关于Task和Back Stack,需要了解以下几点:

  • 设备的主屏幕或者菜单(就是通过点击图标来启动一个应用程序的地方)是Task的起点,启动一个应用程序,此应用程序的Task就来到前台,如果这个应用程序没有Task(最近没有使用过这个应用程序),就会为此应用程序新建一个Task,如果最近使用过此应用程序(系统会将它的Task保留在后台),将会重新调用此应用程序的Task

  • 假设有两个Activity:Activity_A和Activity_B,如果从Activity_A中启动Activity_B,则Activity_B处于栈顶,Activity_A会保留在栈中,但是处于stop的状态,系统会保留其UI的状态,当用户在Activity_B中按了物理返回键退出后,Activity_A就会回到栈顶并恢复其UI状态,处于resume状态

  • 当用户在一个应用程序中持续按返回键(在一个Activity中按返回键会将其从栈中弹出),直到回到设备主屏幕,也就是所有的Activity都从栈中弹出了,这个应用程序所在的Task也就不存在了

  • 启动一个应用程序,系统就会自动为其分配Task和栈,如果同时存在太多的后台Task,系统由于内存不足会自动清理一部分后台Task中的Activity,这样,其状态就不存在了,也就是当用户重新回到这个应用程序时,原来的Activity将会重新创建而不是处于resume状态

  • 由于Android系统允许在一个应用程序的Activity中启动另一个应用程序的Activity(这在Activity中有笔记),也就是说,一个Activity可能会在多个Task中存在(当多个应用程序都调用这个Activity时),而且是互不关联 ,拥有各自UI状态。为了避免这种情况,就需要管理Task

  • 当用户按下Home键离开Task 时,当前 Activity 停止Task 转入后台,系统会保存Task中每个Activity 的状态。如果用户以后通过选中启动该 Task 的图标来恢复Task,Task 就会回到前台,栈顶的Activity 会恢复运行.
    如果用户按下返回键,当前Activity 从栈中弹出,并被销毁.栈中前一个Activity恢复运行.当Activity 被销毁时,系统不会保留Activity 的状态.

  • Activity可以在不同的Task中被实例化多次

通过管理Task,可以实现如下功能:

  • 让应用程序中的某个Activity启动一个新的Task,而不是放入当前应用程序的Task中

  • 让Activity启动时是通过从back stack中调出之前存入过的,而不是重新创建这个Activity并再此将其压入back stack(避免同一个Activity重复出现在back stack中

  • 在用户离开当前Task时值保留”根Activity”而back stack中的其他Activity都清空

如何管理Task:

通常有两种方式来管理一个Activity和它的Task,一种是直接在其对应的清单文件中的< activity >节点下修改相应属性,另一种是在启动某个Activity

  • 通过清单文件(AndroidManifest.xml)中的< Activity >节点属性:

    • taskAffinity:affinities表示Activity对Task的相关性,默认情况下同一个应用程序中的所有Activity都有相同的affinities值,可以在清单文件中的< activity >节点中修改taskAffinities值,通常在两种情况下会使用到affinities:

      • 当一个Intent通过FLAG_ACTIVITY_NEW TASK标签启动一个Activity时
        默认情况下,一个新的Activity将被放入调用startActivity()的Activity 所在Task 中,且压入调用者所在的Back Stack 顶栈

      • 当一个Activity在其< activity >标签添加属性allowTaskReparenting并赋值为true时
        在这种情况下,当某个Task 进入前台时,Activity 的affinity 值又与其相同,则它可以从启动时的Task 移入这个Task 中.

    • launchMode

      • standard(默认模式):系统将会在当前应用程序的Task中创建一个新的实例,并使Intent指向它,这种模式的Activity可以实例化多次,每一个实例可以属于不同的Task(从不同的Activity中使用Intent指向它),并且,一个Task可以有多个相同的Activity实例(原有的Activity仍然按顺序存在栈中)

      • singleTop(栈顶复用模式):如果当前应用程序的Task中已经存在这个Activity的实例了,当通过Intent启动这个Activity时,会调用Activity中的onNewIntent()(而不是onCreate()方法,因为onCreate()方法是在Activity新建的时候调用,而这里不是新建)假设Task 的 Back Stack 中包含了根Activity A 和 Activities B、C、D(顺序是 A-B-C-D; D在栈顶. 这时候传过来的是启动D的intent,如果D的启动模式是默认的”standard”,则会启动一个新的实例,栈的内容就会变为 A-B-C-D-D.但是,如果 D 的启动模式是 “singleTop”,则已有的D的实例会通过onNewIntent():接收这个 intent,因为该实例位于栈顶——栈中内容仍然维持 A-B-C-D 不变.当然,如果 intent 是要启动 B 的,则 B 的一个新实例还是会加入栈中,即使 B 的启动模式是”singleTop”也是如此.栈中内容为A-B-C-D-B

      • singleTask(栈内复用模式):一般作为应用程序主Activity,系统将创建一个新的Task,这个Activity是第一个放入新的Task,如果其他Task(除当前应用程序以外的Task)中已经有实例存在,则会调用其onNewIntent(),而不是再创建一个新的Activity,此Activity在同一时刻只能有一个实例存在,虽然启动了一个新的Activity,但是通过返回键仍然可以返回之前的Activity

      • singleInstance(单实例模式):大致和singleTask模式相同,唯一的不同是,系统不会在当前Activity所在的Task中启动其他的Activity,也就是说这个Activity总是单独的处在一个Task中(这个Task不允许其他的Activity存在),从这个Activity中启动的Activity也会被分离到其他Task

    • alwaysRetainTaskState:如果在跟Activity(通常是程序入口Activity)中将此属性值设为true,则即使用户离开一个Task很长时间,系统也不会清除掉这个Task中的任何Activity,所有的Activity都会保留

    • cleanTaskOnLaunch:这个属性是上面alwaysRetainTaskState的对立面,也就是说,如果将此属性值设为true,则无论用户离开多久,系统都会将栈中的所有Activity清理掉(当然,仍然会保留跟Activity),清理回退栈的内容在下面

    • finishOnTaskLaunch:此属性类似cleanTaskOnLaunch:但是,它只对一个Activity有效(也就是某个在节点设置了此属性为true的Activity)

  • 通过调用startActivity()时用到的Intent中的flag:

    • FLAG_ACTIVITY_NEW _TASK:和singleTask模式相同,在新的Task中启动目标Activity,如果那个Activity之前已经存在了,它将会回到前台并恢复之前的状态,并调用其onNewIntent()方法

    • FLAG_ACTIVITY_CLEAN_TOP:和singleTop模式相同,如果要启动的Activity是当前的Activity(位于栈顶),则会调用当前Activity中的onNewIntent()方法,不会创建新的实例

    • FLAG_ACTIVITY_SINGLE_TOP:如果要启动的Activity已经在当前Task中运行(不一定处于栈顶),将不会创建一个新的实例,而是会将这个Activity之上的所有其他Activity销毁,然后将此Activity恢复到栈顶,调用其onNewIntent()方法

注意:如果 Activity A 启动了Activity B,则 Activity B 可以在 manifest 中定义它如何与当之前的Task 关联(如果存在的话),Activity A 也可以要求 Activity B 与当前 task 的关联关系.如果两个Activity都有定义,则 Activity A 的请求(intent 中定义)会比Activity B 的定义(在 manifest 中)优先.

清理回退栈(back stack):

如果用户长时间离开一个Task,则系统将会清理掉这个Task中的其他Activity,只保留栈底的”根Activity“(一般为程序入口Activity),当用户重新启动这个Task时,只有根Activity会恢复(因为栈中只有这一个Activity)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值