
Android Context
애플리케이션 환경에 대한 전역 정보가 컨텍스로 연결된다. Context 구현이 Android 시스템에 의해 제공되는 추상 클래스이다. 애플리케이션 별로 리소스 및 클래스에 대한 접근은 물론 Activity의 실행, 브로드 캐스팅 및 Intent 수신과 같은 애플리케이션 레벨에 대한 호출을 허용한다.
즉, Context를 사용하면 시스템 레벨의 정보를 얻을 수 있는 메소드를 사용가능 해진다. (getPackageName(), getResource(), startActivity(), startService(), getSystemService()) 또한, 시스템에 대한 리소스 확인 및 데이터베이스 및 환경 설정에 대한 액세스 확보등과 같은 서비스를 제공할 수 있다.
Android 애플리케이션 내에 다수의 Activity들이 존재하는데, 이것은 애플리케이션이 현재 실행중인 환경에 대한 핸들과 같다. Activity객체는 Context 객체를 상속 받게 된다. 이로써, Activity는 애플리케이션의 특정자원, 클래스, 애플리케이션의 환경 정보에 대해 접근할 수 있게 된다.
Context는 2가지 유형이 존재하는데 Application Context와 Activity Context이다. Application Context는 Application 전용 인스턴스이고, Activity Context는 Activity 전용 인스턴스이다.
Application Context vs Activity Context
Application Context는 애플리케이션과 관련되어 있고 애플리케이션이 살아있는 동안 변경되지 않는다. 그러므로 싱글톤이며 getApplicationContext()를 통해 Activity에서 접근할 수 있는 인스턴스이다. Context는 애플리케이션이 생명주기와 관련되어 있기 때문에 현재 Context와 분리된 어떤 Context가 필요하거나, 현재 Activity Scope을 벗어난 작업을 할때 필요하다.
즉, 라이프 사이클이 현재 컨텍스트와 분리된 Context가 필요한 경우에만 사용하면 된다. 이는 자체적으로 전역범위를 가질 Context에 연결된 무언가가 필요한 경우 getApplicationContext()를 사용하면된다.
💡 EX ) MVVM 패턴 적용 시 Activity의 Context가 아닌 Application Context 접근을 통해 Database에 접근하려는 경우
Application Context에 Activity를 참조하게 되면 Activity가 부서지더라도 참조가 유지되므로, Activity가 GC(가비지 콜렉팅)되지 않으므로 메모리 누수가 발생한다.
GUI (화면, View 등)관련된 작업에는 적합하지 않는다. 이유는 Application Context는 프로세스 수명 동안 유지 되는거고, GUI 작업은 Activity에 종속되어 사용되기 마련이기 때문이다. 그러나 언제나 그렇듯이 예외사항은 있다. 그 예외사항은 Toast 메시지다. Toast는 어디에나 띄울수 있기 때문에 Application Context, Activity Context를 모두 사용 가능하다.
Activity Context는 액티비티와 관련있고, 액티비티가 종료되면 같이 Destory되는 컨텍스트다.
즉, 액티비티 라이프사이클과 연결되어 있으며 액티비티 수준의 Context가 필요한 경우에 사용하게 된다.
💡 EX ) AlertDialog , Dialog, layout inflat 같이 한 액티비티에서 다뤄야 하는 작업을 하는 경우

액티비티는 자신의 Context와 애플리케이션 Context를 모두 가지고 있으며 getContext() 혹은 this를 사용할 경우 액티비티 Context가 return 된다.
Context 얻기
View.getContext()
- 현재 뷰가 가지고 있는 Context를 반환하는데, 일반적으로는 Activity에서 View를 띄우기 때문에 Activity의 Context가 된다.
Activity.getApplicationContext()
- 애플리케이션 전체의 컨텍스트를 반환한다. 현재 액티비티 뿐만 아니라 애플리케이션의 수명주기와 관련된 컨텍스트가 필요한 경우 Activity Context 대신 이 값을 사용하면 된다.
ContextWrapper.getBaseContext()
- 다른 컨텍스트로부터 어떤 컨텍스트에 접근해야하는 경우에 ContextWrapper를 쓴다. ContextWrapper 내부에서 참조된 Context는 getBaseContext()를 통해 엑세스 된다.