Post

Android의 Context는 무엇인가?

Context란?

공식 문서에서는 다음과 같이 설명을 합니다.

글로벌한 애플케이션 환경 정보가 있는 인터페이스입니다. context는 안드로이드 리소스를 불러 올 수 있고, 애플리케이션 레벨 단에서 실행할 수 있는 옵션을 제공합니다. 예를 들면, context를 통해 string, color, drawable 같은 resource를 불러올 수 있으며, 새로운 activity를 시작할 수 있습니다.

우리가 흔히 사용하는 AppCompatActivity는 결국 타고타면 Context를 마지막으로 상속하는 것을 알 수 있습니다.

AppCompatActivity > FragmentActivity > ComponentActivity > androidx.core.app.ComponentActivity > Activity > ContextThemeWrapper > ContextWrapper > Context

image_1image_2

두 그림에서 볼 수 있듯이 그림판(Activity)에서 표현하는 것은 다르지만 우클릭 했을 때 나오는 속성(Context)들은 같습니다. 이러한 속성들의 집합을 Context라고 합니다.

Context의 개념을 간단하게 알아봤는데, Context에서도 여러 종류의 Context가 있습니다.

ApplicationContext

현재 Activity와 동떨어진 애플리케이션의 전체 라이프사이클을 따라가는 글로벌한 Context입니다. 그러므로 ApplicationContext는 싱글톤으로 구현 돼 있으며, Activity의 실행 여부와 관계 없이 앱이 실행 되는 동안 Context가 필요 하다면, ApplicationContext를 이용 해야합니다. 예를 들어 DB를 불러들일 때 필요한 Context는 Activity Context를 이용하는 것 보다는 Application Context를 이용하는 것이 메모리 누수를 줄일 수 있는 방법 중 하나 입니다.

가져오는 방법

  • Activity의 getApplicationContext()

ActivityContext

Activity의 Lifecycle을 따라가는 Context입니다. 따라서 Activity가 종료 되면 메모리상에 사라지며, 만약 Activity가 종료됐음에도 계속해서 Activity의 Context를 참조 하게 된다면 GC에서 걸러지지 않아 계속해서 메모리에 남게되는 메모리 누수가 발생됩니다.

가져오는 방법

  • Activity의 this 사용 (Activity는 최종적으로 Context를 extend하기 때문)
  • Fragment의 getContext() - null을 반환, requireContext() - null을 반환하지 않음

BaseContext

액티비티에서 attach() 함수 내부에서 ContextWrapper 클래스의 attachBaseContext() 함수를 호출여 ActivityThread 에서 생성한 Context 의 구현체 클래스인 ContextImpl 을 받게 됩니다. 이때 받는 context 가 baseContext 입니다. 하지만 안드로이드 SDK를 개발하는 구글 개발자의 코맨트 중 baseContext를 사용하는것을 권장하지 않는 코멘트가 있었습니다.

“Don’t use getBaseContext(), just use the Context you have.”

가져오는 방법

  • Activity의 getBaseContext()

참고

This post is licensed under CC BY 4.0 by the author.