目前,在我的应用程序中,我有以下课程:
public class MyApp extends Application {
private static Context context;
public void onCreate(){
super.onCreate();
MyApp.context = getApplicationContext();
}
public static Context getContext() {
return MyApp.context;
}
}
我使用它来在既不是活动也不是片段的类中使用Context。使用存储在此类上的上下文与使用和活动作为上下文之间有什么区别?拥有这门课程是一种很好的做法,还是应该为任何需要它的班级提供一个活动作为背景?
感谢。
答案 0 :(得分:15)
使用存储在此类上的上下文与使用和活动作为上下文之间有什么区别吗?
是。请阅读有关该主题的Dave Smith's epic blog post。总结:当您知道为什么 Application
是正确答案时,只能使用Application
...而且很少。
恕我直言,通常不是。有时您可能需要一个拥有这门课程是个好习惯
Application
对象,但是您不需要自己的自定义子类,也不需要将它设为单例。
我应该将活动作为上下文提供给任何需要它的班级吗?
您将正确的 Context
实例提供给任何需要它的方法。正如Dave Smith在该博客文章中所描述的那样,并非所有Context
个实例都是平等的。仅当 Application
是正确的Application
时才使用Context
。
答案 1 :(得分:5)
是的,这很好。对应用程序的Context
进行静态引用不会导致任何内存泄漏。只要进程存活,就会存在Context
。
答案 2 :(得分:0)
如果您需要这样做,我认为您需要重新考虑您的设计。你不应该在Activity,Fragment,Service等之外需要Context(我能想到)。一切都应该来自基本的应用程序组件,你应该能够适当地传递Context而不需要这样做。例如,您可以从“视图”中调用getContext()
来抓取它。如果你需要在POJO中使用它,那么它应该与应用程序组件绑定并通过构造函数传递它。
编辑:好像你可能没有内存泄漏问题?我记得当有人这样做时,阅读有关屏幕方向变化的破坏性破坏。无论如何,从设计的角度来看,对我来说没有多大意义。
edit2:你们是对的。我错误地记得了Romain关于它的博客文章。