Si mon application est en cours d'exécution et que j'appuie sur le bouton d'accueil, l'application passe en arrière-plan. Maintenant , si un appui long sur le bouton d'accueil et de tuer l'application en faisant glisser de la liste récente de l' application, aucun des événements comme onPause()
, onStop()
ou onDestroy()
s'appelle plutôt le processus est terminé. Donc, si je veux que mes services s'arrêtent, suppriment les notifications et désenregistrent les écouteurs, comment puis-je faire cela? J'ai lu pas mal d'articles et de blogs, mais je n'ai pas obtenu d'informations utiles et je n'ai trouvé aucune documentation à ce sujet. Toute aide serait appréciée. Merci d'avance.
104
Réponses:
Je viens de résoudre un problème similaire.
Voici ce que vous pouvez faire s'il s'agit simplement d'arrêter le service lorsque l'application est tuée en faisant glisser la liste des applications récentes.
Dans votre fichier Manifest, gardez le drapeau
stopWithTask
commetrue
pour le service. Comme:Mais comme vous dites que vous voulez désinscrire les auditeurs et arrêter la notification, etc., je suggérerais cette approche:
Dans votre fichier Manifest, gardez le drapeau
stopWithTask
commefalse
pour le service. Comme:Maintenant dans votre
MyService
service, remplacez la méthodeonTaskRemoved
. (Ceci ne sera déclenché que sistopWithTask
est défini surfalse
).Référez - vous à ma question pour plus de détails, qui contient également une autre partie du code.
J'espère que cela t'aides.
la source
J'ai trouvé un moyen de le faire
faire un service comme celui-ci
}
2) Enregistrez ce service dans manifest.xml
3) Ensuite, démarrez ce service sur votre activité de démarrage
Et maintenant, chaque fois que vous effacerez votre application d'Android récent, cette méthode onTaskRemoved () s'exécutera.
la source
J'ai résolu un problème similaire. Si vous voulez après avoir glissé de la tâche récente et au prochain lancement, il se comporte correctement, suivez les étapes ci-dessous: -
1) Enregistrez l'ID de processus dans la préférence partagée:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2) Lorsque l'application est lancée à partir du lanceur après avoir été effacée de la tâche récente, procédez comme suit:
la source
Lorsque vous appuyez sur Accueil -
onPause
et queonStop
votre activité est appelée, vous devez donc faire toutes les économies et le nettoyage pour le moment, car la plate-forme Android ne garantit pas davantage queonDestroy
ou toute autre méthode de cycle de vie serait invoquée, de sorte que le processus pourrait être tué sans aucune notification.la source
onPause()
etonstop()
ils ne doivent être tués que lorsque l'utilisateur quitte l'application, c'est-à-dire se déconnecter.Vous devez enregistrer vos données lors de l'
onPause()
appel de. Regardez ce diagramme du cycle de vie: Développeur AndroidVous pouvez voir qu'une application peut être tuée après
onPause()
ouonStop()
.Manipulez vos données là-bas et récupérez-les dans
onRestart()
\onCreate()
.bonne chance!
la source
Vous ne pouvez pas gérer le balayage, car le système supprime simplement votre processus de la mémoire sans appeler aucun rappel.
J'ai vérifié qu'avant que l'utilisateur appelle l'écran "Applications récentes", onPause () sera toujours appelé. Vous devez donc enregistrer toutes les données dans la méthode onPause sans vérifier isFinishing ().
Pour vérifier le bouton de retour, utilisez la méthode onBackPressed.
la source
ViewModel.onCleared () peut être utile, si le but est de libérer une ressource (peut-être un système fonctionnant ailleurs sur le réseau) lorsque l'utilisateur exécute une sortie surprise en balayant, plutôt qu'en appuyant sur le bouton "stop" ou sur le bouton. [C'est ainsi que je suis arrivé à cette question à l'origine].
L'application ne reçoit pas de notification et Activity.onDestroy () est appelé pour les changements de configuration tels que les changements d'orientation, donc la réponse n'est pas là. Mais ViewModel.onCleared est appelé lorsque l'application est balayée (ainsi que lorsque l'utilisateur se retire de l'activité). Si la ressource que vous souhaitez utiliser est associée à plusieurs activités dans la pile, vous pouvez ajouter des nombres de références ou un autre mécanisme pour décider si ViewModel.onClear doit libérer la ressource.
C'est encore une autre des nombreuses bonnes raisons d'utiliser ViewModel.
- Bob
la source
Je ne sais pas vraiment pourquoi les approches ci - dessus ne fonctionnent pas sur mon cas même je jeu
android:stopWithTask="false"
queonTaskRemoved()
pas appelé.Une autre bonne approche consisterait à utiliser
AndroidViewModel
. Celui-ci fonctionne même sur le cas où l'utilisateur quitte l'application en appuyant sur le bouton retour.Juste lié la
ViewModel
classe à votreMainActivity
puis faites votreonCleared()
rappel de tâche .Exemple:
puis liez-le à votre MainActivity:
~ Voila!
la source
Cela a fonctionné pour moi sur android 6,7,8,9.
Faites un service comme celui-ci:
2) Enregistrez ce service dans
manifest.xml
:3) Ensuite, démarrez ce service sur votre activité de démarrage
la source
Comme Bob Cram l'a mentionné dans sa réponse, la méthode onCleared () de View Model est la réponse. Cela fonctionne dans les deux cas:
Le service onTaskRemoved () fonctionnera lorsque l'utilisateur balaiera l'application de l'arrière-plan, mais ne fonctionnera pas lorsque les applications sont effacées à l'aide du bouton kill all.
Mais la méthode onCleared () de viewModel fonctionne dans les deux cas. Vous pouvez utiliser if pour arrêter tout processus en cours ou effacer une tâche sur le serveur distant.
la source