Broadcast Receiver
안드로이드 4대 컴포넌트 중 하나로, 각종 앱에서 발생하는 이벤트를 캐치 후 리시버로 처리할 수 있도록 도와주는 컴포넌트입니다.
전화, 문자 등의 행위가 왔다는 알림을 받고 방송을 해주는 기능입니다.
Intent를 통해 발송하게 되고, 발송된 방송을 Broadcast Receiver 객체가 수신하게 됩니다.
안드로이드 기기 내부에서는 각 상황에 따라 미리 정의된 발송을 하며, 해당 방송을 수신하여 적절하게 처리할 수 있습니다.
https://developer.android.com/develop/background-work/services/alarms/schedule?hl=ko#boot
주요 시스템 브로드캐스트 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