프로그래밍/Android

[Widget] Android Widget 에서 ForegroundService 실행

showmiso 2022. 12. 20. 12:27


Android 12 부터 백그라운드에서 ForegroundService 를 실행할 수 없게 되었다.
- 포그라운드 서비스 실행 제한
https://developer.android.com/about/versions/12/foreground-services?hl=ko 

위젯 데이터를 즉시 업데이트 할때 ForegroundService 를 사용하고 있었는데, 
ForegroundServiceStartNotAllowedException 이 발생되며 위젯 생성이 중지되었다. 

기존에 자정에 위젯을 업데이트 하기 위한 용도로 AlarmManager 를 사용하고 있었는데, AlarmManager 로 서비스를 즉시 업데이트 하니 3~5초 정도 딜레이가 있어 WorkManager 를 적용해보기로 했다. 
하지만 onUpdate 가 무한루프 돌면서 WorkManager 가 계속 실행되어 위젯이 깜빡거렸다. 
검색해본 결과 이는 의도된 동작이였다.

- 참고 링크

https://stackoverflow.com/questions/70654474/starting-workmanager-task-from-appwidgetprovider-results-in-endless-onupdate-cal

무한루프가 발생한 이유는 onUpdate/onReceive() 함수에서 WorkManager 를 실행해서 였다. 
Pending 된 작업이 없으면 WorkManager 의 내부 receiver 가 disable 되고, 그럴 경우 Component 상태가 변한 것으로 판단해 onUpdate() 함수가 trigger 된다. 다시 onUpdate -> onReceiver -> WorkManager 가 실행되어 무한루프가 돌았던 것이다. 

답변자는 이를 해결하기 위해 onEnabled() 에서 작업을 예약하라고 했다.

하지만 나는 즉시 업데이트 되는 기능이 필요했기에 어쩔수 없이 다시 AlarmManager 를 적용했다.