Context 정의
Android의 핵심으로 뽑히는 Context란 과연 무엇일까?
https://developer.android.com/reference/android/content/Context에 언급된 자료에 의하면
Context는 애플리케이션 환경에 대한 광역적인 정보를 갖는 인터페이스.
Context는 Android System 의해 구현되는 추상 클래스이다.
Context는 애플리케이션의 구체적인 Resource, Classes 뿐 만 아니라 'launching activities', 'broadcasting', 'receiving intents' 등과 같은 애플리케이션 수준의 작업(operations)을 호출할 수 있도록 접근을 허용한다.
Context 이해해보기
Context에 대한 정의만으로는 Context가 어떻게 사용되고 왜 필요한지 이해하기 어려울 수 있다.
좀 더 이해하기 쉽게 설명해보도록 하자.
Context란 말 그대로 우리가 무엇에 대해 설명할 때 또는 우리가 현재 어디에 있는지 얘기해야 할 때 필요한 '문맥' 과 같다.
우리가 실생활에서 말의 '문맥'(=서로 이어져 있는 문장의 앞뒤 관계)을 통해 말의 의미를 좀 더 정확하게 만들 수 있듯이 Context 또한 말의 문맥과 비슷한 역할을 한다.
Context의 중요한 포인트는 다음과 같다.
- 애플리케이션의 현재 상태를 알려주는 문맥이다.
- 액티비티와 애플리케이션에 대한 정보를 얻을 수 있다.
- resource, databases, and shared preferences 등과 같은 애플리케이션이 하는 작업들에 대해 Context를 통해 접근할 수 있다.
- 액티비티 클래스와 애플리케이션 클래스 모두 Context 클래스를 상속한다.
Context는 안드로이드 개발에 있어서 어디에나 존재하기에 가장 중요한 부분이다. 따라서 완벽하게 이해하는 것이 좋다.
또한 잘못된 Context의 사용은 안드로이드 앱 내에서 메모리 누수를 초래할 수 있어서 주의해야 한다.
Context의 종류
Context는 주로 두 가지 타입이 있다.
- Application Context : 우리가 존재하는 애플리케이션의 문맥. 예를 들어 Application Class를 구현하는 MyApplication class가 있다면 Application Context는 MyApplication의 instance 일 뿐이다.
- Activity Context : 우리가 존재하는 액티비티의 문맥. 예를 들어 MainActivity가 있다면 Activity Context는 MainActivity의 instance일 뿐이다.
1.Application Context
애플리케이션 컨텍스트는 액티비티 내에서 getApplicationContext() 메서드를 통해 싱글톤 객체를 얻을 수 있다.
애플리케이션 컨텍스트는 애플리케이션의 생명 주기와 연동된다.
애플리케이션 컨텍스트는 현재의 컨텍스트와는 생명 주기가 다른 컨텍스트를 필요로 할때 또는 액티비티의 반경을 넘어서 컨텍스트를 넘겨주어야 할 때 사용될 수 있다.
예를 들어
//room database singleton object를 생성해야 할 때
//in MainActivity
val application = this.application
val database = RoomDatabase.getInstance(application)
만약 우리가 우리의 application에 필요한 싱글톤 객체를 생성해야 한다면
그리고 이 객체가 context를 필요로 한다면 반드시 application context를 넘겨주어야 한다.
우리는 Context가 필요한 상황일 때, Context가 들어가야 할 요소의 생명 주기를 잘 파악하고,
해당 요소가 현재의 Context(지금 우리가 지닌?)보다 오래 지속할 것 같다면 getApplicationContext()를 사용하여야 한다.
2.Acitivity Context
액티비티 컨텍스트는 액티비티 내에서 이용 가능하다.
액티비티 컨텍스트는 액티비티의 생명주기와 연동된다.
액티비티 컨텍스트는 엑티비티의 반경 내에서 context를 넘겨주어야 할 때 사용된다.
또는 생명주기가 현재의 context에 부착된 문맥을 필요로 할 때 사용해야 한다.
예를 들어
액티비티의 생명주기와 연동되는 객체를 생성해야 할 때는 Activity Context를 사용하자.
3.ContentProvider.getContext()
ContentProvider.getContext()를 사용하여 Context를 얻을 수 있다.
해당 컨텍스트는 application Context와 같다. 따라서 application Context 처럼 사용될 수 있다.
언제 어떠한 Context를 사용해야 할까?
언제 어떤 Context를 사용해야할까
만약 MyApplication 내에서 MyDB class의 singleton을 사용해야 한다면, 어떤 Context를 넘겨줘야 할까
바로 Application Context를 넘겨줘야 한다.
싱글톤 패턴의 경우, 다양한 Context상황속에서 쓰이게 된다. 만약 Activity Context를 넘겨주어 싱글톤 객체를 불러올 경우 해당 액티비티가 종료된 뒤에도 메모리상에 남아있는 싱글톤 객체는 해당 액티비티의 context를 계속해서 참조하고 있을 수도 있다. 이는 메모리 누수를 유발한다.
따라서 반드시 싱글톤의 경우 항상 application context를 사용해야 한다.
그렇다면 Activity Context는 언제 사용해야 할까?Activity 내에서 사용되는 모든 UI작업들 - toast 및 dialogs를 띄우는 것과 같은 작업을 할 때 Activity Context를 사용할 수 있다.
그리고 항상 나에게 가장 가까운 Context가 무엇인지를 인지해야 한다.
예를 들어 내가 activity내에 있다면 가장 가까운(Nearest context) Context는 Activity context 일 것이다. 그리고 Context가 필요한 상황일 때 해당 context의 생명주기를 벗어나지 않는다면 activity Context를 사용하는 것이 옳다.
참고
https://blog.mindorks.com/understanding-context-in-android-application-330913e32514