初学android,无意发现了个奇怪的问题,不知道getResources()方法是如何实现的。
在Activity的onCreate方法里面调用资源时用到了getResources()方法,方法正确也很好用,就是搞不懂这个方法是怎么实现的,看了源代码,发现它是属于Context类的一个方法,并且在ContextWrapper类中被实现了,实现的代码如下:
    @Override
    public Resources getResources()
    {
        return mBase.getResources();
    }
其中mBase是ContextWrapper类中定义的一个成员变量Context mBase;它是在ContextWrapper类构造的时候初始化的,
ContextWrapper类构造函数如下:
    public ContextWrapper(Context base) {
        mBase = base;
    }
而ContextWrapper的子类ContextThemeWrapper构造函数如下:
    public ContextThemeWrapper() {
        super(null);
    }   
    和
    public ContextThemeWrapper(Context base, int themeres) {
        super(base);
        mBase = base;
        mThemeResource = themeres;
    }
我就不明白了,这个Context对象是怎么初始化的?如果调用的是第一个构造函数,那么Context对象是null,这样我在Activity中调用getResources()应该会抛异常;如果是调用第二个构造函数,那么这个Context对象base又是在哪里初始化的呢?Activity类似乎没有自定义构造函数啊
求解~~~

解决方案 »

  1.   

    context是一个抽象类,怎么能被实例化呢
      

  2.   

    context是在创建组件的时候创建的,你可以去看看ActivityThread中,一些创建activity的地方,或者是service的地方。Context的类文件是ConotextImpl.java
      

  3.   

    mBase其实是ConotextImpl类的实例  至于为什么说是mBase其实是ConotextImpl类的实例呢? 
    原因:系统在启动(创建)这个Activity【Service】的时候,会创建一个ContentImpl实例,然后通过这个Activity【Service】的attach方法把这个ContentImpl实例传进去, Activity【Service】的内部就会把这个ContentImpl实例保存在mBase成员变量中。
      

  4.   

    源码在frameworks/base/core/java/android/app/ActivityThread.java文件中:具体可以查看如下方法:
    public final class ActivityThread { 
        ......
        private final void handleCreateService(CreateServiceData data){......}
        ......
        private final Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {......}
        ......
    }