理解Context

作者: LeoFranz | 来源:发表于2019-10-14 00:36 被阅读0次

    我们平时对Context的理解无外乎两方面:

    • 调用Context的方法,比如启动activity,访问资源;
    • 作为参数传入context,比如弹出Toast,创建dialog
    image.png

    ContextImpl实现了context的大部分功能,对应ContextWrapper中的成员变量mBase,这里体现了装饰模式,即ContextWrapper是ContextImpl的包装类,ContextImpl的实现就能根据不同组件的创建方式有所拓展,此外ContextWrapper本身也是可拓展的,如ContextThemeWrapper就包含主题相关方法,适用于作为activity的父类。

    这种装饰模式的使用好处在于

    • 对调用者提供统一的context接口,调用者不用关心contextImpl的具体实现
    • ContextImpl的变化能对包装者隐藏。

    Context的创建过程
    整体而言,Context的子类最终都要绑定一个ContextImpl才能实现真正的context功能。
    1、Application Context的创建
    在ApplicationTread通知ActivityThread创建application的时候,在ActivityThread的performLaunchActivity中LoadedApk.makeApplication中创建对应的ContextImpl,然后通过Application.attach方法将Application和ContextImpl绑定,ContextImpl会传递成为ContextWrapper中的mBase类。

    一个细节在于,application创建后会成被赋值到LoadedApk中的mApplication对象,最终我们getApplication和getApplicationContext其实获取的是同一个对象。

    2、Activity Context的创建
    创建activity流程中,在ActivityThread的performLaunchActivity中,创建ContextImpl之后创建activity实例,然后通过Activity.attach方法将activity和ContextImpl绑定。
    3、Service Context的创建
    和Activity的绑定Context过程类似,不过最后是在ActivityThread.handleCreateService方法中完成context的生成和attach工作。

    相关文章

      网友评论

        本文标题:理解Context

        本文链接:https://www.haomeiwen.com/subject/xxnkmctx.html