工具技巧篇—获取全局Context

在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标签添加


你可能感兴趣的:(工具技巧篇—获取全局Context)