Context에 대해 다음과 같이 설명할 수 있다.
- 애플리케이션의 현재 상태를 나타낸다.
- 활동 및 응용 프로그램에 대한 정보를 얻는데 사용할 수 있습니다.
- Res , DB 및 공유 기본 설정 등에 대한 액세스 권한을 얻는데도 사용할 수 있다.
- Activity 및 Application 클래스는 Context 클래스를 확장한 클래스이다.
Context는 ContextThemeWrapper와 ContextWrapper로 구분할 수 있습니다. Activity는 ContextThemeWrapper를 상속합니다. 그래서 layout xml을 inflate할 때 View에 theme가 적용되게 됩니다. 만약 ContextWrapper로 inflate하면 theme가 적용되지 않습니다. Application context,Broadcast Service에 전달되는 context는 ContextWrapper 입니다 ContextWrapper는 application context를 제외하면 모두 수명이 짧습니다. UI 관련된 것에 접근하려면 ContextThemeWrapper를 사용하면 됩니다. 그 외에는 ContextWrapper를 사용합니다. short-living context를 long-living object에 전달하지 말아야합니다. memory leak이 생길 수 있습니다.
: Application Context는 singleton 인스턴스이며 Activity에서 getApplicationContext()를 통해 접근이 가능합니다. Application Context는 Application LifeCycle에 묶여있어 Context가 종료된 이후에도 Context가 필요한 작업이나 Activity의 LifeScope에 벗어난 Context가 필요로 하는 작업에 적합한 Context입니다.
: Activty Context는 Activity 내에서 유효한 Context입니다. 그렇기에 Activity가 종료된다면 Context 역시 소멸됩니다. 그렇기에 사용되는 경우의 예는 Activity LifeCycle이 같은 object를 생성해야 할 때 Activity Context를 사용할 수 있습니다.
Application Context는 MyApplication, MainActivity1, MainActivity2 모두에서 사용할 수 있다.
반면 MainActivit1의 Context는 MainActivity1에서만 사용할 수 있고 MainActivity2의 Context는 MainActivity2에서만 사용이 가능하다.
싱글톤 패턴의 경우는 Application Context를 사용하는게 좋습니다. Actvity의 Context를 사용하게 된다면 해당 클래스에서 Context를 사용하지 않을때도 Activity를 참조하고 그 때문에 메모리 누수가 발생할 것이다. 그렇기에 싱글톤에서는 Application Context를 사용하는 것이 좋다. Activity Context의 경우 UI Operation(View)에서 Context가 필요하다면 이때 Activity Context를 사용한다. UI Operation의 예는 Toast, Dialog 등이 있다.
LoginActivity.this 는 Activity 클래스를 확장하는 자신의 클래스를 참조하지만 기본 클래스도 Context 클래스를 확장하므로 Application Context를 제공하는데 사용할 수 있다.
getApplication() Application 객체를 참조하지만 Application 클래스는 Context 클래스를 확장하므로 애플리케이션 Context를 제공하는데 사용할 수 있습니다.
getApplicationContext() 애플리케이션 컨텍스트를 제공한다.
getBaseContext() 활동 컨텍스트를 제공한다.
위에서 말한거 처럼 Views를 조작한다면 Activity Context를 사용하고 그렇지않다면 Application Context를 사용하면 충분하다.