TASK和BACKSTACK

本文深入探讨了Android系统中Task和BackStack的工作原理。从demo测试、命令行工具验证到源码分析,逐步揭示了Activity如何组织成Task,以及BackStack在切换Activity时的作用。特别关注了TaskRecord对象与ActivityRecord之间的关联,以及它们在ActivityStack中的组织方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TASK和BACKSTACK(本篇章核心)

更多内容在这里查看
https://ahangchen.gitbooks.io/windy-afternoon/content

对Task和backStack的认识过程

1.由demo测试得到的关系图:

task1

  • 一个task中可以有多个app的Activity,

  • 由于一个app可以对应一个或多个process,

  • 所以一个task也可以对应多个process。

2.由adb shell dumpsys activity测试得到的关系图:
task2

  • Android将所有的task维护在Main stack中,

  • 每个task由TaskId唯一标识,在Hist中包含了处于同一个task内的Activity,

  • 不同的process(拥有不同的PID)中,可以包含同一个app的不同Activity,

  • 一个package标识一个Application。

3.通过学习源码得到的关系图:

task3

  • 在ActivityManagerService中,由一个ActivityStack对象维护回退栈,而具体到ActivityStack中,由mHistory来维护回退栈(是一个ArrayList,而非Stack)。

  • 每个Task即为一个TaskRecord对象,

  • TaskRecord没有为每个Task维护一个自己的stack或list,

  • mHistory中,不是直接管理Activity,而是维护ActivityRecord对象,

  • ActivityRecord对象通过TaskRecord与自己所属的Task关联起来,

  • ActivityRecord对象通过Activity info对象与对应的Activity关联起来,

  • 分析ActivityStack中的moveTaskToFrontLocked()等对Task进行操作的代码,得到,同一个task的ActivityRecord在mHistory中是放在一起的(按照先入先出的顺序),当一个task被调到前台时,这个mHistory中,属于同一个task(taskId一致)的ActivityRecord被一起移到mHistory的顶端(在这个ArrayList中,以最后一个元素所在的位置为top,top=size()-1);

一个应用往往包含很多activities.每个activity都应围绕着用户可执行的特定动作来设计,并且可以启动其它activitie.例如,一个email应用可能可能有一个显示新邮件列表的activity.当用户选择一个邮件,一个新的activity被打开以显示邮件内容. 一个activity也可以打开同一设备上存在于其它应用的activitie,例如,如果你的应用想要发送一个邮件,你可以定义一个intent来执行一个"send"动作并包含一些数据,比如一个地址一条信息.另一个应用中的一个叫嚣自己可以处理这种intent的activity就被打开(如果有多个activitie支持同样的intent,那么系统会让用户选择一个).当email被发送后,你的activity被恢复并且看起来发送邮件的activity好像是你的应用的一部分.即使那个activitie可能来自不同的应用,Android也靠着把两个activity保存在同一个任务中来实现这种无缝的用户体验. 一个任务是用户在执行某种工作时所交互的activitie的集合.activitie们放置在一个栈("后退栈")中,按照打开的顺序排列. 设备的Home屏是大多数任务的开始场所.当用户触摸在应用启动台中的图标(或一个home屏上的快捷方式)时,应用的任务就来到了前台.如果没有这个应用的已存在的任务(这个应用最近没有被使用),那么一个新的任务被创建并且这个应用的"main"activity被作为栈的根activity打开. 当当前的activity启动了另一个activity,新的activity被放置在栈顶并拥有焦点.先前的activity依然保存在栈中,但是停止了.当一个activity停止时,系统保存了它的用户界的当前状态.当用户后退按钮时,当前的activity被从栈顶弹出(activity被销毁了)并且先前的activity被恢复了.栈中的Activities永不会被重新排列,只是入栈或出栈—当被当前activity启动时就入栈,当用户使用后退按钮离开它时就出栈.如此,后退栈也是一个后进先出的栈. 下图展示了工作栈的变化过程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值