Android의 Context

woga·2021년 7월 1일
0

Android 공부

목록 보기
4/49

Android에는 Context가 5가지가 있다.

  • getApplication
  • getApplicationContext
  • getBaseContext
  • getContext
  • this

먼저, 안드로이드 프레임워크에서 Context는 2종류로 나뉜다.

  • Application Context

  • Activity Context

Application Context는 애플리케이션 자체의 생명주기에 영향을 받는다. 따라서 항상 애플리케이션의 생명 주기와 함께 한다.

반면, Activity Context는 액티비티 생명주기와 함께 작동해, onDestroy() 할 때 사라진다. 그래서 사용자가 생명주기 활동이 있는 객체를 생성하거나, 토스트, 다이알로그 등 UI 관련 작업을 할 때 수행될때마다 쓰인다.
액티비티에 대한 환경 정보들이 Context에 있고, 이 Activity Context에 Intent를 통해 다른 액티비티를 띄우면 Activity Stack이 쌓이게 되는 것이다.

어쨌거나 저쨌거나, Activity, Aplication class 모두 Context 클래스를 상속받아 만들어졌다는 것이다.

1. getApplication

애플리케이션 객체를 참조하고 있지만 애플리케이션 클래스 역시 Context class를 상속받고 있다. 그래서 이것 역시 application context를 제공한다.


2. getApplicationContext

Activity.getApplicationContext로 application context를 제공한다.
현재 Activity 뿐만 아니라 application의 생명주기와 관련된 context가 필요한 경우 이 메서드를 사용한다. (Acitivy Context 대신)

Application 생명 주기와 연결되어 있어서
1) 싱글톤 객체를 생성해야 하는 경우 2) Activity에서 라이브러리가 필요할 경우에 쓰일 수 있다.

내부에서 실행되는 모든 Activity를 보유하는 Application에 연결된 Context를 반환하는데 사용된다.

메서드나 생성자를 호출할 때 종종 Context를 전달해야 하며 this를 사용하여 Activity Context를 전달하거나 getApplicationContext()를 사용하여 앱 컨텍스트를 전달하기도 한다.

일반적으로 이 함수는 Application 레벨에 사용되며 모든 Activity를 참조하는데 사용할 수 있다.
만약, Android 앱 전체에서 변수에 접근하려면 해당 함수를 통해 변수를 사용해야한다.


3. getBaseContext

이 base context는 생성자 혹은 setBaseContext()로 설정한다. 대신, ContextWrapper.getBaseContext로 activity context를 제공하기 때문에 ContextWrapper가 있는 경우에만 가능하다.

다른 컨텍스트 내에서 컨텍스트에 액세스해야 하는 경우 ContextWrapper를 사용한다. 그래서 이를 사용하면 원래 Context를 변경하지 않고 동작을 수정할 수 있는 이점이 있다.

| Context Wrapper? 모든 호출을 다른 Context에 단순히 위임하는 Context의 프록시 구현, 원래 Context를 변경하지 않고 동작을 수정하기 위해 서브 클래싱할 수 있다.


4. getContext

View.getContext로 현재 실행중인 View의 Context를 반환한다. 일반적으로 실행되고 있는 액티비티 Context가 반환된다.


5. this

Context의 유형이다.
Activity class를 상속받는 본인 클래스를 말하고 있지만 Activity class 역시 Context를 상속 받고 있다. 그래서 Activity Context를 제공한다.


그럼 Android에서 Context는 무엇인가?

애플리케이션 환경에 대한 전역 정보에 접근할 수 있는 연결 장치이자 Android 시스템에서 implements를 제공하는 추상 클래스이다.
애플리케이션 별 리소스 및 클래스에 대한 접근은 물론 앱 운영 레벨과 같은 Activity, Broadcasting, intents 등에도 접근할 수 있게 한다.

출처 : Android Developer:: Context

Example Context in Reality

어떤 사람이 호텔에 방문한다고 가정해보자. 이 사람은 삼시세끼를 챙겨먹어야한다. 이 외에도 호텔에 머물면서 하고 싶은 일이 많다. 그럼 어떻게 해야할까?
바로 룸 서비스 직원에게 먹을거를 가져와 달라고 요청하는 것이다. 그러면 하려고 했던 일들을 수행하면서 밥을 챙겨먹을 수 있다.
여기서 룸 서비스 직원이 Context고 호텔에 방문한 어떤 사람이 single activity가 되는 것이다.
그리고 hotel은 애플리케이션(응용프로그램)이고, 아침 점심 저녁은 resources가 된다.

When Does This Work?

  1. 애플리케이션의 현재/활성 상태의 Context
    • 일반적으로는 앱에서 여러 화면이 있다. 따라서 사용자가 무언가를 검색할 때 context는 검색 화면이 된다.

  2. Activity 및 Application에 대한 정보를 얻을 때 사용
    • 문의 화면 속 Context는 사용자가 문의 Activity에 있음을 특정하고 사용자가 앱과 관련된 질문을 제출할 수 있다.

  3. 리소스, 데이터베이스 및 공유 기본 설정 등에 대한 액세스 권한을 얻을 때 사용
    • Android 앱에서 API 호출을 할 수 있다. Rest Services는 일반적으로 데이터베이스 데이터를 보유하고 Android 앱에 JSON 형식의 출력을 제공한다. 각 화면의 Context는 데이터베이스 데이터와 화면 전체의 공유 데이터를 파악하는 데 도움이 된다.

  4. Activity 및 Application 클래스는 모두 Context 클래스를 상속
    • Android에서 Context는 가장 중요한 개념이며 잘못 사용하면 메모리 누수가 발생한다. Activity 개별 화면을 참조하고 Application은 전체 앱을 참조해서 둘 다 Context Class를 상소받는다.

Reference

difference-and-when-to-use-getapplication-getapplicationcontext-getbasecon

https://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and

What is Context?

profile
와니와니와니와니 당근당근

0개의 댓글