Android中Context的继承关系详解

2020-08-18  本文已影响0人  dashingqi
Android_Banner.jpg

简介

继承关系

Android中的Context.png
Context
ContextImpl
ContextWrapper
ContextImpl和ContextWrapper的关系
ContextThemeWrapper Service Application
Activity

ContextWrapper中的源码以及mBase

public AssetManager getAssets() {
        return mBase.getAssets();
    }

    @Override
    public Resources getResources() {
        return mBase.getResources();
    }

    @Override
    public PackageManager getPackageManager() {
        return mBase.getPackageManager();
    }

    @Override
    public ContentResolver getContentResolver() {
        return mBase.getContentResolver();
    }

    @Override
    public Looper getMainLooper() {
        return mBase.getMainLooper();
    }

    @Override
    public Executor getMainExecutor() {
        return mBase.getMainExecutor();
    }

    @Override
    public Context getApplicationContext() {
        return mBase.getApplicationContext();
    }
    
    @Override
    public void setTheme(int resid) {
        mBase.setTheme(resid);
    }

    /** @hide */
    @Override
    @UnsupportedAppUsage
    public int getThemeResId() {
        return mBase.getThemeResId();
    }

    @Override
    public Resources.Theme getTheme() {
        return mBase.getTheme();
    }

    @Override
    public ClassLoader getClassLoader() {
        return mBase.getClassLoader();
    }

    @Override
    public String getPackageName() {
        return mBase.getPackageName();
    }

    /** @hide */
    @Override
    @UnsupportedAppUsage
    public String getBasePackageName() {
        return mBase.getBasePackageName();
    }

    

    @Override
    public ApplicationInfo getApplicationInfo() {
        return mBase.getApplicationInfo();
    }
    
    @Override
    public String getPackageResourcePath() {
        return mBase.getPackageResourcePath();
    }

    @Override
    public String getPackageCodePath() {
        return mBase.getPackageCodePath();
    }

    @Override
    public SharedPreferences getSharedPreferences(String name, int mode) {
        return mBase.getSharedPreferences(name, mode);
    }

    /** @removed */
    @Override
    public SharedPreferences getSharedPreferences(File file, int mode) {
        return mBase.getSharedPreferences(file, mode);
    }

    /** @removed */
    @Override
    public File getSharedPreferencesPath(String name) {
        return mBase.getSharedPreferencesPath(name);
    }

   
    @Override
    public void startActivity(Intent intent) {
        mBase.startActivity(intent);
    }

    /** @hide */
    @Override
    public void startActivityAsUser(Intent intent, UserHandle user) {
        mBase.startActivityAsUser(intent, user);
    }

    /** @hide **/
    public void startActivityForResult(
            String who, Intent intent, int requestCode, Bundle options) {
        mBase.startActivityForResult(who, intent, requestCode, options);
    }
mBase
public ContextWrapper(Context base) {
        mBase = base;
    }
    
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }

几个问题

Activity数量+Service数量+Application数量(通常为1,一个进程中只有一个Application)

两者获取的都是应用程序的Application对象,获取到的是同一个对象
getApplication() 通常用于Service,Activity 中,而getApplicationContext()用于比如BroadcastReceiver中获取Application
getApplicationContext同时也是ContextWrapper中的,相比较于getApplication(),getApplicationContext的作用域更广一些,getApplication()从语意上看,更强一些就是用于获取Application

Application本身是单利,全局就仅仅有一个,不需要进行多重检查了,哈哈哈!

不可以的,会报错;
因为 Application是继承ContextWrapper的,而ContextWrapper中实现的抽象方法是交由ContextImpl来实现的,ContextImpl的获取是交由内部的attachBaseContext的,如果在构造方法中调用实现的抽象方法,会报错的,此时mBase为null

不能在构造方法中调用实现的抽象方法,可以在 attachBaseContext(){super() 之后调用},也可以在onCreate中调用

上一篇 下一篇

猜你喜欢

热点阅读