具有全局上下文的Android Singleton

根据Android文档,它指出:

通常不需要子类Application。 在大多数情况下,静态单例可以以更模块化的方式提供相同的function。 如果你的单例需要一个全局上下文(例如注册广播接收者),那么检索它的函数可以被赋予一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext()

我如何去创build一个具有全局上下文的静态单例,以便在我的应用程序中改变正在运行的活动? 有足够的静态上下文引用getApplicationContext()?

编辑/改进的答案:

因为这个答案越来越stream行,我会用最近使用的示例代码(截至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(); } 

原来的答案:

文档build议使用正常的单例模式

  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 wayloggingsame functionality in a more modular way

我的申请中有这样的课程:

 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()); } 

您可以创build一个本地应用程序类,它被devise为您正在寻找的(具有全局范围的单例)。

这个语法是:

 public class MyApplication extends Application { // Create your globally scoped variables and methods in here } 

这是支持的方式,这是正确的path。 我想你可能会错误地阅读那个特定的文档声明。

然后,您可以使用以下语法从您的活动中引用它:

 MyApplication myapp = (MyApplication) getApplicationContext(); 
Interesting Posts