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

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

  • 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 进程。
  • 3.APT.bindApplication()——>AT.handleBindApplication()——>AT.installContentProviders():到这里之后将会循环初始化 ContentProvider。
  • 4.AT.installProvider():这个方法里面有以下操作
  • 1.创建对象LA:CI.createPackageContext()中
  • 2.创建对象CI:CI.createPackageContext()中
  • 3.创建对象ContentProvider:ClassLoader创建
  • 4.CI attach到ContentProvider对象:ContentProvider.attachInfo()中
  • 5.执行onCreate回调:ContentProvider.attachInfo()中

4.BroadCastReceiver静态初始化

因为动态广播的注册时进程已创建, 基本对象已创建完成,只需要回调BroadcastReceiver 的 onReceive() 方法即可,所以这里不分析

  • 1.当收到广播时会调用AT.handleReceiver()

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

  • 3.创建对象BroadcastReceiver

  • 4.创建对象 Application

  • 5.从创建的 Application中获取 CI

  • 6.执行 onReceive() 回调

  • 5.Application初始化:由上面四个组件的初始化我们可以知道,当 App 还没启动的时候唤醒任意组件都会创建一个 Application,而这里分析的是正常情况启动一个 App 的时候创建 Application的流程。

  • 1.这里的流程其实就是包含了ContentProvider 初始化的流程,所以前面都差不多

  • 2.最后到了AT.handleBindApplication()中,这里有以下操作:

  • 1.创建对象 LA

  • 2.创建对象 CI

  • 3.创建对象 Instrumentation

  • 4.创建对象 Application;

  • 5.安装 providers

  • 6.执行 Create 回调

四、四大组件以及 App lication绑定Context的方法

由上一节我们可以知道,四大组件以及 App lication在初始化的时候都会进行Context的绑定或者创建,这节就来讲讲各个组件是如何对context进程赋值的。

  • 1.Activity:
  • 1.AT.performLaunchActivity()
  • 2.AT.createBaseContextForActivity(ActivityClientRecord , Activity)
  • 3.CI.createActivityContext(ActivityThread , LoadedApk , IBinder , int displayId , Configuration)

最后

**要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

8 (备注Android)**
[外链图片转存中…(img-EvfVlQjW-1713712581314)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值