일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 코딩공부
- 파이썬
- 안드로이드앱개발
- 개발자
- 동성로핫플
- 동성로맛집
- 수성구카페
- 대구핫플
- 안드로이드앱
- 어플개발
- 애드몹
- 애드센스
- 대구맛집
- 범물동카페
- 대구인스타핫플
- 범물동
- 안드로이드스튜디오
- 동성로카페
- 수성구맛집
- androidstudio
- 안드로이드개발
- Android
- 인스타핫플
- 앱개발
- 코딩
- 지산동카페
- 감성카페
- 대구카페
- 의무경찰
- 안드로이드
- Today
- Total
Glacier's Daily Log
무심코 쓴 getApplicationContext()에 대해서 알아보자 (feat. Dialog에 applicationContext 쓰면 안되는 이유) 본문
무심코 쓴 getApplicationContext()에 대해서 알아보자 (feat. Dialog에 applicationContext 쓰면 안되는 이유)
h__glacier_ 2023. 7. 11. 14:00안드로이드 개발을 해본 사람이라면, getApplicationContext() 함수를 정말 많이 마주했을 것이다.
안드로이드 개발에서 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.
애플리케이션 환경에 대한 전역 정보의 인터페이스이다.이것은 안드로이드 시스템에서 구현을 제공하는 추상 클래스이다.애플리케이션 특화 리소스와 클래스에 대한 접근을 허용하고, 뿐만 아니라 애플리케이션 수준의 작업(액티비티 시작, 브로드캐스팅, 인텐트 수신 등등)에 대한 호출을 허용한다.
대충 안드로이드 환경에 global한 부분에 접근하는 인터페이스 정도라고 이해할 수 있다.
따라서 우리가 안드로이드 개발시 화면이동, UI변경, 리소스 불러오기 등 모든 부분에서 Context를 인자로 넣는 것이다.
하지만 이 Context를 사용하는 방법은 여러가지가 있다.
예를 들어 Intent로 예를 들면
Intent(this, SettingActivity::class.java) 라고 해도 작동하고
Intent(this@MainActivity, SettingActivity::class.java) 라고 해도 작동하고
Intent(applicationContext, SettingActivity::class.java) 라고 해도 작동할 것이다.
그럼 이렇게 사용했을때 차이와, Context를 어떻게 사용하는것이 올바른지 간단하게 알아보자.
ApplicationContext와 ActivityContext
- ApplicationContext
> ApplicationContext는 어플리케이션 생명주기를 따르며 어플리케이션이 실행되어 종료될 때까지 동일한 객체를 참조합니다.
사용법 : getApplicationContext(), getApplication() -> 코틀린에서는 applicationContext, application
- ActivityContext
> ActivityContext는 액티비티 생명주기를 따르며 액티비티가 onDestroy() 될 때 context는 사라지게 됩니다.
사용 - getBaseContext() , ActivityName.this -> 코틀린에서는 baseActivity, this@ActivityName
위에서 설명했듯이, ActivityContext는 액티비티의 생명주기를 따른다.
그래서 액티비티가 destroy 되더라도 남아있어야 하는 기능을 구현할 시에는 ActivityContext를 사용하면 NullPointerException을 발생시킬 여지가 있다.
따라서 웬만한 기능구현에는 나도 모르게 ApplicationContext를 사용하고 있었던 것이다.
하지만 ActivitiyContext도 사용해야하는 상황이 있다.
ApplicationContext는 GUI관련 작업은 처리할 수 없다. (Toast 제외)
따라서, 액티비티상의 UI를 제어해야 할 부분이 있다면 ActivityContext (this@ActivityName)을 사용하는것이 올바르다.
실제로 개발 구현시에도 Dialog 관련 작업시에 applicationContext를 사용했다가 앱이 죽는 현상을 많이 경험하였는데, 정확한 이유는 모르고 ActivityContext로 작업했었는데 이번 정리를 통해서 깨닫게 되었다.
ApplicationContext는 앱 전체의 생명주기 및 시스템과 관련되어 있기 때문에 Dialog와 같은 액티비티에 종속되는 UI, 뷰는 해당 액티비티의 ActivityContext를 사용해야 한다!!
'Coding > Android' 카테고리의 다른 글
runCatching { } 과 Result Type (0) | 2024.01.24 |
---|---|
'Flow' in Android (0) | 2024.01.24 |
코틀린 스코프 함수 알아보기 (Kotlin Scope Function - let, run, with, apply, 그리고 also) (0) | 2023.07.08 |
심플한 무료 태블릿 메뉴판 개발기 : 더메뉴, 스마트메뉴판 (0) | 2023.03.27 |
안드로이드 스마트폰 (갤럭시) USB디버깅, 개발자모드 활성화 방법 (0) | 2023.01.23 |