Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc. [1]
Context
는 application 환경에 대한 전역 정보의 interface입니다. 즉, 특정 application의 resource, 클래스 등에 접근할 수 있도록 해주는 것이 Context
입니다.
Application context
Application context는 현재 프로세스가진 Application
singleton의 Context
입니다. 현재 Context
의 생명주기에서 벗어나 Application
의 lifecycle과 함께 할때 사용해야합니다. 그렇지 않으면 memory leak이 발생할 수 있습니다.
Activity context
Activity context는 Activity
가 가지는 Context
로 Activity
의 생명주기를 같이합니다.
Context
가 필요할 때, Activity
나 Application
을 넘겨줄 수도 있지만 baseContext
나 applicationContext
를 넘겨줄 수도 있습니다. Context
가 필요한대 Activity
와 Application
을 넘겨줄 수 있는 이유는 둘 다 Context
를 상속받기 때문입니다.
// ContextThemeWrapper extends ContextWrapper
public class Activity extends ContextThemeWrapper implements ...
// ContextWrapper extends Context
public class Application extends ContextWrapper implements ComponentCallbacks2
Context
로 Activity
나 Application
를 넘겨주는 것과 두 클래스의 base context를 넘겨주는 것에 대해 동작의 차이는 없습니다. 그 이유는 Activity
혹은 Application
를 넘겨줄 경우 내부에 존재하는 base context에게 동작을 delegate하고 base context를 넘겨주면 받은 context를 그대로 사용하기 때문에 둘 다 base context를 이용하기 때문입니다.
Indicates this Context can not handle UI components properly and is not associated with a
Display
instance.
Display
instance와 아무런 연관이 없는 Context
로 UI 구성 요소들을 처리할 수 없습니다.
Indicates this
Context
is associated with aDisplay
instance but should not be handled UI components properly because it doesn't receive configuration changes regardless of display property updates.
Context
가 Display
instance와 연관이 있지만 configuration change를 받지 않으므로 UI 구성 요소들을 처리하면 안됩니다.
Indicates this
Context
is anActivity
orActivity
derivedContext
.
Activity
이거나 Activity
에서 파생된 Context
입니다.
Indicates this
Context
is aWindowContext
orWindowContext
derivedContext
.
WindowContext
이거나 WindowContext
에서 파생된 Context
입니다.
Indicates this
Context
is created fromcreateSystemContext(ActivityThread)
orcreateSystemUiContext(ContextImpl, int)
or anyContext
that system UI uses.
createSystemContext
나 createSystemUiContext
로 생성되거나, 혹은 시스템 UI를 사용하는 Context
입니다.
아무런 타입을 지정하지 않은 Context
입니다. 대표적으로 applicationContext
가 있습니다.
위의 context 종류에서 UI context와 non-UI context로 나눌 수 있습니다.
// SDK 31
@Override
public boolean isUiContext() {
switch (mContextType) {
case CONTEXT_TYPE_ACTIVITY:
case CONTEXT_TYPE_WINDOW_CONTEXT:
case CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI:
return true;
case CONTEXT_TYPE_DISPLAY_CONTEXT:
case CONTEXT_TYPE_NON_UI: {
return false;
}
default:
return false;
}
}
Context
중 Activity, Window, System or system UI context는 UI Context임을 확인할 수 있습니다.
Application
을 이용하여 Activity
를 시작할 수 있지만 새로운 task를 생성해야합니다. 특정 상황에 적합할 수도 있으나, 일반적이지 않은 back stack 동작을 만들 수 있으며 일반적으로 권장되지 않습니다.
가능하지만 application에 정의된 theme이 아닌 기본 theme을 사용하여 inflate됩니다.
Android 4.2 이상에서 receiver
가 null일 경우 sticky broadcast의 현재 값을 얻기위해 사용됩니다.
여기에서 ContentProvider
와 BroadcastReceiver
는 Context
가 아닙니다. 하지만 ContentProvider
는 생성시 Context
를 받고 getContext
를 이용하여 Context
를 가져올 수 있습니다. BroadcastReceiver
는 새로운 broadcast event 발생시 프레임워크에서 ReceiverRestrictedContext
를 넘겨줍니다.
[1] "Context," Android Developers, last modified Apr 26, 2022, accessed May 9, 2022, https://developer.android.com/reference/android/content/Context.
[2] "Context, What Context?," POSSIBLE Mobile. last modified n.d., accessed May 11, 2022, https://web.archive.org/web/20150329210012/https://possiblemobile.com/2013/06/context/.