Android O Framework架构分析:以AMS视角看Activity启动过程

本文深入分析Android 8.0系统中,从ActivityManagerService(AMS)的角度探讨Activity启动流程,涉及ActivityRecord、TaskRecord、ActivityStack等关键数据结构,详细阐述启动过程、生命周期管理和AMS的主要行为。
摘要由CSDN通过智能技术生成

        在Android系统中,Activity的启动是一个非常频繁发生的过程,在Framework层中,这个过程牵涉到的模块也非常多。本文将基于Android 8.0源码,以ActivityManagerService模块(以下简称AMS)的视角来分析其过程中主要发生的行为。

一. AMS中层次结构

        AMS模块中涉及Activity的数据结构主要有三个:ActivityRecord,TaskRecord,ActivityStack. 其中ActivityRecord抽象地表示了每一个Activity,这个数据结构记录、管理了Activity的各种信息、属性、状态等。TaskRecord抽象地表示了任务的概念,任务是由一系列Activity以栈的形式组成的,一般情况下启动Activity都会在同一个任务中启动,添加了特殊的flag(FLAG_ACTIVITY_NEW_TASK)或者特殊的启动模式则会在新任务中启动一个Activity. 任务和进程并无限制关系,同一任务中也可存在其它进程的Activity,同一进程的Activity也可以存在与不同任务中。具象来看的话,系统中的最近任务界面显示的任务就和AMS里的TaskRecord描述的是一样的概念。ActivityStack则是用来管理TaskRecord的结构,是由一系列TaskRecord以栈的形式组成的。它是一个抽象的概念,在系统中无法具象地看到它。从6.0开始只有两个ActivityStack(桌面所在的TaskRecord在单独的ActivityStack中,其他TaskRecord在另一个),到8.0中已经有八个(为分屏,最近任务,画中画,自由模式等创建的),ActivityStack随着Android大版本升级越来越多。

二. Activity启动的主要流程

        Activity启动时,客户端通过Binder向system server端进行通讯,通知AMS进行相应地处理,其时序图为(红色代表app进程,蓝色代表system server进程):


        上面的时序图其实仅仅描述了在Activity启动时,AMS端的一些通用逻辑,绝大多数的情况下,在Activity启动时首先都会经历上述的流程。在上面时序图最后,也就是第10步的调用,会根据不同的情况进入不同的分支,后面会具体分析。

        客户端的Instrumentation类会通过Binder call调用到AMS端的startActivity(上图步骤4),其参数列表为:

参数 解释
IApplicationThread caller
调用者的IApplicationThread对象
String callingPackage
调用者的包名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值