关于应用中突然调到ContextImpl方法的问题

问题起因


        最近查看自己的代码是发现了一个问题,就是我在自己的应用中调用Context的方法,但是一开始没有找到方法的实现,最后发现是在ContextImpl中实现的,我查看了我的Activity的继承情况,发现并没有和ContextImpl类有任何继承关系。最后怎么会调到ContextImpl的呢?

          可以很容易发现,我们自己写的Activity通常都会间接地继ContextWrap,ContextWrap又是继承Context的,而Context又是一个抽象的类,虽然里面声明了大量的方法,但是自身是并没有实现这些方法的。这些方法的实现被放在了ContextImpl类中,ContextImpl继承了Context,但是不管我们的Activity还是ContextWrap都没有和ContextImpl有继承关系。

问题解决

         哈哈,问题还是需要从源码中找答案:还记我们在之前分析的一篇Android_Application启动梳理,再回到那篇文章,在讲到Application对象的创建的时候,我们要向它传入有appContext,哈哈,这就是很关键的信息了。(现在想想这个问题当初就应该明白了,但是在我遇到今天的问题是没马上明白,还得在重新翻看代码时才想清,源码还是要多看啊)。

public Application makeApplication(boolean forceDefaultAppClass,
        Instrumentation instrumentation) {
    if (mApplication != null) {
        return mApplication;
    }
    ...
    ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
    app = mActivityThread.mInstrumentation.newApplication(
                    cl, appClass, appContext);
    ...
    return app;
}
    public Application newApplication(ClassLoader cl, String className, Context context)
            throws InstantiationException, IllegalAccessException, 
            ClassNotFoundException {
        Application app = getFactory(context.getPackageName())
                .instantiateApplication(cl, className);
        app.attach(context);
        return app;
    }
final void attach(Context context) {
        attachBaseContext(context);
        ...
    }

          当时我们分析到在创建完Application对象后,执行了attach()方法,最后这个attach()方法将我们创建的context复制给了mBase。问题就出在这儿,我们再想想,为什么当时创建的appContext是ContextImpl对象???这就是为了我们以后在使用Context方法;应用对Context的操作都会转移到mBase上,现在mBase是ContextImpl的一个对象了,自然而然的就会调用ContextImpl类中的实现方法了.

           我们再要知道Android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,在创建Application时都会给mBase赋值为ContextImpl对象.这样我们就很容易想到本来调用Context的方法是怎么调用ContextImpl中去的。

发布了41 篇原创文章 · 获赞 35 · 访问量 4336

猜你喜欢

转载自blog.csdn.net/weixin_38140931/article/details/101773817
今日推荐