根据Android文档说明:
通常不需要子类Application。在大多数情况下, 静态单例可以在更模块化的情况下提供相同的功能 办法。如果您的单身人士需要全局上下文(例如注册 广播接收器),可以给出一个检索它的功能 内部使用
Context.getApplicationContext()
时的上下文 首先构建单身人士。
如何创建具有全局上下文的静态单例,以便它能够在我的应用程序中更改正在运行的活动?是否有足够的静态上下文引用getApplicationContext()?
答案 0 :(得分:79)
该问题的另一个编辑:
最近(截至2016年及前进的大部分时间)我一直在做的事情,并且我建议任何开发人员这样做:
使用Dagger2,只需使用Dagger 2.无论您需要Context
,都可以:
@Inject Context context;
就是这样。在此期间,注入所有其他可能是单身人士的东西。
编辑/改进答案:
因为这个答案变得有点流行,我会用最近使用的示例代码改进我自己的答案(截至2014年7月)。
首先让应用程序保持对自身的引用。
public class App extends Application {
private static App instance;
public static App get() { return instance; }
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
}
然后在任何需要访问context
的单例上我使用双重检查同步以线程安全的方式加载单例https://stackoverflow.com/a/11165926/906362
private static SingletonDemo instance;
public static SingletonDemo get() {
if(instance == null) instance = getSync();
return instance;
}
private static synchronized SingletonDemo getSync() {
if(instance == null) instance = new SingletonDemo();
return instance;
}
private SingletonDemo(){
// here you can directly access the Application context calling
App.get();
}
原始回答:
文档建议使用normal singleton pattern
public class SingletonDemo {
private static SingletonDemo instance = null;
private SingletonDemo() { }
public static SingletonDemo getInstance() {
if (instance == null) {
instance = new SingletonDemo ();
}
return instance;
}
}
并在其中包含如下方法:
private Context context;
init(Context context){
this.context = context.getApplicationContext();
}
并记得将其称为初始化单身人士。
应用程序方法和Singleton方法之间的区别以及Singleton更好的原因在于文档same functionality in a more modular way
答案 1 :(得分:5)
我的申请中有这样的课程:
public class ApplicationContext {
private Context appContext;
private ApplicationContext(){}
public void init(Context context){
if(appContext == null){
appContext = context;
}
}
private Context getContext(){
return appContext;
}
public static Context get(){
return getInstance().getContext();
}
private static ApplicationContext instance;
public static ApplicationContext getInstance(){
return instance == null ?
(instance = new ApplicationContext()):
instance;
}
}
然后例如在Launch Activity中初始化它:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//init
ApplicationContext.getInstance().init(getApplicationContext());
//use via ApplicationContext.get()
assert(getApplicationContext() == ApplicationContext.get());
}