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 |