본문 바로가기
안드로이드 공부 노트

[Android] Context란?

by 지게요 2022. 1. 29.
728x90
반응형

개발을 하다가 자주 접하는 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.

[번역]
응용 프로그램 환경에 대한 전역 정보에 대한 인터페이스입니다. 이것은 안드로이드 시스템에 의해 구현이 제공되는 추상 클래스입니다. 애플리케이션별 리소스 및 클래스뿐만 아니라 시작 활동, 브로드캐스팅 및 수신 등과 같은 애플리케이션 수준 운영을 위한 업콜에 액세스 할 수 있습니다.

공식문서에서 봐도 이해가 잘 되지 않아 구글링을 해 context의 특징을 정리해봤다.

 

# Context의 특징

1. 어플리케이션의 현재 상태를 나타낸다.

2. Activity와 Application의 정보를 얻기 위해 사용한다.

3. Resource, DB, SharedPreference 등에 접근하기 위해 사용한다.

4. Activity와 Application Class는 Context Class를 확장한다.

5. 잘못된 Context의 사용은 메모리 누수를 일으킨다.

 

# Context의 종류

- Application Context

- Activity Context

 

# Application Context

Application Context는 애플리케이션 그 자체이며, 현재 애플리케이션의 상태를 표현하고 있다.

애플리케이션 라이프사이클에 묶여있다.

Activity 범위보다 큰 Context를 전달할 때 사용하는 Context이다.

Application Context는 싱글턴 인스턴스이며, 액티비티에서 getApplicationContext()를 통해 접근할 수 있다.

 

예를 들어, 애플리케이션에 싱글턴 오브젝트를 생성하고, 해당 오브젝트가 컨택스트가 필요하다면 항상 애플리케이션 컨택스트를 전달해야 한다. 만약 액티비티 컨택스트를 전달한다면, 해당 오브젝트가 액티비티를 항상 참조하므로, 액티비티가 화면에 표시되지 않는 순간에도 가비지 컬렉션이 진행되지 않아 메모리 누수가 발생한다.

애플리케이션 전체에서 사용할 라이브러리를 특정 액티비티에서 초기화한다면 어떤 Context를 전달해야 할까? 당연히 Application Context이다. getApplicationContext()는 딱 위와 같은 경우에만 사용하여야 한다.

 

# Activity Context

Activity Context는 Activity 내에서만 유효한 Context이다.

     -  A라는 Activity의 Context를 B에서 사용 할 수 없다는 의미이다.

액티비티 라이프사이클에 묶여있다.

    -  Activity에서 onDestroy()가 호출되면 Activity Context도 함께 소멸된다.

액티비티 컨택스트는 액티비티와 함께 소멸해야 하는 경우에 사용한다.

Activity Context는 getBaseContext()로 접근할 수 있다.

 

예를 들어, 액티비티와 라이프사이클이 같은 오브젝트를 생성해야 할 때  Activity Context를 사용할 수 있다.

출처 : https://charlezz.medium.com/

 

위의 그림은 어플리케이션의 계층 구조이다. 위의 계층 구조에서 Application Context는 MyApplication나 Activity Context나 모두 다 같은 Context이지만 Scope가 상이한 것을 볼 수 있다. 

Application Context는 MyApplication, Activity 모두 사용이 가능하다. (단 Activity에서 사용하는 일은 주의해야 한다.)

또한 MainActivity의 Context는 MainActivity에서만 사용 가능하고 SubActivity도 마찬가지이다.

 

# 결론

항상 가능한 한 가까운 컨택스트를 사용하도록 한다. 액티비티에 있다면, 액티비티 컨택스트를, 애플리케이션에 있다면, 애플리케이션 컨택스트를 사용한다. 싱글턴의 경우에는 애플리케이션 컨택스트를 사용한다.

 

참고 사이트
https://developer.android.com/reference/android/content/Context
https://roomedia.tistory.com/entry/Android-Context%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
https://jslee-tech.tistory.com/19

 

반응형