对问题的另一个编辑(2016)
最近(截至 2016 年及以后)我一直在做的事情,以及我对任何开发人员的建议是:
只需使用 Dagger 2。无论您需要什么,Context
您都可以:
@Inject Context context;
就是这样。在此期间,注入所有其他单例的东西。
编辑/改进的答案(2014)
因为这个答案越来越受欢迎,所以我将使用我最近使用的示例代码(截至 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();
}
原始答案
文档的建议是使用普通的单例模式
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();
}
并记得调用它来初始化单例。
Application 方法和 Singleton 方法之间的区别以及 Singleton 更好的原因在文档中same functionality in a more modular way