본문 바로가기

OS/Android

Android Context

반응형

초창기에 안드로이드 개발하다가 Context 때문에 메모리 누수가 생겼던 적이 꽤 있었다.

주로 싱글턴 객체에서 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.

어플리케이션 환경에 대한 정보를 가지고 있고 api를 호출할 수 있는 인터페이스라고 한다.

즉 Context.resources.getString()과 같이 어플리케이션의 자원들을 가져다 쓸 수 있으며 context.startActivity()와 같이 API를 호출할 수 있게 하는 것이 Context라고 설명하고 있다.

조금 더 복잡하게 들어가면 어플리케이션 정보들을 프로세스에서 직접 가지고 있는게 아니라 ActivityManagerService에서 관리하도록 설계 되었기 때문에 정확히는 ActivityManagerService에 접근할 수 있도록 만들어주는 통로 역할을 한다고 볼 수 있다.

또한 ActivityManagerService는 Key-Value로 이루어진 배열을 이용해 현재 작동중인 어플리케이션 정보를 관리하므로 Context로 자신의 어플리케이션을 찾을 수 있게 해준다. 

 

Context의 종류

Context는 크게 ApplicationContext, Activity Context로 나눌 수 있다.

위에서 메모리릭이 발생한 이유가 바로 Context의 생명주기를 몰랐기 때문이다.

ApplicationContext는 어플리케이션 생명 주기와 함께 하도록 설계 되어 있는 Context이다.

따라서 싱글톤이나 비동기 객체를 생성할 때 ApplicationContext를 사용하는 것이 훨씬 바람직하다.

싱글톤 객체나 비동기 객체에서 A의 Activity Context를 참조 후 A가 종료된다면 GC가 제대로 이루어지지 않아 바로 메모리릭으로 이어질 수 있기 때문이다.

반응형

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

Android 유닛 테스트  (0) 2021.04.06
Android Intent  (0) 2021.03.26
Android decompile  (0) 2021.03.10
Android ABI  (0) 2021.03.03
안드로이드 인앱 결제 테스트  (0) 2021.02.24