👀 Context 란?
Context는 애플리케이션 환경에 대한 글로벌 정보를 갖는 인터페이스입니다. Context는 Android 시스템에서 구현체를 제공하는 추상 클래스로, 애플리케이션 별 리소스 및 클래스 접근에 사용되며, 액티비티 실행, 브로드캐스트, 인탠트 수신 등과 같은 애플리케이션 수준 작업에 사용됩니다.
위의 내용은 android developer 사이트에 있는 내용이다.
조금 더 쉽게 설명해보자면, context는 추상클래스이고, 어플리케이션의 현재 상태와 무슨 일이 일어나고 있는지를 알 수 있다는 내용이다.
- 어플리케이션, 액티비티의 현재 상태를 나타낸다.
- 리소스, 데이터베이스, 파일, sharedpreferences 등의 접근하기 위해 사용 가능하다.
- 어플리케이션, 액티비티 class 는 context 를 확장한 class 이다.
👉 참고 사이트 : https://developer.android.com/reference/android/content/Context
👀 Context의 종류
-
Application Context
- singlegon instance 이며, activity 에서 getApplicationContext() 를 통해 접근할 수 있다.
- Application LifeCycle에 따른다.
- 현재 Context가 종료된 이후에도 context 가 필요한 작업 등에 사용하기 적합하다.
- ContentProvider를 상속한 class에서 getContext() 를 통해 가져온 context는 application context이다.
- 프로세스가 살아있는 동안 남아있는다.
- singleton의 경우에는 항상 애플리케이션 컨택스트를 전달해야 한다. 만약 singleton과 같은 경우에 activity context를 전달한다면, activity가 화면에 표시되지 않는 순간에도 activity를 참조하기 때문에 가비지 콜렉션이 진행되지 않아 메모리 누수가 발생한다.
-
Activity Context
- activity 내에서 유효한 context 이며, activity LifeCycle과 연결되어 있다.
- 가비지 콜렉션이 가능하다.
- activity 와 lifecycle이 같은 오브젝트를 생성할 때와 같이 activity와 함께 소멸해야 하는 경우 사용하기 적합하다.
- 예를 들어, Toast와 같이 UI에서 Context를 필요로 한다면 activity context를 사용하면 된다.
Application Context는 Activity Context에서 제공하는 기능 전체를 제공하지 않는다. 또한 Application Context가 사용자 호출로 생성되었지만, clean up 되지 않은 객체를 가지고 있다면 메모리 누수가 발생할 수 있다.
👀 엄지 손가락의 법칙(The Rule Of Thumb)
대부분의 경우 가장 가까운, 스코프에 해당하는 컨택스트를 직접 사용하세요. 참조가 해당 컴포넌트의 라이프사이클을 넘어서지 않는 이상 메모리 누수 걱정 없이 컴포넌트를 유지할 수 있습니다. 액티비티나 서비스 이외의 객체에서 컨택스트를 참조해야 하는 경우 액티비티 컨택스트가 아닌, 애플리케이션 컨텍스트로 전환하세요.