Study/Android

Android의 Context

hegunhee 2022. 4. 4. 10:30

Application, Setvice, Activity 모두 Context를 상속하고 있습니다.

공식 문서에 나와있는 Context의 설명을 확인해보면

애플리케이션 환경에 대한 전역 정보가 Context로 연결됩니다.

Context는 구현이 Android 시스템에 의해 제공되는 추상 클래스입니다.

애플리케이션 별로 리소스 및 클래스에 대한 접근은 물론 Activity의 실행, 브로드캐스팅 및 Intent 수신과 같은

애플리케이션 레벨에 대한 호출을 허용합니다.

 

쉽게 설명해보자면 Context를 이용하면 getResource(), startActivity(), startSetvice(), getSystemService()와 같이 시스템 레벨의 정보를 얻을 수 있는 메소드를 사용할 수 있습니다.

또한 Context는 시스템에 대한 리소스를 확인, 데이터베이스 및 환경 설정에 대한 액세스 확보 등과 같은 서비스를 제공합니다.

Activity 객체는 Context객체를 상속받습니다. 즉 Activity는 애플리케이션의 특정 자원, 클래스, 애플리케이션의 환경정보에 대해 접근할 수 있습니다.

 

Context는 Android 개발에 있어서 많은 곳에서 이용되며 가장 중요한 부분이므로 올바르게 사용하려면 반드시 꼭 이해해야합니다.

왜냐하면 잘못 사용하면 메모리 누수로 이어질 수 있기 때문입니다.

안드로이드에는 많은 다른 유형의 Context가 있으므로, 그것들이 무엇인지, 그것들을 사용하는 방법 그리고 언제 어떤 것을 사용하는지를 알아봅시다.

Application Context


Application Context는 애플리케이션과 관련이 있고 애플리케이션이 살아있는 동안 변경되지 않습니다.

그러므로 싱글톤이며 getApplicationContext()를 통해 activity에서 접근할 수 있는 인스턴스입니다.

이 Context는 애플리케이션의 생명주기와 관련이 있기 때문에 현재 Context와 분리된 어떤 Context가 필요하거나,

현재 Activity Scope를 벗어난 작업을 할 때 필요합니다

어떤 싱글톤 객체를 만들어야 하고 해당 객체가 항상 Context가 필요한 경우에 Application Context를 전달하면 됩니다.

ex) Room DataBase

Application Context에 Activity를 참조하게 되면 Activity가 부서지더라도 참조가 유지됩니다.

그러므로 Activity가 GC(가비지 콜렉팅)되지 않으므로 메모리 누수가 발생합니다.

다른 Context보다 가장 오래 보존될만한 Context가 필요할 때만 getApplicationContext()를 사용합시다.

Activity Context


Activity Context는 액티비티와 관련이 있고, 액티비티가 부서지면 컨텍스트도 같이 부서집니다.

하나의 애플리케이션에서 여러 액티비티가 존재할 수 있는데 특정 Activity Context를 다룰일이 생깁니다.

예를 들어 새로운 액티비티를 실행한다면, Activity Context가 필요합니다. 새로 띄워진 액티비티는

이전 액티비티와 연관된 채로 액티비티 스택에 보관됩니다.

Context 얻기 (Java가 아닌 Kotlin)


View.context()

현재 뷰가 가지고 있는 Context를 반환하는데,

일반적으로는 Activity에서 View를 띄우기 때문에 Activity의 Context가됩니다.

Activity.applicationContext()

애플리케이션 전체의 컨텍스트를 반환합니다. 현재 액티비티뿐만 아니라 애플리케이션의 생명주기와 관련된

컨텍스트가 필요할 경우 Activity Context대신 이 값을 사용하면 됩니다.

Context를 잘못 사용하는 경우


 

Application Context는 Activity가 하는 모든 것을 지원하는 만능 Context가 아닙니다.

위에도 말했다시피 Application Context에 Activity를 참조하게 되면 Activity가 부서지더라도 참조가 유지되므로 Activity가 GC 되지 않으므로 메모리 누수가 발생합니다. 혹은 다른 객체에서 Context를 사용하게 되면 가비지 콜렉터가 회수하지 못해 메모리 누수가 발생합니다.

Application Context로는 대부분 GUI 작업은 할 수 없습니다. Activity만 가능합니다.

그러나 Toast는 Application Context를 사용해도 아무 문제가 없이 잘 사용됩니다. Toast의 경우 특정 액티비티에 연관된 윈도우에 속하지 않고 자신만의 윈도우를 생성하기 때문입니다.

또한 어떠한 Context를 Scope가 더 큰 Context나 어떤 무언가가 참조하고 있으면 GC 되지 않고 많은 메모리를 잃게 되므로 조심하지 않으면 메모리 누수가 쉽게 발생할 수 있습니다.

'Study > Android' 카테고리의 다른 글

compileSdk vs targetSdk  (0) 2024.02.21
BindingAdapter 적용  (0) 2022.04.13
안드로이드 데이터 바인딩  (0) 2022.01.17
콘텐츠 프로바이더  (0) 2022.01.04
바인딩 서비스  (0) 2021.12.29