Broadcast Receiver, BootReciver 활용하기

Broadcast Receiver 

안드로이드 4대 컴포넌트 중 하나로, 각종 앱에서 발생하는 이벤트를 캐치 후 리시버로 처리할 수 있도록 도와주는 컴포넌트입니다.

전화, 문자 등의 행위가 왔다는 알림을 받고 방송을 해주는 기능입니다.

Intent를 통해 발송하게 되고, 발송된 방송을 Broadcast Receiver 객체가 수신하게 됩니다.

안드로이드 기기 내부에서는 각 상황에 따라 미리 정의된 발송을 하며, 해당 방송을 수신하여 적절하게 처리할 수 있습니다.

https://developer.android.com/develop/background-work/services/alarms/schedule?hl=ko#boot

 

알람 예약  |  Background work  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 알람 예약 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 알람 (AlarmManager 클래스 기반)을 사용하면 애

developer.android.com

 

주요 시스템 브로드캐스트 Intent

미리 정의된 Broadcast Receiver Intent를 활용할 수 있습니다.

특정 이벤트나 상태 변경을 나타내는 문자열로, 브로드캐스트 리시버가 해당 이벤트를 수신할 수 있도록 합니다.

 

  • BOOT_COMPLETED
    • 액션: android.intent.action.BOOT_COMPLETED
    • 설명: 기기가 부팅을 완료했을 때 발생합니다. 이 브로드캐스트를 받으려면, 애플리케이션에 RECEIVE_BOOT_COMPLETED 권한이 필요합니다.
  • BATTERY_CHANGED
    • 액션: android.intent.action.BATTERY_CHANGED
    • 설명: 배터리 상태(충전 상태, 레벨, 전압 등)가 변경될 때 발생합니다. 이 인텐트는 등록된 리시버에만 전달되며, 다른 인텐트처럼 인텐트 필터에 등록할 수 없습니다.
  • BATTERY_LOW
    • 액션: android.intent.action.BATTERY_LOW
    • 설명: 배터리 레벨이 낮을 때 발생합니다.
  • BATTERY_OKAY
    • 액션: android.intent.action.BATTERY_OKAY
    • 설명: 배터리 레벨이 낮았으나 회복되었을 때 발생합니다.
  • ACTION_POWER_CONNECTED
    • 액션: android.intent.action.ACTION_POWER_CONNECTED
    • 설명: 기기가 전원에 연결되었을 때 발생합니다.
  • ACTION_POWER_DISCONNECTED
    • 액션: android.intent.action.ACTION_POWER_DISCONNECTED
    • 설명: 기기가 전원에서 분리되었을 때 발생합니다.
  • AIRPLANE_MODE_CHANGED
    • 액션: android.intent.action.AIRPLANE_MODE_CHANGED
    • 설명: 비행기 모드 상태가 변경될 때 발생합니다.
  • CONNECTIVITY_CHANGE
    • 액션: android.net.conn.CONNECTIVITY_CHANGE
    • 설명: 네트워크 연결 상태가 변경될 때 발생합니다. (Android 7.0 이후부터는 이 인텐트를 Manifest에 선언할 수 없습니다.)
  • WIFI_STATE_CHANGED
    • 액션: android.net.wifi.WIFI_STATE_CHANGED
    • 설명: Wi-Fi 상태가 변경될 때 발생합니다.
  • PACKAGE_ADDED
    • 액션: android.intent.action.PACKAGE_ADDED
    • 설명: 새로운 애플리케이션 패키지가 설치되었을 때 발생합니다.
  • PACKAGE_REMOVED
    • 액션: android.intent.action.PACKAGE_REMOVED
    • 설명: 애플리케이션 패키지가 제거되었을 때 발생합니다.
  • SMS_RECEIVED
    • 액션: android.provider.Telephony.SMS_RECEIVED
    • 설명: SMS 메시지가 도착했을 때 발생합니다.

 

 

BootReciver? 

BootReciver는 안드로이드 디바이스가 부팅을 완료했을 때 특정 작업을 수행하도록 설계된 Broadcast Receiver입니다.

부팅 후 특정 서비스나 작업을 자동으로 시작하려는 경우 사용됩니다.

우아한 테크코스 안드로이드 활동을 진행하면서, 위와 같은 리뷰를 받게 되었습니다.

AlarmManager로 등록한 알림이 재부팅된다면 설정했던 알림들이 사라지게 된다는 내용이었습니다.

BOOT_COMPLETED 액션을 수신하는 BroadcastReceiver를 구현하고, 설정한 알림을 재등록하는 과정이 필요했습니다.

 

BootReciver를 활용한 알림 재등록

class TicketNotificationBootReceiver : BroadcastReceiver() {
    override fun onReceive(
        context: Context?,
        intent: Intent?,
    ) {
        if (isBootingState(intent)) {
            context?.let { setNotificationTickets(it, ReservationTicketRepositoryImpl(it)) }
        }
    }

    private fun isBootingState(intent: Intent?): Boolean {
        return intent?.action == Intent.ACTION_BOOT_COMPLETED
    }

    private fun setNotificationTickets(
        context: Context,
        repository: ReservationTicketRepository,
    ) {
        Thread {
            val tickets = repository.loadReservationTickets()
            tickets.forEach { reservationTicket ->
                TicketNotification.setNotification(
                    context = context,
                    ticketId = reservationTicket.ticketId,
                    movieTitle = reservationTicket.movieTitle,
                    screeningDateTime = reservationTicket.screeningDateTime,
                )
            }
        }.start()
    }
}

 

Broadcast Reciever를 상속받는 TicketNotificationBootReceiver를 선언하였습니다.

<receiver android:name=".notification.TicketNotificationBootReceiver"/>

manifest에 해당 내용을 등록함으로써 알림을 재등록 준비를 할 수 있었습니다.

isBootingState(intent: Intent?)를 통해서 현재 부팅 상태를 확인하고, 

setNotificationTickets를 통해서 삭제된 알림 들을 재등록하였습니다.

참고

https://www.tutorialspoint.com/android/android_broadcast_receivers.htm