본문 바로가기

안드로이드 개발/개발팁

Android의 Context ( getBaseContext()와 getApplicationContext() 차이)

Android의 Context 정리

 

 

1) getBaseContext()
Activity의 Context
생성자나 Context에서 기본 설정 된 Context

 

2) getApplicationContext()
Service의 Context
어플리케이션의 종료 이후에도 활동 가능한 글로벌한 Application의 Context
앱 종료 후 메모리 유지를 피하기 위해서 getBaseContext를 사용.

 

 

3) View.getContext()

현재 실행되고 있는 View의 context를 return 하는데 보통은 현재 활성화된 activity의 context가 된다.

 

 

 

4) Activity.getApplicationContext()

어플리케이션의 Context가 return된다. 현재 activiy의 context 뿐만 아니라 application의 lifeCycle에 해당하는 Context가 사용된다.

 

 

5) ContextWrapper.getBaseContext()

자신의 Context가 아닌 다른 Context를 access하려 할 때 사용한다. ContextWrapper는 getBaseContext()를 경유해서 Context를 참조할 수 있다.

this

View.getContext()와 같다.

 

 

 

 

 

Activity extends Context 입니다. Activity도 Context인 것이죠. Context는 안드로이드 시스템과의 연결통로와 동시에 어플리케이션 리소스에 접근할 수 있는 통로 라고 볼 수 있는데 Activity는 이런 Context를 상속받아 구현하는 컴포넌트중 하나입니다. getResources()로 해당 어플리케이션 리소스에 접근할 수 있고 registerReceiver()로 시스템에 브로드캐스트 리시버를 등록하는 행위를 생각해보시면 될듯합니다. Activity와 비슷하게 이런 Context를 상속받는 것을 살펴보면 Application, Service 등이 있습니다. 공통점을 보면 다 프로세스화 될 수 있는 컴포넌트 라는 겁니다. 이렇게 프로세스화 될 수 있는 컴포넌트는 시스템에도 접근이 가능해야 하고 자신이 소속된 어플리케이션의 리소스에도 접근이 가능해야 합니다. 이런 중간 인터페이스가 바로 Context 인것죠

 

this. Activity.this 의 차이는 소스상에서 포커스의 차이 입니다. 이너클래스로 되어 있으면 this 가 이너클래스의 this 가 되어 버리므로 Context를 사용하기 위해서 명시적으로 호출하는겁니다. 이너클래스 혹은 익명클래스 에 대해서 잘 찾아보시면 됩니다. 언어적인 부분은 위와 같고 왜 this 를 사용하느냐는 컨텍스트를 사용하여 정확한 메모리 정보를 얻고자 하는겁니다.

 

 

Activity 를 통해서 Context를 가져 오는 경우는 Window 에 View 를 붙일려고 할때 , Event를 가져오기 위해서 사용하는 경우가 대부분입니다. 따라서 화면에 보여줘야 하는 경우에 사용되는 Context는 ActivityContext를 사용합니다. 나머지의 경우는 Process단위의 ApplicationContext로 해결이 가능합니다.