Скажем, у меня есть виджет для приложения, у которого targetSDKVersion установлено значение 26. Этот виджет занимает от 100 мс до 10 секунд для обновления. Большую часть времени в возрасте до 1 года. Перед Android O, если onUpdate() был вызван на моем AppWidgetProvider, я мог бы запустить фоновый сервис для обновления этого виджета. Тем не менее, Android O возвращает исключение IllegalStateException, если вы попытаетесь выполнить это поведение. Очевидное решение о начале работы переднего плана кажется крайней мерой для чего-то, что будет сделано менее чем за 10 секунд в 99% случаев.
Возможные решения
- Запустите службу переднего плана для обновления виджета. Аноним пользователя с уведомлением, которое исчезнет через 10 секунд.
- Используйте JobScheduler для планирования работы как можно быстрее. Ваш виджет может или не может обновиться некоторое время.
- Попытка выполнить работу в широковещательном приемнике. Заблокируйте поток пользовательского интерфейса для любых других приложений. Тьфу.
- Попытка выполнить работу в приемнике виджетов. Заблокируйте поток пользовательского интерфейса для любых других приложений. Тьфу.
- Пожаловаться на GCM, чтобы запустить фоновый сервис. Много работы и чувствует себя взломанным.
Мне лично не нравится какое-либо из вышеперечисленных решений. Надеюсь, я что-то упустил.
(Еще больше разочаровывает то, что мое приложение уже загружено в память системным вызовом onUpdate(). Я не вижу, как загружать мое приложение в память, чтобы вызывать onUpdate(), но затем не давая обновлению моего приложения 1s виджет с потоком пользовательского интерфейса обеспечивает сохранение любого времени автономной работы.)