[android] Context 는 왜 쓰지

sundays·2023년 2월 22일
0

android

목록 보기
14/18


안드로이드 에서 Context 는 용도에 따라서 선택해서 사용하는데 actvity에서 사용할때는 activtiycontext()를 사용하고 그외에선 applicationContext()를 사용하는 방법으로 사용하고 있었습니다. 그리고 compose에서는 componentActivty()를 사용하는데 여기서는 또 다른 사용방식을 사용하고 있습니다. 그래서 어떤식으로 사용되고 있는지 궁금했습니다. 사실 이 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.
 */
public abstract class Context {

애플리케이션 환경의 전역 정보에 대한 인터페이스. 안드로이드 시스템에서 구현을 제공하는 추상 클래스이다. 이를 통해 애플리케이션 특화 리소스 및 클래스에 대한 액세스할 수 있을 뿐만 아니라 액티비티 시작, 브로드캐스팅 및 인텐트 수신과 같은 애플리케이션 수준 작업에 대한 호출을 허용한다.

해당 내용은 추상클래스에서 제공하는 설명으로써 context 추상클래스 내에서는 사용자에서 implements해서 사용할 수 있는 추상 함수들이 선언되어 있습니다.

Context를 사용하는 이유

  1. 자신이 어떤 어플리케이션을 나타내고 있는지 알려주는 ID 역할
  2. ActivityManagerService 에 접근할 수 있도록 하는 통로 역할

결론부터는 전역 애플리케이션 정보(ID) 에 접근하거나 연관된 시스템 기능을 수행하기 위해 필요합니다.

안드로이드가 아닌 다른 OS 애플리케이션에서는 시스템 함수와 같은 프로세스의 정보를 아무런 매개체가 없이 가져올 수 있지만, 안드로이드에서는 context에 정의된 인스턴스 함수를 호출해야 애플리케이션 정보나 시스템 기능에 접근 및 사용할 수 있습니다.

안드로이드에서 OS와 어플리케이션의 관계는 독립적으로 존재하고 있어서 메모리가 부족하면 작동중이던 프로세스가 강제 종료되면서 작동중이던 애플리케이션의 일부 정보만 별도로 관리하며 메모리 공간의 확보되면 저장된 애플리케이션 정보를 바탕으로 프로세스를 시작하기도 합니다.

ActivityManagerService

안드로이드 시스템 서비스 중 ActivityManagerService 에서 애플리케이션 프로세스가 별도로 관리 되고 있습니다. 이것을 접근하기 위해 context가 사용됩니다.
내부 구조에 대해서는 이 블로그에서 설명해주고 있는데 삭제 될까봐 따로 옮길까 생각 중입니다

Context의 생성

Activity, Service, BroadcastReceiver 들이 모두 동일한 Context를 가지고 있지는 않는데 컴포넌트들이 생성될때마다 어디서에서(Activity, Service, BroadcastReceiver) 어떤 시스템 API를 호출하느냐에 따라 서로 다른 결과가 나타나고 있습니다. 동일한 형태의 context.startActivity() 이지만 Service에서 실행할때와 Activity에서 실행했을때 다른 Context 인스턴스를 가지고 있으므로
만약 Context가 같은 인스턴스를 공유하고 있다면 서로 다른 결과를 나타내도록 구현되지 않을 것입니다.

ApplicationContext 와ActivityContext

Activity Context

  • Activity LifeCycle에 귀속
  • getContext() 로 접근
  • Activity 범위 내에서 Context를 전달
  • GUI 작업에 사용

Application Context

  • Application LifeCycle
  • Singleton Instance
  • getApplicationContext()
  • context가 가장 오래 유지됨

사용 예시

메모리 참조를 오래해야 하는 DB Connect Context 에서 RoomDatabase 를 사용하는 경우에는 어떤 Context를 사용해야 할까요. 저의 실제 코드를 예로들면 이렇습니다.

@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {

	@Singleton
    @Provides
    fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
        return AppDatabase.getInstance(context)
    }

해당 참조를 사용할때는 @ApplicationContext 를 사용해야 합니다. hilt annotation 사용하여 의존성 참조를 해주어 사용하고 있습니다.

Reference

profile
develop life

0개의 댓글