안드로이드 With Java #14 Context
안드로이드 시스템 서비스는 토스트 메세지나 카메라 등 앱 외부에 있는 안드로이드 자체에서 제공해주는 기능을 사용할 때 사용되는 서비스이다.
Toast.makeText()
또는 Intent
를 만드는 등의 행위에서 Context
는 널리 사용된다. 그럴 때 내가 무엇을 넣어야 하는지 알기 위해.
앱 전체를 의미함
Application Context의 경우 앱 전체를 Context로 보면 이해가 수월하다.
어플리케이션 안에 등록된 Activity를 의미함. 앱을 개발하며 추가하는 화면(Activity)의 컨텍스트
Activity Context의 경우 Activity 자체를 Context로 보면 이해가 더 수월하다.
위에 보듯이 우리가
Activity
를 만들 때는AppCompatActivity
를 상속받는다.AppCompatActivity
내부에는 우리가 이전에 사용했던startActivity
,startActivityForResult
등이 이미 구현되어 있다.
Context
에 MainActivity
를 의미하는 this
키워드를 넣어도 아무런 에러가 없다. 그 말은 Context
는 this
와 같은 타입이거나 그 상위 타입이라는 뜻이다.
위에 Context
타입에 Activity
를 넣어도 별다른 에러가 없었다. Context
의 구현 내용을 디컴파일해보면 위와 같이 추상 클래스로 정의되어 있다.
Activity
타입은 어떤 클래스를 상속받았길래 Context
타입에 넣어도 에러가 나지 않을까?
위의 내용을 보면 ContextThemeWrapper
라는 클래스를 상속받는다.
ContextThemeWrapper
는 ContextWrapper
를 상속받는다.
ContextWrapper
는 Context
를 상속받는다.
결국 Activity
는 거치고 거쳐서 Context
에 있는 모든 내용을 상속받았다는 것을 알 수 있다.
위와 같이 getApplicationContext()
메소드를 통하여 Application Context를 얻어올 수 있다.
위 내용처럼 manifest.xml
을 봤을 때 application
내부에 구성요소로서 activity
가 들어있는 것을 확인할 수 있다. 우리는 저 application
의 컨텍스트를 getApplicationContext()
메소드를 통해 가져올 수 있다.
위와 같이 2가지 방법이 있는데
첫번째는 this
키워드를 통해서 얻어오는 것이고 두번째는 MainActivity.this
를 통해 얻어오는 방법이 있다.