如何获取全局Context?

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

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

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w