Android初级—中级进阶必须搞懂之四大组件以及Application和Context的全面理解

本文详细解读了Android中的ContextImpl,介绍了其内部实现的关键对象、成员变量和方法,包括ApplicationContext的创建过程,以及四大组件(Activity、Service、ContentProvider)的初始化机制,涉及SharedPreferences、文件操作、数据库操作、权限管理等内容。
摘要由CSDN通过智能技术生成

阅读须知

  • 1.文章中的缩写指代的意思:CI——>ContextImpl、AT——>ActivityThread、LA——>LoadedApk、CR——>ContentResolver、PM——>PackageManager、SP——>SharedPreferences、APT——>ApplicationThread、AMS——>ActivityManagerService、PR——>ProcessRecord、AR——>ActivityRecord、AS——>ActiveServices、SR——>ServicecRecord。
  • 2.文章中的变量 mXXX(yyy),括号中 yyy 表示该变量的类型。
  • 3.文章中的方法 xxx(yyy),括号中 yyy 表示方法需要传入的变量类型。

二、用处

  • 1.Context的实现类有很多,但是 CI 是唯一做具体工作的,其他实现都是对 CI 做代理。
  • 2.CI 中有一些成员对象,先来看看这些对象的用处:
  • 1.mSharedPrefsPaths、sSharedPrefsCache:这两个对象是用于获取 SharedPreferences 的,在我前一篇博客里面有讲到。全面剖析SharedPreferences
  • 2.mMainThread(AT):这个对象是一个 App 进程的主线程,一个 App 的 Framework 层就是从这里启动的。
  • 3.mPackageInfo(LA):在 AT 初始化 App 的主线程的时候,会将 Apk 加载到内存中,Apk 在内存中就是以这个对象的形式存在的,该对象可以加载 Apk 的资源和 Dex 文件。
  • 4.mUser(UserHandle):多用户相关。
  • 5.mContentResolver( ApplicationContentResolver):继承于 CR,主要功能是通过 Uri 来获取文件、数据库、Asset、Res 等数据,还有就是通过 ContentProvider 来获取其他应用和本机数据。
  • 6.mResourcesManager(ResourcesManager):单例,因为一个 Apk 不同机型的适配资源,所以用来加载Resource对象,以保证一个 App 中所有的 CI 使用的都是同一份资源。
  • 7.mResources(Resources):获取 Apk 中 Res 资源的对象。
  • 8.mOuterContext(Context):用于指向代理本对象的 Context,例如 Activity、Service 等。
  • 9.mTheme(Resources.Theme):主题
  • 10.mPackageManager(PM):包管理类,不仅可以获取我们apk包的信息,还能获取本机apk包的信息。
  • 3.CI 中有很多 Api,我将这些 Api 归了一下类
  • 1.获取成员对象:即获取上面我列出来的那些对象,这些对象获取到了之后又有更多 Api 暴露出来,在这里 CI 相当于做了一个聚合。最常用的就是 getResource() 了。
  • 2.获取成员对象的成员对象:即为了方便,CI 封装了一些常用的获取成员对象中的信息的方法。例如getPackageName(),是通过 PM 来获取的。
  • 3.关于 SP 的操作:我们知道 SP 其实就是 Xml 文件,所以这里的操作有:获取、移动、删除。
  • 4.文件操作:增删移文件、打开文件流、获取 App 私有文件夹地址等等。
  • 5.数据库操作:我们知道 Sqlite 其实是一种文件型数据库,所以有:打开、创建、移动、删除、获取数据库文件路径,等操作。
  • 6.壁纸相关操作:这个不是成员变量提供的,WallpaperManager 是系统 Service 一种,所以是SystemService 提供的。
  • 7.启动Activity:包括一般启动 Acitivyt、多用户启动 Activity、启动多个 Activity。
  • 8.广播操作:发送普通广播、发送需要权限的广播、发送有序广播、发送粘连广播、发送有序粘连广播、多用户广播、移除各种广播、注册各种广播、取消注册各种广播。
  • 9.Service 操作:启动、停止、重启、绑定、解绑、获取系统服务以及多用户操作。
  • 10.权限操作:检查本 App 是否有某种权限、检查某 App 是否有某种权限、检查Uri权限、授予权限等等。
  • 11.各种情况下创建 CI,这个比较重要
  • 1.createSystemContext(AT):在 SystemService 创建的时候为其创建一个 CI
  • 2.create App Context(AT,LA):在 App lication/Service创建的时候为其创建一个 CI
  • 3.createActivityContext(ActivityThread mainThread,LA, IBinder, int displayId,Configuration):在 Activity 创建的时候为其创建一个 CI。

三、四大组件以及 App lication初始化与Context的关系

在了解 Binder 的时候有如下要注意的点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.Activity初始化

  • 1.CI.startActivity():将调用交给 Instrumentation (负责监控 Activity 和 AMS 的交互,所有 Activity 的本地进程到远端进程的调用转换都是其来执行),

  • 2.Instrumentation.execStartActivity():传入一个 APT 然后通过 Binder 机制将调用过程转移到(后称AMS)所AMS 在的系统服务进程,本地主线程则继续运行,不过本地主线程后续也没别的操作了。接下来就是本地的MessageQueue 等待 AMS 服务运行完毕,发送消息将 Activity 的启动重新交给本地主线程。

  • 3.AMS.startActivity():从这里开始会调用会按顺序在 ActivityStarter、ActivityStackSupervisor、ActivityStack 这三个类之间进行调用,主要会进行下面这些操作,不按顺序:

  • 1.对 Intent 的内容进行解析,获取目标 Activity 的信息。

  • 2.根据传入的 APT 获取被调用 App 的信息封装成 PR。

  • 3.将1、2和其他信息结合,将源 Activity 和目标 Activity 封装成两个 AR

  • 4.解析 Activity 的启动模式 和当前的 Activity 栈状态,判断是否需要创建栈和 Activity 。(注意这里的AR 有着 App 中的 Activity 的全部信息,可以将其看成系统服务里面的 Activity 的化身)

  • 5.获取到 Activity 和 Activity 栈之后,接下来要判断是否要将当前 Activity 执行 onPause() 以及让使用Binder 执行目标 Activity 的 onCreate() 和 onResume(注意这里 onStart() 会在 Binder 远程调用onCreate() 的时候直接执行),这里 AMS 进程会使用 APT 调用 App 进程的 Activity 执行相应的生命周期。

  • 6.在 AMS 中前置准备一切就绪之后,会通过 APT 使用 Handler 的形式调用到 App 进程的 AT 中。

  • 7.最终到了ActivityStackSupervisor.realStartActivityLocked()中会使用 APT 将调用交给 App 进程——>AT.scheduleLaunchActivity()——>AT.handleLaunchActivity()

  • 4.AT.handleLaunchActivity():将有以下操作

  • 1.AT.performLaunchActivity:这个方法有以下操作

  • 1.创建对象LA(一个 App 只加载一次)

  • 2.创建对象 Activity

  • 3.创建对象 App lication(一个 App ,只创建一次)

  • 4.**创建对象 CI **:CI.createActivityContext()

  • 5.Application、CI都 attach 到 Activity 对象:Activity.attach()

  • 6.执行 onCreate():Instrumentation.callActivityOnCreate()——>Activity.performCreate()——>Activity.onCreate()

  • 7.执行onStart():AT.performLaunchActivity——>Activity.performStart()——>Instrumentation.callActivityOnStart()——>Activity.onStart()

  • 2.AT.handleResumeActivity()

  • 1.AT.performResumeActivity()——>Activity.performResume()——>Instrumentation.callActivityOnResume()——>Activity.onResume()

  • 2.Activity.makeVisible()——>WindowManager.addView():开始进行View的绘制流程。

  • 3.从上面我们可以总结一下:在 AMS 将调用交给 App 进程之后,三个生命周期都是在 App 进程被回调的,并且在 onResume() 之后View才进行绘制

2.Service初始化

  • 1.CI.startService()——>CI.startServiceCommon():在这里传入一个 APT,类似 Activity 启动时的第二步,将调用过程转移到 AMS 中,本地主线程继续运行,等待 APT 从 AMS 进程将调用转移到本地主线程中。
  • 2.AMS.startService():到了 AMS 进程之后,Service 的启动就会全权交给 AS(这是 AMS 用来管理 Service 的成员变量)
  • 3.AS.startServiceLocked():这里做了以下操作
  • 1.根据传入的 APT 获取被调用 App 的信息封装成 PR
  • 2.解析 Intent 等参数获取到 Service 的信息,封装成 SR(这个类可以看做是 Service 在系统服务的化身,记录了 Service 的一切信息)
  • 3.再进过一系列调用:AS.startServiceInnerLocked()——>AS.bringUpServiceLocked()——>AS.realStartServiceLocked() 到这里才是真正在 App 进程启动 Service 的流程。
  • 4.AS.realStartServiceLocked():这里会有以下操作:
  • 1.SR.APT.scheduleCreateService():这里会将调用转到 App 进程,但是当前的进程还会继续执行,这里就到了 App 线程的APT,这个方法里有以下操作
  • 1.通过 Handler 转到 AT.handleCreateService()
  • 2.创建对象 LA(一个 App 只加载一次)
  • 3.创建对象 Service
  • 4.创建对象 CI
  • 5.创建对象 Application(一个 App 只创建一次)
  • 6.Application、CI分别 attach 到 Service 对象
  • 7.执行 Service.onCreate() 回调
  • 8.此时 Service 已经启动了
  • 2.AS.sendServiceArgsLocked()——>SR. App.APT.scheduleServiceArgs():这里就转到了 App 进程的 APT 中,这里会有以下操作:
  • 1.APT.scheduleServiceArgs()
  • 2.AT.handleServiceArgs()
  • 3.Service.onStartCommand()
  • 4.此时我们需要在 Service 中进行的操作将会执行。

3.ContentProvider初始化

  • 1.AT.main()——>AT.attach()——>AMS.attach App lication():传入一个 APT,调用转到了 AMS 进程
  • 2.AMS.attachApplicationLocked():获取到 ApplicationInfo 和 ProviderInfo 列表之后通过 APT 将调用转回 App 进程。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后:学习总结——Android框架体系架构知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。

下方即为我手绘的Android框架体系架构知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的Android框架体系架构知识脑图原件(包括上方的面试解析xmind文档)

除此之外,前文所提及的Alibaba珍藏版 Android框架体系架构 手写文档以及一本 《大话数据结构》 书籍等等相关的学习笔记文档,也皆可分享给认可的朋友!

——感谢大家伙的认可支持,Free Download请注意:点赞+点赞+点赞!!!
所提及的Alibaba珍藏版 Android框架体系架构 手写文档以及一本 《大话数据结构》 书籍等等相关的学习笔记文档,也皆可分享给认可的朋友!

——感谢大家伙的认可支持,Free Download请注意:点赞+点赞+点赞!!!
自行下载领取链接:【Git】

  • 14
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值