Mobile/Android(Kotlin)

[Android] Dive into concept of Android Context. (Application Context and Context)

개발왕 금골드 2023. 4. 17. 21:48
반응형

목차

  • Context 정의
  • Context Tree
  • Activity Context, Application Context
    • Activity Context
    • Application Context
  • Context 사용
  • Context 사용과 메모리 누수
    • 1. static 변수에 ActivityContext 사용
    • 2. singleton 객체에서 ActivityContext 참조

 

Context 정의

구글이 작성한 Context

 애플리케이션 환경에 대한 전반적인 정보를 담고 있는 인터페이스이다. 여기서 전반적인 정보란, 애플리케이션의 리소스 파일 혹은 View에 대한 정보 등을 포함한다. Context에 쓰임은 주로 activityContext, applicationContext와 같이 사용된다.
 

Context Tree

Context의 상속 트리

 Context는 abstract class이기 때문에 독자적으로 사용될 수 없고 ContextWrapper라는 구현체를 통해서 구현된다. ContextWrapper는 사용자들에게 노출되지 않는다. Application, Activity, Service는 Context라는 추상 클래스를 상속받은 구현체들이다. 앱 내에는 여러 개의 ActivityContext, ServiceContext가 존재할 수 있지만, ApplicationContext는 단 하나만 가지게 된다. 그 이유는 하나의 앱 안에서 Application class를 상속받는 클래스 객체가 단 하나이며, Activity, Service class를 상속받는 클래스 객체는 여러 개일 수 있기 때문이다.
 

ActivityContext, ApplicationContext

Application Context는 Singleton으로 Activity 안에서 getApplicationContext()를 통해 접근이 가능하다.

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/

 

[Android] 안드로이드 Context란? · Challengist

[Android] 안드로이드 Context란? 01 Nov 2019 | Android 이 글은 MindOrks의 Understanding Context In Android Application을 (나름대로) 번역한 글입니다. 잘못된 부분이 있으면 언제든지 알려주세요. 안드로이드에서 컨

shinjekim.github.io

https://bearhunter49.tistory.com/8

 

Android about Context (안드로이드 Context에 대하여)

이번에는 안드로이드 프로그래밍 중에 많이 접하게 되는 Context에 관하여 알아봅시다. 일단 사전적 의미는 '문맥, 맥락'입니다. 음... 뭔가 감이 안옵니다. 위에 구글이 정의 해 놓은 설명의 첫 줄

bearhunter49.tistory.com

https://velog.io/@hanna2100/%EB%B2%88%EC%97%AD-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%9D%98-Context%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%88%84%EC%88%98

 

[번역] 안드로이드의 Context와 메모리누수

Context and memory leaks in Android written by Juan Rinconada 의 블로그를 번역한 글 입니다.안드로이드 개발자라면 Context가 무엇인가라는 질문에 부딪히게 된다. Toasts, Adapters, Intents, Inf

velog.io

https://sodocumentation.net/android/topic/2687/memory-leaks

 

Android Tutorial - Memory Leaks

Learn Android - Memory Leaks

sodocumentation.net

 

반응형