아래 내용은 Android Developer 공식 문서 내용을 참고하여 작성한 자습 기록입니다.



📚Android 정리 - Context

Context, 안드로이드를 다루면서 가장 많이 사용하지만 정작 정확하게 설명해 볼 수 있냐고 물어본다면 자신이 없다. 오늘은 뭘 정리해야 좋을까라는 생각을 시작하기도 무섭게 Context가 떠올랐다. 긴 말이 필요 없다. 정리해 보자.

📔 Context

Context 클래스는 안드로이드의 많고 많은 컴포넌트들의 근간이 되는 요소이다. Context는 다양한 리소스 및 서비스에 대한 액세스를 제공하며 다양한 API 호출에서 매개변수로 자주 사용된다. 주로 사용되는 용도들을 보면 아래와 같다.

📔 Context의 사용

사용 설명
리소스 접근 Context 클래스는 getResources() 메서드를 사용하여 layouts, strings, drawables 과 같은 리소스들에 접근할 수 있도록 해준다
액티비티 실행 Context 클래스를 사용하면 startActivity() 메서드를 사용하여 새로운 액티비티를 실행할 수 있다
Shared Preferences 접근 Context 클래스를 사용하면 getSharedPreferences() 메서드를 사용하여 공유 저장소에 접근할 수 있다
내부 저장소 접근 Context 클래스의 getFilesDir() 메서드를 사용하여 장치의 내부 저장소에 접근할 수 있다
외부 저장소 접근 Context 클래스의 getExternalFilesDir() 메서드를 사용하여 장치의 외부 저장소에 접근할 수 있다
BradcastRecevier 등록 및 해지 Context.registerReceiver()Context.unregisterReceiver() 메서드를 사용하여 동적으로 브로드캐스트 리시버를 등록하거나 해지할 수 있다
Content Provider 접근 Context 클래스를 사용하면 getContentResolver() 메서드를 사용하여 content provider에 접근할 수 있다
시스템 서비스 가져오기 Context 클래스를 사용하면 getSystemService() 메서드를 사용하여 LayoutInflater 서비스, ActivityManager 서비스, NotificationManager 서비스와 같은 다양한 시스템 서비스에 접근할 수 있다
응용 프로그램 리소스 접근 Context 클래스를 사용하면 getDir() 메서드를 사용하여 개인 데이터, 파일 및 DB와 같은 응용 프로그램의 리소스에 액세스할 수 있다



📔 Context의 종류

위에서 보았듯이 Context는 다양한 용도로 사용되기 때문에 이에 맞는 Context의 종류 또한 다양하다. 주요 Context들을 보면 아래와 같다.

Context 설명
ApplicationContext 앱의 전체 수명 동안 사용할 수 있는 전역 컨텍스트로, 앱이 실행될 때 생성되며 앱 내의 액티비티, 서비스 또는 이외 컴포넌트에서 액세스할 수 있다. 해당 Context는 특정 액티비티와 연관되지 않아 액티비티의 수명 주기에 영향을 받지 않는다. 이 Context는 getApplicationContext() 메서드를 사용하여 액세스할 수 있다
ActivityContext 특정 액티비티에 연결된 Context로, 액티비티의 실행과 함께 생성되며 해당 액티비티 내에서 접근할 수 있다. 이 Context는 액티비티 생명 주기에 따라 영향을 받는다. 예를 들어, 액티비티가 Paused(정지됨) 상태일 경우, Context 또한 정지된다. 액티비티 클래스 내에서 this 키워드 또는 getApplicationContext() 메서드를 사용하여 해당 Context에 접근할 수 있다
ServiceContext 특정 서비스에 연결된 Context로, 서비스의 실행과 함께 생성된다. this 키워드와 서비스 클래스 내에서 접근할 수 있다
BroadcastReceiverContext 브로드캐스트 리시버와 연관된 Context로, 브로드캐스트 리시버가 등록되었을 때 생성된다. 리시버 클래스 내에서 this 키워드를 통해 접근할 수 있다
ContentProviderContext Content Provider와 연관된 Context로, Content Provider와 동시에 생성된다. Content Provider 클래스 내 this 키워드를 통해 접근할 수 있다
FragmentContext 특정 프래그먼트와 연결되며 프래그먼트가 액티비티에 연결될 때 생성된다. 프래그먼트 클래스 내부의 getContext() 메서드를 사용하여 접근할 수 있다

위와 같이 각 클래스에는 해당 클래스의 특정 인스턴스와 연결된 고유한 Context 개체가 있다.


📔 ApplicationContext와 ActivityContext의 사용

ApplicationContext와 ActivityContext는 가장 많이 보는 Context들이다. 하지만 Context를 인자로 지정할 때마다 둘 중 어떤 Context를 사용해야 하는지에 대해서는 구별하기 힘들었다. 잘못된 사용으로 인해 메모리 릭 또는 다른 오류들을 유발할 수도 있기 때문에 각각의 Context가 어떤 상황에서 사용되는지 알아보자.

📖 ApplicationContext 사용

현재 실행되고 있는 액티비티에 관계없이 앱의 전체 수명 동안 사용할 수 있는 Context가 필요한 경우네느 ApplicationContext를 사용한다. 예를 들어, 백그라운드 서비스나 여러 액티비티 간에 지속되어야 하는 싱글톤 클래스를 만드는 경우 ApplicationContext를 사용하면 된다.

아래는 ApplicationContext가 사용된 예시 코드이다.

  • background service 실행

      val serviceIntent: Intent = Intent(applicationContext, MyService::class.java)
      startService(serviceIntent)
    
  • BroadcastReceiver 등록

      val intentFilter = IntentFilter("com.example.broadcast")
      registerReceiver(MyReceiver(), intentFilter)
    


📖 ActivityContext 사용

특정 액티비티와 관련된 Context가 필요한 경우 ActivityContext를 사용한다. 예를 들어, 다이얼로그를 만들거나 새 액티비티를 실행하는 경우 현재 액티비티의 ActivityContext를 사용해야 한다.

아래는 ActivityContext가 사용된 예시 코드이다.

  • 새 액티비티 실행

      val intent = Intent(this, SecondActivity::class.java)
      startActivity(intent)
    
  • 다이얼로그 생성

      val myDialog = AlertDialog.Builder(this)