본문 바로가기

android

context

1. applicationContext

//Activity 상속 구조
AppCompatActivity <- FragmentActivity <- ComponentActivity <- androidx.core.app.ComponentActivity <- Activity ContextThemeWrapper <- ContextWrapper <- Context
public class ContextWrapper extends Context
{
    @UnsupportedAppUsage
    Context mBase;

    //  ContextWrapper의 생성자에서 Context의 abstract를 구현한 ContextImpl 객체를 받아서 mBase 프로퍼티에 저장한다
    public ContextWrapper (Context base) {
        mBase = base;
    }
    ...
}
public class ContextWrapper extends Context {
    @UnsupportedAppUsage
    Context mBase;

    public ContextWrapper(Context base) {
        mBase = base;
    }

    //1. applicationContext 에 접근하면 getApplicationContext 메서드가 호출되며 ContextImpl 내의 getApplicationContext 메서드를 호출한다.
    @Override
    public Context getApplicationContext() {
        return mBase.getApplicationContext();
    }
        ...
}

class ContextImpl extends Context
{
    private final static String TAG = "ContextImpl";
    private final static boolean DEBUG = false;
    private static final String XATTR_INODE_CACHE = "user.inode_cache";
    private static final String XATTR_INODE_CODE_CACHE = "user.inode_code_cache";


    final @NonNull LoadedApk mPackageInfo;

    ...

    @Override
    public Context getApplicationContext() {
        return (mPackageInfo != null) ?
        //2. LoadedApk 객체의 getApplication 함수를 호출해서 Application 객체를 가져온다.
        mPackageInfo.getApplication() : mMainThread.getApplication();
    }

    ...
}

 

2. baseContext

public class ContextWrapper extends Context
{
    @UnsupportedAppUsage
    Context mBase;

    public ContextWrapper (Context base) {
        mBase = base;
    }

    // Base Context 를 attach 시킨다.
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException ("Base context already set");
        }
        mBase = base;
    }

    //attach 된 Base Context 를 가져오기 위한 getBaseContext
    public Context getBaseContext() {
        return mBase;
    }

    ...
}

'android' 카테고리의 다른 글

Firebase Ream-Time Database Paging 처리  (1) 2022.10.25
DialogFragment width 조정  (0) 2022.10.22
Frgament 통신  (0) 2022.10.12
Fragment Transaction 동작 분석  (0) 2022.10.10
registerForActivityResult 메서드의 동작과정  (0) 2022.02.03