为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Java

Context简介

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


https://img1.sycdn.imooc.com//5d2c83a200011a6108050502.jpg


从Context源码中得出Context是个抽象类,其功能的实现应该交给了其子类,那么我们就看看Context的继承关系


https://img1.sycdn.imooc.com//5d2c83b100010bff06670497.jpg


此图源自自郭霖大神的Blog
从源码可以看出,Context有两个直接的子类ContextWrapper和ContextImpl,并且Application,Service,Activity都继承ContextWrapper,下面我们看看ContextWrapper的源码:

https://img1.sycdn.imooc.com//5d2c83ab0001b8c808060659.jpg


从源码可以看出,ContextWrapper把功能都委托给mBase来做(代理模式)
让我们再来Context的另外一个实现类ContextImpl的源码:


https://img1.sycdn.imooc.com//5d2c83c80001f1c807940686.jpg


从源码可以看出,ContextImpl实现了Context的所有功能。综上我们可以推断ContextWrapper中的mBase应该是ContextImpl对象,下面通过Application,Activity,Service的创建流程来证实这个推断。

Application的创建流程

https://img1.sycdn.imooc.com//5d2c83e500012c4204800362.jpg


这张图主要展示了启动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了


    https://img1.sycdn.imooc.com//5d2c83ef0001c0a507510319.jpg

  2. 然后发送LAUNCH_ACTIVITY消息出去


    https://img1.sycdn.imooc.com//5d2c83f70001982c07340284.jpg

  3. 接着调用 handleLaunchActivity(...)


    https://img1.sycdn.imooc.com//5d2c842100014ad108510315.jpg

  4. 然后调用performLauncherActivity(...)


    https://img1.sycdn.imooc.com//5d2c842b00016ca710000630.jpg


    我们关注下createBaseContextForActivity(...),他创建了CotnextImpl对象,接着调用Activity的attach(...),把ContextImpl对象传了进去,从而证明了Activity内部对应的mBase就是ContextImpl。

  5. 然后调用了LoadedApk的makeApplication(...)


    https://img1.sycdn.imooc.com//5d2c844100016b1f08380550.jpg


    如果mApplication不为null则直接返回它,mApplication是LoadedApk中的一个全局对象,一个APP进程只会创建一次。然后创建ContextImpl对象,并且在调用Intrumentation的newApplication(...)的时候传了进去,接着调用了Intrmentation的callApplicationOnCreate(...)
    接下来我们看看Intrumentation的newApplication(...)和callApplicationOnCreate(...)做了什么


    https://img1.sycdn.imooc.com//5d2c844a0001794607280515.jpg


    从代码中我们可以看出,Application创建后,调用了attach(...),把ContextImpl对象传了进去,也就证明了Application内部对应的mBase就是ContextImpl,同时在attach方法中调用了执行了Application的生命周期方法attachBaseContext(...)

    https://img1.sycdn.imooc.com//5d2c845a0001653d04620108.jpg


    从代码中可以看出,callApplicationOnCreate执行



作者:黑狗狗哥
链接:https://www.jianshu.com/p/dd6916d224bf


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消