안녕하세요! Android Context 가 무엇일까요? 😢
https://developer.android.com/reference/android/content/Context
Context 는 애플리케이션 환경에 대한 글로벌 정보를 갖는 인터페이스입니다. Context 는 Android 시스템에서 구현체를 제공하는 추상 클래스로, 애플리케이션 별 리소스 및 클래스 접근에 사용되며, 액티비티 실행, 브로드캐스트, 인탠트 수신 등과 같은 애플리케이션 수준 작업에 사용됩니다.
Application Context
안드로이드 시스템 상, ActivityManagerService 라는 독립된 애플리케이션에서 애플리케이션과 관련된 정보를 관리한다.
이 애플리케이션은 특정 앱에 대한 정보를 key, value 쌍으로 구성하는데, ActivityManagerService 에서 내 앱과 관련된 정보의 value 값을 찾기 위한 key가 Context 이다. 내가 어떤 애플리케이션을 나타내고 있는지 알려주는 ID 역할이다.
싱글톤 인스턴스이며, Activiy 에서는 getApplicationContext() 를 통해 접근할 수 있다. 이 Context 는 애플리케이션 생명주기(라이프사이클)에 종속되어 있기 때문에 현재 Context 가 종료되거나 현재 Context 의 생명주기와 상관없이 필요한 작업, Activiy 스코프를 벗어난 Context 에 필요한 작업에 적합하다.
예를 들어, 애플리케이션에 싱글톤 객체를 생성해야 하는데, 해당 객체가 Context 가 필요하다면 Application Context 를 전달해줘야 한다. 만약 Activiy Context 를 전달한다면 Activity 가 종료된 이후에도(Activity 가 화면에 표시되지 않는 순간에도) Activity 를 항상 참조하므로 GC 의 수거대상이 되지 못하기 때문에(가비지 콜렉션이 진행되지 않아) 메모리 누수의 원인이 될 수 있다.
Application Context 를 사용하는 경우
• ActivityViewModel 클래스를 상속받는 viewModel 안에서 Context 를 사용해야 하는 경우
=> viewModel 의 생명주기가 Activity 보다 길기 때문에 Application Context 사용
• Activity 안에서 라이브러리를 초기화해야 하는 경우
=> Application Context 를 전달하여 사용
• ContentProvider 를 상속한 클래스에서 getContext() 를 통해 불러올 수 있는 Context 는 Application Context 이다.
Activity Context
Activity 내에서만 유효한 Context
Activity 안에서 접근이 가능하며, Activity 생명주기에 종속되어 있다. 현재 Activity 의 생명주기 범위 안에서 Context 를 전달해야 하는 경우에만 사용한다.
예를 들어, Activity 생명주기 안에서 객체를 생성하는데 Context 가 필요한 경우라면 Activity Context 를 사용하면 된다. UI 와 관련된 동작들, Toast, dialog 등이 이에 해당된다.
Application Context | Activity Context |
- 앱(Application)의 생명주기에 종속되어 있다. 함부로 사용하면 안된다. - 잘못 사용하면 메모리 누수를 일으킬 수 있다. - 현재 Context 의 생명주기 넘어서는 범위에서 Context 가 필요한 경우 사용(ActivityViewModel, ContentProvider 등) - 라이브러리 초기화 혹은 싱글턴 객체에 컨텍스트를 전달하는 경우 사용 |
- Activity 범위 안에서 동작이 끝나는 작업을 할 때 사용. - GUI와 관련된 작업에 컨텍스트가 필요한 경우 사용 (UI 와 관련된 동작들, Toast, dialog 등). |
감사합니다 :)
'🤖 안드로이드 Android' 카테고리의 다른 글
[안드로이드/Android] 빠른 설정창에 개발자 옵션-레이아웃 범위 표시 메뉴 추가하기 (0) | 2022.09.15 |
---|---|
[안드로이드/Android] javax.xml.bind.UnmarshalException 에러 (0) | 2022.01.09 |
[안드로이드/Android] 레트로핏 Retrofit 을 이용한 날씨 앱 만들기 (0) | 2021.08.29 |
[안드로이드/Android] AsyncTask 로 HttpURLConnection 를 이용한 날씨 앱 만들기 (0) | 2021.08.29 |
[안드로이드/Android] AsyncTask 를 이용한 프로그레스바(ProgressBar) 표시하기 (0) | 2021.08.23 |