Today's special moments become memories of tomorrow.

Android

[Android] Context 란?

lotus lee 2021. 4. 8. 00:00

안드로이드 개발을 하다보면 context를 접하게 된다. getApplicationContext(), getContext() 혹은 this 키워드를 통해서 메서드의 인자 혹은 클래스 생성자로 context를 넣어줘야 하는 경우를 자주 경험했을 것이다.

 

그렇다면 Context란 정확히 무엇일까?

 

Context 등장 배경

일반적인 OS와는 달리, 안드로이드는 어플리케이션과 프로세스가 독립적이다. 독립적이기 때문에 프로세스가 종료되어도 어플리케이션은 실행 상태일 수 있다. 예를 들어, 서비스(Service)나 브로드캐스트 수신자(Broadcast Receiver)의 경우, 어플리케이션의 실행 여부에 관계 없이 백그라운드에서 작업을 할 수 있는 것은 이 때문이다.

 

이러한 안드로이드의 특징 때문에 프로세스와 어플리케이션은 따로 관리된다. 

프로세스의 경우 운영체제가 관리를 하지만, 어플리케이션은 ActivityManagerSerivce라는 객체가 관리한다.

즉, ActivityManagerService는 여러 어플리케이션들의 정보를 관리하는 역할을 한다.

 

그래서 어플리케이션 정보에 접근하고 싶다면 ActivityManagerService를 통해서 접근이 가능하다. 

ActivityManagerService는 많은 애플리케이션 정보를 key-value를 통해 구분하여 관리하는데, 

여기서 등장하는 것이 Context이다.

 

Context 역할

1. ActivityManagerService에 접근하기 위한 중간다리 역할이다.

   어플리케이션과 ActivityManagerService는 직접 소통을 하지 않고 Context를 통해 간접적으로 

   소통한다.

 

2. 각 애플리케이션을 대표하는 ID 역할을 한다. 

   위에서 ActivityManagerService는 key-value값을 통해 어플리케이션을 구분한다고 했다.

   따라서 Context는 자신의 어플리케이션의 key-value값을 가지고 ActivityManagerService에 접근한다.

   이를 통해 Context는 ActivityManagerService로부터 어플리케이션에 관한 전역 정보를 가지고

   올 수 있다.

 

3. 시스템 API에서 제공하는 메서드를 어플리케이션이 사용할 수 있도록 한다.

 

 

Application과 Context의 관계

어플리케이션에 있어서 Context의 역할에 대해 알아보았다.

그렇다면 어플리케이션은 Context의 기능을 어떻게 이용할까?

 

Context 클래스는 추상 클래스로 되어있고, 애플리케이션(Application), 액티비티(Activity), 서비스(Service)는 이 Context 추상 클래스를 상속받아서 Context의 기능들을 이용한다.

 

엄밀히 말하면, Context 추상 클래스의 메서드를 직접 구현한 것은 ContextImpl라는 클래스이다. 그리고ContextWrapper라는 클래스는 이 ContextImpl을 내부적으로 이용한다. 사실상 애플리케이션(Application), 액티비티(Activity), 서비스(Service)는 Context 추상 클래스를 상속받는 것이 아니라 ContextWrapper 클래스를 상속받는다.

 

 

그렇다면 위의 설명을 통해 어플리케이션이 Context의 기능을 이용하기 위해서 상속을 받는다는 것은 이해가 됐는데, 액티비티와 서비스는 왜 Context를 상속 받는 것인가?

 

어플리케이션의 Context를 이용해도 되지만, 시스템 API를 각 컴포넌트들에 맞게 구현할 필요가 있다. 액티비티는 액티비티만의 동작 방식이 존재하고, 서비스는 서비스만의 동작 방식이 존재하기 때문이다.

따라서 각각의 컴포넌트들도 각각의 역할에 맞게 API를 사용하도록 Context를 상속받는다.

액티비티와 서비스 컴포넌트는 자기 자신의 Context뿐만 아니라 어플리케이션 Context도 가지고 있다.

 

Context 종류

Context는 애플리케이션 컨텍스트(Application Context)와 베이스 컨텍스트(Base Context)으로 나뉜다.

 

- 어플리케이션 컨텍스트(Application Context) : 애플리케이션과 관련된 기능을 담는 Context이다.

  이 때, Context는 애플리케이션 전체에서 딱 하나만 존재하게 된다. 딱 하나의 Context 객체만이 

  생성되므로 싱글톤 객체이다. 만약 애플리케이션 컨텍스트를 사용하고 싶다면 getApplicationContext()

  메서드를 통해 호출할 수 있다.

 

- 베이스 컨텍스트(Base Context) : 액티비티, 서비스, 브로드캐스트 수신자, 콘텐츠 제공자,

  안드로이드의 4대 컴포넌트의 Context를 의미한다. 이 경우에는 컴포넌트가 생성될 때마다 Context가

  생성된다. 즉, Context가 여러 개 생성될 수 있다. 베이스 컨텍스트는 getContext() 메서드나 this를 통해

  접근이 가능하다.

 

      액티비티(Activity) & 서비스(Service) 

      액티비티와 서비스는 위에서 언급한 대로 ContextWrapper를 상속하여 Context를 이용한다.

  

      브로드캐스트 수신자(Broadcast Receiver)

      액티비티, 서비스와 달리 브로드캐스트 수신자는 Context를 상속하지 않는다.

      브로드캐스트 수신자가 Context를 이용하기 위해서는 onReceive() 메서드를 통해 Context를 가져온다.

 

      콘텐츠 제공자(Content Provider)

      브로드캐스트 수신자처럼 Context를 상속하지 않는다. 

      콘텐츠 제공자는 getContext()를 통해 Context를 가져올 수 있다.

 

 

Context 사용

  - 만약 현재 작업 위치가 액티비티나 서비스와 같은 컴포넌트에 속해 있다면, 컴포넌트의 Context를

    사용한다.

 

  - 만약 현재 작업 위치가 액티비티나 서비스의 밖이라면, 현재 애플리케이션의 Context를 사용한다.

 

 

Context 접근 

1. getApplicationContext() : 어플리케이션의 Context를 얻는다.

 

2. getContext() : 현재 액티비티의 Context를 얻는다. 

 

3. getBaseContext() : 자신의 Context가 아닌 다른 Context에 접근하고자 할 때 사용한다.

 

4. this : 액티비티 인스턴스 자기 자신을 의미한다.

 

 

 

출처

'Android' 카테고리의 다른 글

[안드로이드] dp(dip)란 무엇인가?  (4) 2021.04.12
[Android] 안드로이드 4대 컴포넌트  (0) 2021.04.06
[Android] 안드로이드 생명 주기  (0) 2021.03.08