Je migre ma version du SDK cible de l'application vers Android oreo.
L’une des modifications susceptibles d’affecter l’application est que, si la taille de l’affichage de l’appareil est modifiée, l’application ciblant Android Nougat et les versions ultérieures en sera avertie comme s’il y avait un changement d’orientation de l’appareil. Ci-dessous, la source.
Lorsque la densité de l'appareil change, le système informe les applications en cours d'exécution dans les manières suivantes:
Si une application cible une API de niveau 23 ou inférieur, le système automatiquement tue tous ses processus d'arrière-plan. Cela signifie que si un utilisateur bascule loin d'une telle application pour ouvrir l'écran Paramètres et modifie le Réglage de la taille d'affichage, le système supprime l'application de la même manière que ce serait dans une situation de faible mémoire. Si l'application a un premier plan processus, le système notifie ces processus de la configuration changez comme décrit dans Gestion des modifications d’exécution, comme si le l'orientation de l'appareil avait changé . Si une application vise Android 7.0, tous de ses processus (avant-plan et arrière-plan) sont notifiés du modification de la configuration, comme décrit dans Gestion des modifications d'exécution.
Maintenant, mon application a un processus de longue durée qui s'exécute dans un TSak Async dans une activité Android. Ce qui signifie que l'application a une AsyncTask qui est à l'intérieur du code d'activité.
Je crée une boîte de dialogue au début de la tâche asynchrone et la masque lorsque la tâche asynchrone a terminé son travail.
Supposons maintenant que les utilisateurs démarrent la tâche, puis passent au paramètre et modifient la taille d'affichage, puis reviennent dans mon application, puis la boîte de dialogue de l'application disparaît. La tâche asynchrone est toujours exécutée jusqu'à la fin, ce qui signifie que l'utilisateur peut penser que l'application a terminé la tâche, mais que l'application l'exécute réellement. Mais mon activité répond également comme si elle avait été redémarrée, sauf que la tâche asynchrone est en cours d'exécution.
L'orientation de mon application est verrouillée en mode portrait.
Comment dois-je gérer un tel scénario? Toute aide est appréciée. Merci!
EDIT: c'est le scénario
1) Démarrer l'application
2) écran principal
3) Les utilisateurs appuient sur un bouton
4) AsyncTask dans l'écran principal démarré
5) Une boîte de dialogue s'affiche avec la progression de la tâche.
6) L'utilisateur minimise l'application et passe au réglage
7) Modifie la taille/densité d'affichage ou change la taille de la police de l'appareil
8) Mon système appelle le système d'exploitation de telle sorte que la rotation de l'appareil change
9) Ensuite, l'utilisateur retourne à l'application.
10) Mais la boîte de dialogue affichée n'est plus affichée
11) Mais la tâche asynchrone s'exécute en arrière-plan et continue de l'exécuter.
12) La tâche est effectivement terminée mais l'utilisateur pense que la tâche n'est toujours pas terminée.
Dans votre méthode on_resume (), vérifiez que la taille de l’écran et la taille de la police n’ont pas changé. Si tel est le cas, ajustez, supprimez et recréez correctement votre boîte de dialogue. Ceci est similaire à la gestion des modifications d'orientation en suspension (l'ajout d'une taille de police en tant que condition).
MODIFIER:
Ajoutez Android:configChanges="fontScale|density"
à votre fichier manifeste.
static int fontScale = 1;
static int densityDpi = 0;
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.fontScale != fontScale) {
// destroy and recreate dialog adjusting for font size.
fontScale = newConfig.fontScale;
}
if (newConfig.densityDpi != densityDpi) {
// destroy and recreate dialog adjusting for new screen size.
densityDpi = newConfig.densityDpi;
}
}
Il serait probablement préférable d’utiliser les notifications pour la tâche async, car elles ne sont pas affectées par les modifications de configuration et ne sont pas arrêtées dans des conditions de mémoire insuffisante.
Lorsque vous faites pivoter le téléphone, votre activité est réellement détruite et recréée. Cela inclut votre dialogue. Il y a deux façons de résoudre ce problème:
1) Désactivez cette fonctionnalité "utile". Si vous ne disposez pas de dispositions différentes pour les paysages et les portraits, c'est ce que je suggérerais. Ajoutez Android: configChange = "orientation | resize" à votre activité dans le manifeste.
2) Implémentez onSaveInstanceState/onRestoreInstanceState et créez une variable indiquant si vous devez ou non recréer et relancer la boîte de dialogue.
Suggestions: Essayez d'utiliser WorkManager pour planifier la tâche, ainsi que ViewModel à partir des composants de l'architecture Android, ce qui permet de conserver l'état même après les modifications de configuration.