为什么直接在Activity中使用ContextWrapper而不是来自“this”

时间:2015-07-13 11:23:30

标签: android android-context

通过一些所谓的“好”消息来源来了解Android中的上下文处理的细节和技巧我多次遇到一种我无法理解的模式。

当您同样可以使用隐式上下文时,使用ContextWrapper有什么好处?

例如,为什么在活动方法中使用以下内容(直接在Activity类中定义)

...
ContextWrapper cw = new ContextWrapper(getApplicationContext())
File filesDir = cw.getFilesDir();
...

而不仅仅是

...
File filesDir = getFilesDir();
...

即使在ContextWrapper类中定义了getFilesDir(),Activity仍然是ContextWrapper的子类,所以你无论如何都可以直接访问该方法。

那么潜在的问题(我没看到)会增加这个复杂性的地址吗?

1 个答案:

答案 0 :(得分:7)

我会说(我可能错了)在你呈现的场景(和上下文)中可能没有什么区别。 getApplicationContext().getFilesDir()本来可以轻松使用。

但是,我相信ContextWrapper在其他情况下可能会有用。据我所知,这是适配器模式。您可能希望仅为某些方法提供不同的行为,同时代理您传入的原始上下文引用的所有其他行为。

查看RemoteViews的这段代码:

// RemoteViews may be built by an application installed in another
// user. So build a context that loads resources from that user but
// still returns the current users userId so settings like data / time formats
// are loaded without requiring cross user persmissions.
final Context contextForResources = getContextForResources(context);
Context inflationContext = new ContextWrapper(context) {
    @Override
    public Resources getResources() {
        return contextForResources.getResources();
    }
    @Override
    public Resources.Theme getTheme() {
        return contextForResources.getTheme();
    }
};