Toast나 Dialog를 사용할 때 Activity 클래스에서는 this, 클래스명.this, getApplicationContext()를 사용하고, Fragment에서는 getContext()를 사용하곤 했다.
그런데 이들의 차이점을 알아야 할 필요가 있어서 정리를 해보려고한다.
1. Context
- 추상 클래스
- 앱의 resource나 Android 시스템에서 제공하는 API에 대한 정보에 접근하기 위한 인터페이스
- 구현은 안드로이드 시스템에 의해 제공
Context는 액티비티 단위인 ActivityContext와 앱 단위인 ApplicationContext 두 가지로 나뉜다.
2. ApplicationContext
ApplicationContext는 단어 그대로 Application과 관련된 Context이다. 앱의 LifeCycle을 따르며 앱이 실행되는 동안 변경되지 않는다. Singleton 형태로 구현되어 있기 때문에 중복으로 인스턴스가 생성되지 않는다.
즉, 앱을 종료하는 순간 같이 소멸한다는 것이다.
ApplicationContext의 한계는 GUI와 관련된 작업이 불가능하다는 점이다.
예를 들면, Dialog를 생성하는 코드를 입력할 때 context로 ApplicationContext를 사용한다면 오류가 발생한다.
유일하게 ApplicationContext를 활용하여 GUI 작업이 가능한 것은 Toast이다.
ApplicationContext에 접근하려면 getApplicationContext() 메소드를 사용하면 된다.
3. ActivityContext
ActivityContext는 단어 그대로 Activity와 관련된 Context이다. Activity의 LifeCycle을 따르며, 액티비티가 destroy 될 때 같이 소멸하는 Context이다.
액티비티가 destroy 되어도 context가 살아있어야 한다면, 앞에 설명했던 ApplicationContext를 활용해야 한다.
액티비티가 destroy 되었는데, ActivityContext를 참조하고 있다면 NPE(NullPointerException)이 발생할 수 있다.
액티비티는 UI화면을 가지는 안드로이드 구성 요소이다. ActivityContext는 GUI 작업이 가능하다. 앞에서 불가능했던 Dialog를 띄우는 작업은 ActivityContext를 활용한다.