본문 바로가기
Android 개발/Service, Receiver

부팅 혹은 재 부팅시 실행되는 Android Service 개발

by Developer88 2019. 5. 26.
반응형

폰이 부팅 혹은 재부팅될 때 실행되어야 하는 경우가 있습니다.

예를 들면, 알람앱 같은 경우가 될 텐데요.

알람을 설정하고 나서, 폰이 재부팅된 이후에도,

실행되도록 부팅시 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를 실행시키는 방법에 대해서 정리해 보았습니다.

한가지 주의할 점은 이것은 사용자가 핸드폰을 재부팅하고,

패턴암호 같은 것이 걸려있다면,

그것을 풀어주었을 때 실행되는 것 이라는 점 입니다.

게다가, 암호를 풀자마자 바로 실행된다기 보다는 조금의 시간차가 있을 수 있습니다.

앱에 따라서 필요한 실행시기가 다를 수 있으므로,

테스트를 해보면서 명확하게 알고있을 필요가 있을 것 같습니다.

728x90

댓글