폰이 부팅 혹은 재부팅될 때 실행되어야 하는 경우가 있습니다.
예를 들면, 알람앱 같은 경우가 될 텐데요.
알람을 설정하고 나서, 폰이 재부팅된 이후에도,
실행되도록 부팅시 DB를 조회해서 알람을 다시 등록해야 하겠습니다.
오늘은 이 방법에 대해서 정리해 보도록 하겠습니다.
1. 부팅 시기 알림받기
부팅이 되었을 때 앱이 안드로이드로부터 알림을 받아야 할 텐데요.
이를 위해서는 Receiver가 필요합니다.
그런데 Receiver를 작성하기 전에,
권한을 하나 추가해야 하는데요.
android.permission.RECEIVE_BOOT_COMPLETED
권한을 AndroidManifest.xml에 추가해 주어야 합니다.
2. Receiver 추가하기
RebootReceiver를 생성한 다음,
AndroidManifest.xml에 아래와 같이 해당 receiver에,
intent-filter를 추가해 줍니다.
BOOT_COMPLETED이라고 하는 부팅이 완료됬을 때 보내주는 intent를 받기 위함입니다.
이제 Receiver를 보도록 하겠습니다.
리시버에서 하는 일은 BOOT_COMPLETED라는 intent를 받아서 확인후,
재부팅후 실행하고자 하는 일을 수행하는 서비스를 실행시켜주는 것입니다.
Android Oreo버전 이후 부터는 service를 startService메소드로 바로 실행할 수 없는데요.
따라서, startForegroundService메소드를 사용해 주어야 합니다.
if문으로 구분하여 아래와 같이 사용할 수 있습니다.
3. Service 작성
본격적으로 Service에서 해야할 일을 작성하기 전에 Android O부터는
onCreate에서 아래와 같이 startForeground를 작성해 주어야 합니다.
당연히도, Android O부터 필수가 된, Notification Channel이 앱 어딘가에서는 한번 생성되어 있어야 하구요.
(Notification Channel에 대해서는 다른 글에서 다루도록 하겠습니다.)
(매번 업데이트되는 안드로이드 따라잡는 것만도 만만한 일이 아니네요;;;)
이제 Android드로부터 메세지를 받은 Receiver가 실행시킨
Service가 onHandleIntent를 실행시켜 줍니다.
여기에 알람앱이라면 DB를 조회해서 다시 세팅해준다든지의 일을 하면 되겠네요.
이 글에서는 간단히 로그만 찍어 보았습니다.
또한, 여기서 사용한 Service는 IntentService로 Service와는 사용방법이 조금 다른데요.
Service라면 onHandleIntent가 아니라, onStartCommand에서 실행을 해야되겠네요.
종료도 명확하게 해주어야 하겠구요.
4. 정리
BOOT_COMPLETED라는 메세지를 안드로이드 시스템에서 리시버를 통해서 받고,
Service를 실행시키는 방법에 대해서 정리해 보았습니다.
한가지 주의할 점은 이것은 사용자가 핸드폰을 재부팅하고,
패턴암호 같은 것이 걸려있다면,
그것을 풀어주었을 때 실행되는 것 이라는 점 입니다.
게다가, 암호를 풀자마자 바로 실행된다기 보다는 조금의 시간차가 있을 수 있습니다.
앱에 따라서 필요한 실행시기가 다를 수 있으므로,
테스트를 해보면서 명확하게 알고있을 필요가 있을 것 같습니다.
'Android 개발 > Service, Receiver' 카테고리의 다른 글
Broadcast Receiver 등록하고 시스템 이벤트 받아서 처리하기 (1) | 2023.05.23 |
---|---|
Android Foreground Service 로 Background 에서 음악 플레이 하기 (4) | 2020.01.18 |
BindService 의 생성과 Activity 에서의 Bind (0) | 2017.04.04 |
Android 에서 wake lock 으로 휴대폰을 깨우자. (0) | 2017.03.23 |
댓글