具有全局上下文的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 way
loggingsame 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();