Imaginons que j'ai un widget pour une application avec targetSDKVersion réglé sur 26. Ce widget met entre 100ms et 10s pour se mettre à jour. La plupart du temps en moins de 1s. Avant Android O, si onUpdate() était appelé sur mon AppWidgetProvider, je pouvais lancer un service en arrière-plan pour mettre à jour ce widget. Cependant, Android O renvoie une IllegalStateException si vous tentez ce comportement. La solution évidente de démarrer un service en premier plan semble être une mesure extrême pour quelque chose qui sera fait en moins de 10s 99% du temps.
Solutions possibles
- Démarrer un service en premier plan pour mettre à jour le widget. Importuner l'utilisateur avec une notification qui disparaîtra en 10 secondes.
- Utiliser JobScheduler pour planifier un travail le plus rapidement possible. Votre widget peut être mis à jour ou non pendant un certain temps.
- Essayer de faire le travail dans un récepteur de diffusion. Bloquez le thread UI pour d'autres applications. Beurk.
- Essayer de travailler dans le récepteur de widget. Bloquez le thread UI pour d'autres applications. Beurk.
- Abuser de GCM pour exécuter un service en arrière-plan. Beaucoup de travail et cela semble bricolé.
Je n'aime personnellement aucune des solutions ci-dessus. J'espère que je passe à côté de quelque chose.
(Encore plus frustrant est que mon application est déjà chargée en mémoire par le système appelant onUpdate(). Je ne vois pas en quoi charger mon application en mémoire pour appeler onUpdate(), mais ensuite ne pas donner à mon application 1s pour mettre à jour le widget en dehors du thread UI ne sauvegarde la batterie de personne.)
1 votes
Avez-vous trouvé un moyen plus propre de le faire? Je suis également confronté à l'IllegalStateException