初学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类似乎没有自定义构造函数啊
求解~~~
在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类似乎没有自定义构造函数啊
求解~~~
解决方案 »
- 如何用android实现临近提醒???
- android里的scaledDensity的含义!!!
- android中的java.net.SocketException:Permission denied异常
- public static class Builder类中类是什么回事?
- AudioRecord录音问题
- Android 源码编译问题。。
- android DigitalClock怎么设置时间?
- XmlSerializer生成xml文件时出错
- 使用NDK可以调用底层函数吗
- 怎么把小米手机变成红外遥控器
- android关于获取控件高度的问题
- 如何使用Windowsmanager直接在屏幕上花slidingdrawer?
原因:系统在启动(创建)这个Activity【Service】的时候,会创建一个ContentImpl实例,然后通过这个Activity【Service】的attach方法把这个ContentImpl实例传进去, Activity【Service】的内部就会把这个ContentImpl实例保存在mBase成员变量中。
public final class ActivityThread {
......
private final void handleCreateService(CreateServiceData data){......}
......
private final Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {......}
......
}