Application,Activity,Service的创建流程(1)

本文详细探讨了Android中Context的概念及其实现原理,通过源码分析揭示了ContextWrapper与ContextImpl的关系,以及它们在Application、Activity和服务中的角色,强调了Context在Android应用中的核心地位。

Context简介

Context的中文意思是上下文,可以简单的理解为运行环境,提供一些非常Base的接口,例如获取资源管理器,App缓存目录等

从Context源码中得出Context是个抽象类,其功能的实现应该交给了其子类,那么我们就看看Context的继承关系
此图源自自郭霖大神的Blog 从源码可以看出,Context有两个直接的子类ContextWrapper和ContextImpl,并且Application,Service,Activity都继承ContextWrapper,下面我们看看ContextWrapper的源码:
从源码可以看出,ContextWrapper把功能都委托给mBase来做(代理模式) 让我们再来Context的另外一个实现类ContextImpl的源码:
从源码可以看出,ContextImpl实现了Context的所有功能。综上我们可以推断ContextWrapper中的mBase应该是ContextImpl对象,下面通过Application,Activity,Service的创建流程来证实这个推断。

Application的创建流程

这张图主要展示了启动Activity,Service的简要过程,在启动Activity,Service的同时也会创建Application a. ActivityThread就是我们常说的UI线程,它负责Activity,Service,Application的调度等工作,感兴趣的朋友可以阅读下他的源码. b. ApplicationThread是ActivityThread的一个内部类,本质上是一个IBinder对象,他的主要作用是用于AMS(ActivityManagerService的简称)与ActivityThread通信,例如AMS在处理完Server端ActivityRecord的创建,栈管理后通过ApplicationThread来通知ActivityThread可以创建对应的Activity和执行Activity的生命周期了。

下面我们从AMS回调启动Activity的流程来看下Application的创建流程
  1. AMS会通过调用ApplicationThread的scheduleLaunchActivity(...)来告诉ActivityThread它可以创建Activity了
  2. 然后发送LAUNCH_ACTIVITY消息出去
  3. 接着调用 handleLaunchActivity(...)
  4. 然后调用performLauncherActivity(...)
    我们关注下createBaseContextForActivity(...),他创建了CotnextImpl对象,接着调用Activity的attach(...),把ContextImpl对象传了进去,从而证明了Activity内部对应的mBase就是ContextImpl。
  5. 然后调用了LoadedApk的makeApplication(...)
    如果mApplication不为null则直接返回它,mApplication是LoadedApk中的一个全局对象,一个APP进程只会创建一次。然后创建ContextImpl对象,并且在调用Intrumentation的newApplication(...)的时候传了进去,接着调用了Intrmentation的callApplicationOnCreate(...) 接下来我们看看Intrumentation的newApplication(...)和callApplicationOnCreate(...)做了什么
    从代码中我们可以看出,Application创建后,调用了attach(...),把ContextImpl对象传了进去,也就证明了Application内部对应的mBase就是ContextImpl,同时在attach方法中调用了执行了Application的生命周期方法attachBaseContext(...)
    从代码中可以看出,callApplicationOnCreate执行了Application生命周期方法onCreate(...)
上面的代码都是在UI线程执行的,因此不要在Application的生命周期方法attachBaseContext(...)和onCreate(...)做耗时操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值