Pourquoi l'application pourrait-elle recommencer sur killProcess?

Habituellement, en sortant de ma demande en appelant:

android.os.Process.killProcess(android.os.Process.myPid()); 

Fonctionne bien sans incident.

Mais de temps en temps, l'application redémarre (après la sortie!).

L'extrait de journal pertinent s'affiche:

 .631: I/Process(15495): Sending signal. PID: 15495 SIG: 9 .641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18 .651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died. .651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false} .661: I/AudioService(164): AudioFocus abandonAudioFocus() from android.media.AudioManager@460b2b98 .701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003} 

Je sais que, grâce à la conception du système d'exploitation Android, killProcess () n'est pas la bonne façon de mettre fin à une application. C'est parce que killProcess () arrête le processus immédiatement sans donner aucun moyen ou chance pour l'application de l'empêcher ou de se préparer à cela.

Je sais que lorsque j'appelle finish () , la pile d'application est simplement poussée vers l'arrière-plan (et existe toujours dans la mémoire). L'Android lui-même décide quand fermer l'application (c.-à-d. Supprimer son instance de la mémoire) et, généralement, cela se fait lorsque l'application devient «la plus ancienne non utilisée pour la plus longue durée». Son comportement est en fait plus prévisible s'il est vraiment le dernier .

Le problème est que la finition () arrête et détruit l'activité pour laquelle il s'appelait. Cela n'arrête pas d'autres activités engendrées par la demande ou d'autres activités. Donc, pour faciliter le test et le débogage pendant le développement, j'utilise killProcess () comme raccourci pratique.

Mais maintenant, je vois que cela a l'effet secondaire de l'application, parfois en train de redémarrer immédiatement après s'être suicidé – tous dans les 30 millisecondes .

Une solution directe serait d'itérer dans toutes les activités de l'application et de les finir () . Mais avant de procéder à cela, je suis désolée de comprendre ce que sur le système d'exploitation Android fait ressusciter une application.

Pourquoi Android devrait-il redémarrer l'application?

Et pourquoi inconséquemment? (C.-à-d. Parfois )

  • OnStart of new Activity s'appelle avant le début de la page de parent
  • Devrais-je fermer manuellement HandlerThreads créé par ma application lors de la destruction de l'activité?
  • 4 Solutions collect form web for “Pourquoi l'application pourrait-elle recommencer sur killProcess?”

    Il existe un bug connu dans la façon dont les applications commencent la première fois depuis l'installateur, le navigateur Web et via IDE (IntelliJ, Eclipse, etc.). Essayez d'installer votre application sans le démarrer , puis démarrez-le à partir de la liste des applications disponibles et vérifiez si le problème disparaît. Voyez ces questions déposées depuis longtemps liées au problème:

    http://code.google.com/p/android/issues/detail?id=2373

    http://code.google.com/p/android/issues/detail?id=26658

    Votre application fonctionne-t-elle en un processus unique ou multiple? killProcess va tuer un processus unique, pas nécessairement toute votre application. Essayez d'utiliser ActivityManager#killBackgroundProcesses(String packageName) place.

    Si cela ne fonctionne pas, il semble que ces liens pourraient être utiles pour expliquer le comportement du système lorsque le processus est tué.

    En passant, le système Android est ce qui redémarre votre application … il est judicieux de manipuler son comportement (c'est-à-dire en empêchant les applications de redémarrer sur la fermeture de la force) à des fins de développement, mais vous ne devriez pas le faire lorsque vous appuyez sur votre application À la production.

    Depuis ADT 17.0.0 , il existe un champ statique BuildConfig.DEBUG qui vous aidera à déboguer. Par exemple, vous pouvez avoir une classe statique qui contient toutes les instances d'activités en cours d'exécution. Ensuite, vous pouvez les finir tous à la fois. Je pense que c'est mieux que killProcess()

    Veuillez suivre le lien avec la réponse attendue de votre question. Android.os.Process.killProcess (pid) a redémarré les processus

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.