[안드로이드] BroadcaseReceiver가 잘 동작하지 않는 이유(분석중)
안드로이드에서 Broadcast는 서로 다른 프로세스 간에서 데이터를 통신하는 가장 쉬운 방법이 아닌가 싶습니다. 특히 안드로이드 시스템에서 발생하는 특별한 이벤트를 pub sub 패턴?과 유사하게 받아 처리할 수 있습니다.
developer.android.com/guide/components/broadcasts
브로드캐스트 리시버에 대한 자세한 설명은 위의 공식 디벨로퍼 가이드에 잘 정리되어 있습니다.
문제는 안드로이드가 진화함에 따라 브로드캐스트 리시버에 제약을 두기 시작해서 생각대로 잘 동작하지 않는 경우가 있다는 것입니다.
그 제약 대상은 사용자가 잘 알아차릴 수 없는 백그라운드 서비스와 BroadcastReceiver 입니다. 이를 Background Limitation이라 합니다.
BroadcastReceiver를 사용하는 방법 중 하나는 AndroidManifest에 특정 리시버를 명시하는 것이었습니다. 그런데 안드로이드 8.0부터는 이를 지원하지 않는다고 하네요(수신자가 특정되지 않는 implicit broadcast만). 대부분의 경우 scheduled jobs로 대체 가능하다고 합니다.
(만약 AndroidManifest에서 정적으로 BroadcastReceiver를 등록하는 게 아닌.. 동적으로 Code에서 BroadcastReceiver를 등록하면.. 앱이 실행중일 때만 브로드캐스트 리시버가 동작하는 것 같습니다)
Note: If your app targets API level 26 or higher, you cannot use the manifest to declare a receiver for implicit broadcasts (broadcasts that do not target your app specifically), except for a few implicit broadcasts that are exempted from that restriction. In most cases, you can use scheduled jobs instead. |
그런데 제가 테스트했을 때는 AndroidManifest에 Broadcast를 정적으로 등록해도 제 앱을 종료해도 하루 정도는 브로드캐스트 리시버가 잘 동작하니 뭔가 좀 이상하더라구요.
또 정보를 좀 찾아보니 일부? 대표적인? Broadcast들은 예외 처리가 되어.. implicit broadcast임에도 여전히.. AndroidManifest에서 사용이 가능합니다.
developer.android.com/guide/components/broadcast-exceptions
제가 사용하고 있는 Broadcast는 SMS_RECEIVED_ACTION인데 이것도 예외처리되어 사용이 가능합니다.
그렇다면 왜.. 하루정도 지나면 잘 동작하던 BroadcastReceiver가 동작하지 않는 것일까요?
참고
developer.android.com/guide/background
developer.android.com/topic/performance/power/power-details
developer.android.com/topic/performance/power/test-power
stackoverflow.com/questions/62569490/sms-receiver-stops-working-after-sometime
댓글 영역