工具技巧篇—获取全局Context
2015-10-31 本文已影响939人
陈大集
在Android开发中,我们经常会使用到Context对象,Context即上下文环境,如当我们想要输出调试信息时,经常使用的
Toast.makeText(this,"Android小技巧-获取全局Context", Toast.LENGTH_SHORT).show();
//public static Toast makeText(Context context, CharSequence text, @Duration int duration)
存在的问题
1.每次都需要传入Context对象十分繁琐;
2.一般是从Activity和Fragment等组件中获取,当方法脱离了它们后,无法获取,需要传入Context参数,治标不治本。
3.传统的做法限制了框架的发展,如无法将Toast方法封装,即�传统的方法是
public static toast(Context context,String msg){
Toast.makeText(context,"Android小技巧-获取全局Context", Toast.LENGTH_SHORT).show();
}
传统的封装方式把Context的来源交给了调用者,未免有些不负责任,那么理想的方式是Toast只需关注要显示的msg,无需关注context,即
public static toast(String msg){
Toast.makeText(全局Context,"Android小技巧-获取全局Context", Toast.LENGTH_SHORT).show();
}
解决的方案
Android提供了一个Application类,每当App启动时,系统会将Application进行初始化,并存在于App的整个生命周期中。
细心的开发者会注意到,我们可以在Application内对一些全局状态的信息进行管理,如Context、如Volley的RequestQueue、如Universal-Image-Loader的初始化。
那么,在Application中,我们只需在程序启动时获取一次Context,随后需要Context的地方只需从Application中获取即可。
核心代码如下:
//上下文
public static Context context;
public static Context getContext() { return context;}
@Overridepublic void onCreate() {
super.onCreate();
context = getApplicationContext();
}
整体代码
public class App extends Application {
public static App app;//单例化Application
public static App getApp() {
if (app == null) {
synchronized (App.class) { //线程安全
if (app == null) {
app = new App();
}
}
}
return app;
}
//上下文
public static Context context;
public static Context getContext() { return context;}
@Overridepublic void onCreate() {
super.onCreate();
context = getApplicationContext();
}
}
当然,别忘记了在AndroidManifest.xml中的Application标签添加
<application
android:name="包名.App"
....../>