Android Basic

Android Context란?

hik14 2024. 9. 22. 21:46

많은 안드로이드 개발자들은 처음에 안드로이드 개발을 시작하면서 Context 객체를 사용하게 되며 경험을 통해 알게됩니다.

하지만, 대부분 두루뭉실하게 그 개념을 알고 있습니다. 그렇기 때문에 이번에 확실히 Context에 대한 개념을 잡고자 한다. 

정의

https://developer.android.com/reference/android/content/Context

 

애플리케이션 환경에 대한 글로벌 정보에 대한 인터페이스입니다. Android 시스템에서 구현을 제공하는 추상 클래스입니다.

애플리케이션 특정 resources and classes에 대한 접근은 물론, launching activities, broadcasting, receiving intents 등과 같은 애플리케이션 수준 작업에 대한 up-calls을 허용합니다.

 

App과 Android System과 다리 역활을 한다.

 

AMS(Android Manager Service) 

- Activity 및 기타 구성 요소의 실행 상태를 관리하기 위해 Android에서 제공하는 시스템 프로세스

- AMS는 앱 권한과 앱에 필요한 다양한 유형의 컨텍스트를 고려하여, 컨텍스트로 변환된 내용을 제공합니다.

- 컨텍스트가 있는 일반 클래스는 구성 요소(Activity, Service, Broadcast Receiver, Contents Provider)라고 할 수 있습니다.

- 컨텍스트는 애플리케이션에 따라 필요한 권한 액세스 수준을 통해 시스템과 리소스에 대한 다리 역할을 합니다.

 

- System Process provided by Android to manage the runnig status of Activity and other components

- AMS provides what is translated into Context, taking into consideration the app permissions and the different type of contexts that our app needs

- Regular class with context can be called a components

- Context is Our Bridge into the System and Resources, with the permission access level that we must have depending on our application

 

왜 여러개의 Context가 존재할까?

Context, Application Context, Activity Context ...

 

 

최상위에 추상 클래스인 Context가 있습니다.

그 다음 추상 클래스인 Context를 구현한 ContextImpl이 있고 ContextImpl을 구성요소로 가지고 있는 ContextWrapper있습니다.

그리고 ContextWrapper를 직접 상속하는 Application, Service, 화면에 적용할 테마를 위해 ContextThemeWrapper가 있습니다.

안드로이드 컴포넌트중에 유일하게 사용자 UI를 가질수 있는 Activity는 ContextThemeWrapper를 상속합니다.

 

여기까지 살펴본 결과 가장 중요한 차이점은 Theme를 노출을 하는지 안하는지 여부입니다.

 

 

Context들의 차이점은 중요하고, 잘못하면 문제를 일으킬 수 있습니다.

 

예를 들면, Application의 Context 대신에 Activity의 Context를 App 전체 수명주기를 가지는 객체에 전달을 하게 된다면 문제가 생길수 있습니다.

 

장점

"Being an Context" as an Activity allow you to pass "this" in interfaces that need Context
Decorator pattern protects ContextWrapper when Contextlmpl needs to change
same context between different scenarios, allows a more consistent interface with the system

 

"컨텍스트가될 수 있는것을 (Activity처럼) 사용하면 컨텍스트가 필요한 인터페이스에서 "this"을 전달할 수 있습니다.
Decorator 패턴은 Contextlmpl이 변경해야 할 때 ContextWrapper를 보호합니다.
다른 시나리오 간에 동일한 컨텍스트를 사용하면, 시스템과 더 일관된 인터페이스를 사용할 수 있습니다.


단점

다른 컨텍스트 = 다른 범위 different contexts = different scopes
메모리 누수를 일으킬 수 있음 can cause memory leaks 
상속보다 구성, 컨텍스트가 상속을 남용함 composition over inheritance, Context is abusing inheritance
리스코프 대체 원칙 위반 Liskov Substitution Principle violation
단일 책임 원칙 위반 Single Responsibility Principle violation

Application Context

global context

패키지 정보 및 리소스에 접근 가능하다

context.getApplicationContext( )

acitvity.getApplication( )

Activity Context

테마에 대한 정보를 가진 Context

Activity안에서 this를 가지고 접근 가능하다.

Activity LifeCycle에 종속된다. 즉 Activity가 파괴되면, 사라지기 때문에 Activity 보다 생명주기가 긴 Viewmodel에 Context를 넘기면 안된다.

Activity에 종속된 Fragment는 동일한 Context를 공유합니다.

 

*View Context도 Activity Context를 전달받은 것이다.

 

Service Context

ContextWrapper를 상속합니다.

Activity와 다르게 UI가 없기에 Theme에 대한 정보가 필요하지 않습니다.

 

Base Context

 

Contextwrapper의 기본 객체
실제로는 Contextlmpl이며 Context 인터페이스의 실제 구현자입니다.