본문 바로가기
Android

[Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 정리 14 - 시스템 상태 파악하기

by 들풀민들레 2022. 2. 28.
본 글은 [Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린 - 이지스퍼블리싱 (2022)] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책 혹은 인강을 통해 확인해 주세요.

 

 

 

시스템에서 발생하는 인텐트는 여러 종류가 있으며 부팅 완료, 화면 켬/끔, 배터리 상태 등이 대표적입니다. 이러한 상황에서 앱의 리시버를 어떻게 실행하는지 살펴보겠습니다.


부팅 완료


안드로이드 기기의 전원을 켜면 시스템이 동작해 부팅이 시작되고 완료되면 사용자가 기기를 사용할 수 있는 상태가 됩니다. 만약 앱에서 부팅이 완료될 때 특정한 작업을 수행하고 싶다면 브로드캐스트 리시버를 만들고 매니페스트 파일에 인텐트 필터를 구성해서 등록합니다.
부팅이 완료되면 시스템에서는 android.intent.action.BOOT_COMPLETED라는 액션 문자열을 포함하는 인텐트가 발생합니다. 이때 실행할 리시버에는 <action>의 name 속성에 똑같은 액션 문자열을 똑같이 등록합니다.

<receiver
    android:name=".MyReceiver"
    android:enabled="true
    android:exported="true">
    <intent-filter>
    	<action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

그런데 리시버를 실행하려면 권한이 필요하므로 매니페스트에 다음처럼 퍼미션을 추가해야 합니다.

 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

화면 켬/끔


다음으로는 안드로이드 기기의 화면을 켜거나 끌 때 이를 감지하는 리시버를 살펴보겠습니다. 그런데 화면을 켜거나 끄는 상황을 감지하는 브로드캐스트 리시버는 매니페스트에 등록하면 실행되지 않습니다. 앞에서 설명한 것처럼 액티비티나 서비스 컴포넌트의 코드에서 registerReceiver() 함수를 이용해 동적으로 등록해야만 합니다.


화면을 켤 때와 끌 때를 구분해서 브로드캐스트 리시버를 따로 만들어도 되지만 다음처럼 하나의 리시버에서 켜고 끄는 상항을 모두 감지하도록 할 수도 있습니다. 다음 코드에서는 android.intent.action.SCREEN_ON과 android.intent.action.SCREEN_OFF 액션 문자열을 상수 변수로 사용했습니다.

 

receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        when (intent?.action) {
            Intent.ACTION_SCREEN_ON -> Log.d("kkang", "screen on")
            Intent.ACTION_SCREEN_OFF -> Log.d("kkang", "screen off")
        }
    }
}

이렇게 하면 onReceive() 함수의 매개변수인 Intent 객체에서 자신을 호출한 인텐트의 액션 문자열을 가져와 화면을 켜거나 끄는 상황을 판단할 수 있습니다.
이렇게 정의한 브로드캐스트 리시버 객체는 액션 문자열 정보로 구성한 인텐트 필터와 함께 registerReceiver() 함수로 시스템에 등록합니다.

 

val filter = IntentFilter(Intent.ACTION_SCREEN_ON).apply {
	addAction(Intent.ACTION_SCREEN_OFF)
}
registerReceiver(receiver, filter)

registerReceiver() 함수로 등록한 브로드캐스트 리시버는 필요 없는 순간이 되면 unregister Receiver() 함수로 등록을 해제해 줘야 합니다.

 

unregisterReceiver(receiver)