通过一些所谓的“好”消息来源来了解Android中的上下文处理的细节和技巧我多次遇到一种我无法理解的模式。
当您同样可以使用隐式上下文时,使用ContextWrapper有什么好处?
例如,为什么在活动方法中使用以下内容(直接在Activity类中定义)
...
ContextWrapper cw = new ContextWrapper(getApplicationContext())
File filesDir = cw.getFilesDir();
...
而不仅仅是
...
File filesDir = getFilesDir();
...
即使在ContextWrapper类中定义了getFilesDir(),Activity仍然是ContextWrapper的子类,所以你无论如何都可以直接访问该方法。
那么潜在的问题(我没看到)会增加这个复杂性的地址吗?
答案 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();
}
};