Glacier's Daily Log

무심코 쓴 getApplicationContext()에 대해서 알아보자 (feat. Dialog에 applicationContext 쓰면 안되는 이유) 본문

Coding/Android

무심코 쓴 getApplicationContext()에 대해서 알아보자 (feat. Dialog에 applicationContext 쓰면 안되는 이유)

h__glacier_ 2023. 7. 11. 14:00
반응형

안드로이드 개발을 해본 사람이라면, getApplicationContext() 함수를 정말 많이 마주했을 것이다.

안드로이드 개발에서 Context는 정말 많은 부분을 차지한다.

 

우선 Context란?

사전적 의미는 맥락을 뜻한다.

 

안드로이드 공식문서에는 아래와 같이 설명되어있다.

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
애플리케이션 환경에 대한 전역 정보의 인터페이스이다.이것은 안드로이드 시스템에서 구현을 제공하는 추상 클래스이다.애플리케이션 특화 리소스와 클래스에 대한 접근을 허용하고, 뿐만 아니라 애플리케이션 수준의 작업(액티비티 시작, 브로드캐스팅, 인텐트 수신 등등)에 대한 호출을 허용한다.

대충 안드로이드 환경에 global한 부분에 접근하는 인터페이스 정도라고 이해할 수 있다.

 

따라서 우리가 안드로이드 개발시 화면이동, UI변경, 리소스 불러오기 등 모든 부분에서 Context를 인자로 넣는 것이다.

하지만 이 Context를 사용하는 방법은 여러가지가 있다.

 

예를 들어 Intent로 예를 들면

Intent(this, SettingActivity::class.java) 라고 해도 작동하고

Intent(this@MainActivity, SettingActivity::class.java) 라고 해도 작동하고

Intent(applicationContext, SettingActivity::class.java) 라고 해도 작동할 것이다.

 

그럼 이렇게 사용했을때 차이와, Context를 어떻게 사용하는것이 올바른지 간단하게 알아보자.


ApplicationContext와 ActivityContext

- ApplicationContext
  > ApplicationContext는 어플리케이션 생명주기를 따르며 어플리케이션이 실행되어 종료될 때까지 동일한 객체를 참조합니다.
   사용법 : getApplicationContext(), getApplication() -> 코틀린에서는 applicationContext, application

- ActivityContext
  > ActivityContext는 액티비티 생명주기를 따르며 액티비티가 onDestroy() 될 때 context는 사라지게 됩니다.
   사용 - getBaseContext() , ActivityName.this -> 코틀린에서는 baseActivity, this@ActivityName

 

 위에서 설명했듯이, ActivityContext는 액티비티의 생명주기를 따른다.

그래서 액티비티가 destroy 되더라도 남아있어야 하는 기능을 구현할 시에는 ActivityContext를 사용하면 NullPointerException을 발생시킬 여지가 있다.

 

 따라서 웬만한 기능구현에는 나도 모르게 ApplicationContext를 사용하고 있었던 것이다.

하지만 ActivitiyContext도 사용해야하는 상황이 있다.

 ApplicationContext는 GUI관련 작업은 처리할 수 없다. (Toast 제외)

따라서, 액티비티상의 UI를 제어해야 할 부분이 있다면 ActivityContext (this@ActivityName)을 사용하는것이 올바르다.

 

 실제로 개발 구현시에도 Dialog 관련 작업시에 applicationContext를 사용했다가 앱이 죽는 현상을 많이 경험하였는데, 정확한 이유는 모르고 ActivityContext로 작업했었는데 이번 정리를 통해서 깨닫게 되었다.

ApplicationContext는 앱 전체의 생명주기 및 시스템과 관련되어 있기 때문에 Dialog와 같은 액티비티에 종속되는 UI, 뷰는 해당 액티비티의 ActivityContext를 사용해야 한다!!

 

반응형
Comments