专栏名称: 鸿洋
你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识。点击历史消息,查看所有已推送的文章,喜欢可以置顶本公众号。此外,本公众号支持投稿,如果你有原创的文章,希望通过本公众号发布,欢迎投稿。
目录
相关文章推荐
开发者全社区  ·  贾玲复胖,原因曝光 ·  15 小时前  
开发者全社区  ·  约会软件的秘密 ·  18 小时前  
开发者全社区  ·  2025年春节就去北京,感受北京的春节氛围, ... ·  20 小时前  
鸿洋  ·  基于协程的 Android 事务框架设计 ·  2 天前  
51好读  ›  专栏  ›  鸿洋

一分钟掌握一个知识点--Activity系列之ActivityClientRecord

鸿洋  · 公众号  · android  · 2025-01-16 08:35

主要观点总结

文章主要介绍了“一分钟掌握一个知识点”系列文章的目的和背景,以及该系列文章中的一篇关于ActivityClientRecord和ActivityRecord的介绍。文章详细解释了ActivityClientRecord的作用,它与ActivityRecord的关系,以及它们之间的连接器IBinder的作用。

关键观点总结

关键观点1: 一分钟掌握一个知识点的目的

为了让读者在极短的时间内掌握一个Android知识点,通过简短的内容介绍,让读者能够轻松学习技术知识。

关键观点2: ActivityClientRecord和ActivityRecord的介绍

ActivityClientRecord记录App进程内的活动,存在于每个App进程中。ActivityRecord是存在于systemserver进程,用于记录Android系统中每一个被启动的Activity。

关键观点3: ActivityClientRecord的作用

ActivityClientRecord与ActivityRecord是一一对应关系,记录了App进程内启动的Activity的信息。

关键观点4: ActivityClientRecord与ActivityRecord的连接器IBinder的作用

IBinder是ActivityRecord和ActivityClientRecord一一映射的关键连接器。

关键观点5: 文章的结构和特点

文章采用对话的方式介绍知识点,通过图解和表格解释复杂的概念,增加代入感和互动性。


正文

前言
在这个碎片化、娱乐至死的时代,我相信包括我自己在内应该有很多人都很难有耐心认认真真的看完一篇文章,尤其是枯燥、乏味的技术文章。故一分钟掌握一个知识点系列文章的主要目的是为了让大家只需要花一分钟的时间就可以掌握一个Android知识点,日积月累的力量是非常可怕的,但唯有坚持是最难的事情。
一分钟掌握一个知识点系列文章并不是东一榔头西一棒子知识点是呈现孤立的点状状态,我希望知识点与知识点之间是有联系的,多个知识点可以成为一个体系。一分钟掌握一个知识点是说介绍一个知识点就完完全全就是一分钟,只是想说每个知识点都比较简短。当然简短知识点也有不足之处就是没办法介绍一些没法分割的全流程性的内容,针对这种情况我也会写全流程性的内容,大家可以结合着看。
一分钟掌握一个知识点前期主要是介绍Android framework甚至更底层相关的小知识。一分钟钟掌握一个知识点主要面向的读者是对于Android framework没有多少经验的初学者,当然也欢迎各位大佬提宝贵意见。
为了增加代入感和互动性一分钟掌握一个知识点采用对话的方式,人物有大牛和小昱,其中大牛是具有多年经验的Android老手,而小昱是一心想要进入大厂的Android新手。

前情

小昱:“大牛,最近我看到了一个类ActivityClientRecord,这个类让我联想到了在深度解读ActivityTaskManagerService文章中介绍到的ActivityRecord,看它们的名字这么像,让我难以区分,能帮我介绍下吗?”
大牛:“小事一桩了,那我们就开始吧。”

注:ActivityTaskManagerService简称ATMS

1
App进程内Activity的记录者
为了把ActivityRecord与ActivityClientRecord之间的关系展示的更清楚,我特意绘制了一幅图:

图解

ActivityRecord是存在于systemserver进程,它是归ATMS管理,Android系统中每一个被启动的Activity都会被ActivityRecord记录下来。而ActivityClientRecord是存在于每一个App进程内,它的作用是记录App进程内启动的Activity,App进程内启动的Activity是存放在ArrayMap数据结构中,它的key值是类型为IBinder的token对象,它的value值就是ActivityClientRecord对象,ActivityClientRecord的属性中activity指向真正的启动Activity实例。
下面表格是ActivityClientRecord的主要属性。



2
App进程内所有启动的Activity


App进程内所有启动的Activity是存储在ActivityThread的属性中的,如下代码:
//ActivityThread

//保存了所有启动的Activity
final ArrayMap mActivities = new ArrayMap<>();

如上代码,mActivities保存了所有启动的Activity,其中IBinder作为key值,它是从ATMS传递过来的,每个Activity都对应自己的IBinder对象,ActivityClientRecord对象则保存了Activity的相关信息。关于IBinder在后面知识点中会介绍,它可是ActivityRecord和ActivityClientRecord一一映射的关键。

3
ActivityClientRecord何时初始化
我同样也绘制了一幅启动Activity的流程图,如下:

图解

上图展示了App1进程启动App2进程中的Activity的流程,这个过程中要经过两次binder通信:
  1. App1进程调用startActivity方法,启动Activity的信息是在Intent对象中存储着。
  2. ATMS收到启动Activity的信息,经过各种处理后,给App2进程发送启动Activity的信息。
  3. App2进程收到Activity的启动信息intent:Intentinfo:ActivityInfostate:Bundle等。

而ActivityClientRecord初始化的时机就是在App进程收到ATMS发送的启动Activity的信息后,ATMS会把启动Activity的各种信息都传递过来初始化ActivityClientRecord对象,开始App进程内Activity的启动过程。

4
总结

ActivityClientRecord的作用是记录App进程内启动的Activity,它与位于systemserver进程内的ActivityRecord是一一对应关系,而这个对应关系的关键连接器是类型为IBinder的token。下一个知识点介绍token是如何将它们俩联系起来的。


扫一扫 关注我的公众号

如果你想要跟大家分享你的文章,欢迎投稿~


┏(^0^)┛明天见!