如何获取全局Context?

QuibblerQuibbler 2020-07-15 约 6 分钟 1943 次阅读

如何获取全局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 )方法绑定

相关推荐