목차
- Context 정의
- Context Tree
- Activity Context, Application Context
- Activity Context
- Application Context
- Context 사용
- Context 사용과 메모리 누수
- 1. static 변수에 ActivityContext 사용
- 2. singleton 객체에서 ActivityContext 참조
Context 정의
애플리케이션 환경에 대한 전반적인 정보를 담고 있는 인터페이스이다. 여기서 전반적인 정보란, 애플리케이션의 리소스 파일 혹은 View에 대한 정보 등을 포함한다. Context에 쓰임은 주로 activityContext, applicationContext와 같이 사용된다.
Context Tree
Context는 abstract class이기 때문에 독자적으로 사용될 수 없고 ContextWrapper라는 구현체를 통해서 구현된다. ContextWrapper는 사용자들에게 노출되지 않는다. Application, Activity, Service는 Context라는 추상 클래스를 상속받은 구현체들이다. 앱 내에는 여러 개의 ActivityContext, ServiceContext가 존재할 수 있지만, ApplicationContext는 단 하나만 가지게 된다. 그 이유는 하나의 앱 안에서 Application class를 상속받는 클래스 객체가 단 하나이며, Activity, Service class를 상속받는 클래스 객체는 여러 개일 수 있기 때문이다.
ActivityContext, ApplicationContext
ActivityContext
ActivityContext는 Activity와 같은 생명주기를 가진다. Activity는 Context의 구현체이기 때문에 this로도 ActivityContext에 접근이 가능하다. 또한, Activity 안에 선언되어 있는 View도 Context에 접근할 수 있는데, 이때 접근하는 Context는 ActivityContext이다. ActivityContext는 보통 Intent 객체의 인자로 startActivity()에 사용하거나, layout을 inflate 할 때 사용된다. ActivityContext는 주로 Activity 생명주기와 관련 있는 View 관련된 작업에 Context가 필요할 때 사용한다. (예: Show a Dialog 등)
ApplicationContext
ApplicationContext는 Singleton으로 단 하나의 객체를 가지고 있으며 Application과 같은 생명주기를 가진다. ApplicationContext는 백그라운드 작업 혹은 데이터 엑세스와 같이 Activity 생명주기에 국한되지 않고 유지되어야 하는 작업을 할 때 사용한다. ApplicationContext를 View 관련된 작업에 사용할 수 없다. 이 외에 대부분은 ActivityContext와 공통된다. 둘 다 Context를 구현했기 때문이다.
Context 사용
Context는 일반적으로 View(Toast, Snackbar, Adapter 등), Activity 실행 Intent, 시스템 서비스(SharedPreference, ContentProvider 등)에서 사용된다.
- Application Resources : res, assets 등 애플리케이션 리소스 파일 접근
- Activity Communications : Intent를 활용한 Activity 실행 및 통신
- System Service : SharedPrefernce, ContentProvider 접근
- Application Informations : ApplicationInfo
Context 사용과 메모리 누수
더 이상 필요하지 않은 리소스가 메모리에서 해제되지 않고 계속 남아 있는 것을 메모리 누수라고 한다. 최악의 경우 애플리케이션에 할당된 메모리가 초과되어 앱이 종료되는 이슈가 발생하게 된다. 이러한 메모리 누수는 Context 사용 중 발생할 수 있는데, 특히, ActivityContext를 생명주기와 맞지 않게 잘 못 사용할 경우 발생할 수 있다.
1. static 변수에 ActivityContext 사용
만약 View를 static 변수로 두고 이 View 변수가 Activity의 Context를 참조하고 있다고 가정한다면, static 변수에서 ActivityContext를 참조하고 있기 때문에 해당 ActivityContext의 Activity에서 onDestroy()가 호출되어도 Activity가 메모리에서 해제가 되지 않는다. 정말 필요한 경우라면, 이러한 상황에서는 ApplicationContext를 사용해야 한다.
2. singleton 객체에서 ActivityContext 참조
1번 static 변수와 동일한 이유로 메모리 누수가 발생한다.
참고자료 :
https://shinjekim.github.io/android/2019/11/01/Android-context%EB%9E%80/
https://bearhunter49.tistory.com/8
https://sodocumentation.net/android/topic/2687/memory-leaks
'Mobile > Android(Kotlin)' 카테고리의 다른 글
[Android] Shared Preferences. 앱 내 간단한 데이터 저장에 사용. (0) | 2023.05.19 |
---|---|
[Android] Dive into concept of Configuration. (App Lifecycle, 화면 전환 등) (0) | 2023.04.23 |
[Android] Support different screen size. (큰 화면, 작은 화면 사이즈 대응) (0) | 2023.02.28 |
[Android] Concept of DI Hilt. Dive into Hilt Components. (0) | 2022.11.22 |
[Android] Dive inti concept of Hilt Annotations. @_@ (0) | 2022.11.20 |