如何获取全局Context?
开发过程中经常会用到Context,但是如果不在Activity或者Service,比如在Presenter层有时就无法获取到Context,非常棘手。有办法!定义全局应用唯一的一个静态Application Context,虽然是静态的,但是生命周期和应用一样,不存在内存泄漏。
1、自定义Application
定义静态的Context变量,重写onCreate()方法,在执行完super.onCreate()之后让静态的Context变量持有当前应用的Application Context。
public class MyApplication extends Application {
private static Context sApplication;
@Override
public void onCreate() {
super.onCreate();
sApplication = this;//注意需要在执行完super父类的onCreate()方法之后才可以赋值
}
public static Context getContext() {
return sApplication;
}
}别忘了在AndroidManifest.xml中指定android:name为当前自定义的Application类。
<application
android:name=".MyApplication">
...
</application>不管在项目的任何地方获取到应用的Context,只需要调用MyApplication.getContext()就可以获取到可用的Context。
2、获取ApplicationContext源码
在Application类中,调用getApplicationContext()获取到的Context其实和当前Application this是同一个
@Override
public Context getApplicationContext() {
return mBase.getApplicationContext();
}在各种Context及其初始化流程中知道mBase其实是ContextImpl类型,查看其中的方法
@Override
public Context getApplicationContext() {
return (mPackageInfo != null) ?
mPackageInfo.getApplication() : mMainThread.getApplication();
}mPackageInfo成员变量是LoadedApk类型,它的getApplication()方法如下:
Application getApplication() {
return mApplication;
}还记得在各种Context及其初始化流程中Application Context的初始化过程中,调用makeApplication()方法初始化本应用的Context:
public Application makeApplication(boolean ,Instrumentation ) {
if (mApplication != null) {
return mApplication;
}
...
Application app = null;
...
ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
app = mActivityThread.mInstrumentation.newApplication(
cl, appClass, appContext);
...
mApplication = app;
...
}后者mMainThread则是ActivityThread,从管理当前应用进程的ActivityThread获取当前应用的Context
@UnsupportedAppUsage
public Application getApplication() {
return mInitialApplication;
}mInitialApplication是ActivityThread的Application类型成员变量,就是当前应用,在初始化应用的时候通过向mH发送消息,调用handleBindApplication(AppBindData )方法绑定

