[Widget] Android Widget 에서 ForegroundService 실행
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 를 적용했다.