Android/Concept

[Android] [Kotlin] Context

Design-loving front-end engineer 2021. 11. 5. 11:01

Context란?

  애플리케이션 환경에 대한 전체 정보를 받을 수 있는 추상 클래스

  애플리케이션과 관련된 정보에 접근하거나 애플리케이션과 연관된 시스템 레벨의 함수를 호출할 때 필요

  애플리케이션의 현재 상태

 

Context의 구조

  Context는 추상 클래스이므로 이를 사용하기 위해서는 구현 클래스가 필요하다.

  기본적인 구현 클래스는 ContextImpl이지만, 이는 사용자에게 노출하지 않고 ContextWrapper로 감싸져 있다.

 

Context의 종류

Application Context

  싱글톤 객체로 애플리케이션 전체의 생명 주기와 연결되어 있어 앱 시작부터 앱 종료까지 살아 있다.

  현재 Context와 분리된 Context가 필요한 경우에 사용한다.

applicationContext
application

  Application도 Context의 자식이므로 Context처럼 사용할 수 있다.

Activity Context

  액티비티 자체가 Context의 자식이기 때문에 액티비티 인스턴스 자체가 Context 역할을 한다.

  액티비티의 생명 주기를 따르며, 액티비티 소멸 시 같이 소멸된다.

 

안드로이드 4대 Component의 Context

Activity

Service

  생성될 때마다 각자 자신의 Context가 인스턴스가 생성된다.

Broadcast Receiver

  자기 자신의 Context를 갖지 않는다.

  브로드캐스트 처리를 할 때마다 Context를 onReceive()의 인자로 전달 받아서 사용한다.

  전달 받은 Context의 생명주기를 따르기 때문에 액티비티 Context로 브로드캐스트 실행 시, 액티비티가 종료되면 브로드캐스트도 함께 종료된다.

Content Provider

  자기 자신의 Context를 갖지 않는다.

  동일한 응용 프로그램에 대해 호출 시 동일한 싱글톤 Context 객체를 반환하고, 서로 다른 응용 프로그램에 대해 호출 시 다른 Context를 반환한다.

 

Context 참조 방법

this

  Context의 자식인 액티비티를 반환하므로 액티비티를 Context처럼 사용할 수 있다.

  현재 액티비티를 일반 클래스로 넘겨줄 때는 this를 사용하도록 하자.

this@MainActivity

  액티비티 스코프를 벗어난 스코프 안에서는 반환할 Context의 자식을 명시해준다.

 

baseContext

  ContextWrapper의 Context 인스턴스를 반환한다.

  다른 Context를 참조해야 하는 경우, 그 ContextWrapper 안에 있는 context를 baseContext로 가져와 사용한다.

 

view.context

  View가 속해 있는 액티비티의 Context가 해당 View의 Context가 된다.