在安卓系统中,哪个类实现了ContextWrapper的方法?

3
当我开发Android应用程序时,我喜欢查看内部SDK实现。这是一个庞大的框架,如果您了解内部方法的实现方式,则有时会对您有所帮助。
现在我做的最后一个源代码检查真的让我感到困惑。我查看Context类以阅读一些实现。不幸的是,它们中的大多数都是抽象的,这就是为什么Android发明了ContextWrapper(一个简单的适配器模式)。
问题在于,我找不到我感兴趣的某些方法。以getResources作为例子。我有一个Context对象,并在其上调用getResources。这个Context是Activity的一个实例(它本身没有实现getResources())。
同样对于ContextThemeWrapper,它是Activity的直接父类。然后,ContextWrapper在其Context成员上调用getResources()。但是那时谁在实现它呢?
编辑:添加了来自ContextWrapper的代码片段。
public class ContextWrapper{
    Context mContext

    public ContextWrapper(Context ctx){
        mContext = ctx
    }

    public Resourced getResources(){
        return mContext.getResources()
    }

    //... all other Methods are implementing the same AdapterPattern
}

所以问题也可以是“哪个Context被传递给实现所需方法的ContextWrapper”。

你是否尝试过调用该方法然后进行代码调试? - nicholas.hauschild
如果将Android源代码附加到库中,那么阅读和调试就会变得更加容易。 - nicholas.hauschild
2个回答

3

在nicholas.hausschild的有用提示下,我终于自己找到了答案,只需要运行调试器即可。

不幸的是,这似乎是唯一的方法,因为它是实现在名为ContextImpl的类中的,该类是包可读的(尽管没有文档记录)。您必须安装Eclipse源代码插件(如果您已经下载并链接了Android-SDK到eclipse中,则安装起来可能有些小问题)才能看到源代码。

对于任何对这些源代码感兴趣的人:点击这里


2
Context类的getResources()方法是抽象的,这意味着从它继承的任何内容都需要提供或覆盖其实现。在ContextWrapper类上实现的getResources()方法是具体的,并且您应该在其中找到其代码。
此外,您的继承链有点颠倒了。 ActivityContextThemeWrapper的子类,而不是相反。
java.lang.Object
  ↳ android.content.Context              // abstract Resources getResources()
    ↳ android.content.ContextWrapper     // Resources getResources()
      ↳ android.view.ContextThemeWrapper // inherits ContextWrapper.getResources()
        ↳ android.app.Activity           // inherits ContextWrapper.getResources()

Android开发者参考文献将帮助您理解继承结构。


你说的关于ContextThemeWrapper的内容是正确的,但这不是我想要表达的。我已经纠正了拼写错误。但是你的回答并没有解决问题:我提到了我知道ContextWrapper中getResources方法的实现是具体的。看一下我的编辑以了解它是怎么实现的。 - Rafael T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接