안녕하세요 👋
Android 개발을 하다보면 흔하게 Context 를 쓰고 있지만 사실 누군가 Context 가 뭔가요? 라고 물어보면 재대로 설명하기는 어려운데요.
그래서 이번 포스팅에선 Context 에 관해서 한번 알아 보려고 합니다!
Context 는 앱과 시스템 리소스 간의 상호 작용을 가능하게 하는 안드로이드의 핵심 구성요소 입니다.
안드로이드에서 대부분의 기능은 OS 자원을 기반으로 작동합니다. 이 자원들은 Activity 나 Application 이 직접 소유하고 있는 것이 아니라, 시스템이 관리하는 구조이기 때문에 Context 를 통해 접근해야 합니다.
val text = context.getString(R.string.app_name)
val connectivityManager = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
Application 의 라이프 사이클과 연결되어 있음
현재 Activity 나 Fragment 와 독립적인 전역적이고 오래 지속되는 Context가 필요할 때 사용
SharedPreferences 나 Database 와 같은 앱 전체 리소스 접근하는 경우 사용
전체 앱 생명주기 동안 지속되어야 하는 BroadcastReceiver를 등록하는 경우 사용
앱 생명주기 동안 유지되는 라이브러리나 컴포넌트를 초기화하는 경우 사용
object Singleton { // Singleton 객체에는 Application Context 사용
lateinit var applicationContext: Context
}
Activity 의 생명주기와 연결되어 있음
Activity 에 특정한 리소스 접근, 다른 Activity 시작, 레이아웃 인플레이션에 사용
UI 컴포넌트를 생성 또는 업데이트하는 경우 사용
다른 Activity 실행하는 경우 사용
현재 Activity 범위에 있는 리소스나 테마에 접근하는 경우 사용
val dialog = AlertDialog.Builder(context.applicationContext) // ❌
Application Context는 테마에 대한 리소스 정보가 없으므로
AlertDialog사용에 부적합합니다.
val dialog = AlertDialog.Builder(activityContext) // ✅
Service 의 생명주기와 연결되어 있음
주로 네트워크 작업 수행이나 음악 재생과 같은 백그라운드에서 실행되는 작업에 사용
BroadcastReceiver 가 호출될 때 제공
수명이 짧고 일반적으로 특정 브로드캐스트에 응답하는 데 사용
그렇기 때문에 Broadcast Context로 장기적인 태스크를 수행하면 안됨
❗️ Context 사용시 주의 사항
Context는 메인 스레드용으로 설계되었으며, 리소스에 접근하거나 UI와 상호 작용할 메인 스레드에 의존합니다.
백그라운드 스레드에서Context를 사용하면 크래시 발생 및 예기치 않은 문제가 발생 할 수 있기에 백그라운드에서 작업하는 도중에 UI 관련Context리소스와 상호 작용이 필요하다면, 반드시 메인 스레드로 다시 전환해야 합니다.
Activity 에서 this 와 baseContext 모두 Context를 반환한다는 공통점이 있지만, 서로 다른 수준을 가지고 나타내고 다른 목적을 가지고 있습니다.
Activity 클래스의 현재 인스턴스를 참조합니다.
생명주기 관리 및 UI와의 상호 작용과 같은 추가 기능을 포함하여 Activity 와 상호작용이 가능한 API를 호출 가능
해당 Activity에서 제공하는 고유한 메서드를 호출 가능
(다른 Activity를 시작, 해당 Activity에 종속된 다이얼로그를 띄워야 하는 경우)
val intent = Intent(this, AnotherActivity::class.java)
startActivity(intent)
val dialog = AlertDialog.Builder(this)
.setTitle("title")
.setMessage("message")
.show()
Activity 가 구축되는 기반 또는 기본 Context를 나타냄
Activity 가 상속하고 있는 ContextWrapper 클래스의 일부
보통 직접사용하는 경우는 거의 없음
(커스텀 ContextWrapper을 작업이 필요한 경우)
| 구분 | this | baseContext |
|---|---|---|
| 범위 | Activity 인스턴스 자체 | Activity의 기반이 되는 Context |
| 사용 위치 | UI, Activity 시작, Dialog 등 | 커스텀 ContextWrapper 작업 |
정리하다 보니 생각보다 Context 가 참 복잡하고 다양한 역할을 하고 있다는 걸 다시 느끼게 되었습니다.
평소엔 무심코 사용하던 context 라는 파라미터가 실제로는 앱 전체를 이어주는 핵심 요소라는 점이 새삼 재밌다고 느껴졌습니다!
이번 글이 여러분에게 도움이 되었으며 좋겠습니다. 😇
그럼 오늘도 즐코 하세요 🙇♂️
Android Manifest Interview <저자: 엄재웅(skydoves)>