10

Normalerweise verlässt meine Anwendung durch den Aufruf:Warum wird die Anwendung manchmal bei killProcess neu gestartet?

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

führt auch ohne Zwischenfälle.

Aber ab und zu wird die Anwendung neu gestartet (nach dem Beenden!).

Die entsprechende Protokoll Schnipsel zeigt:

.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 [email protected] 
.701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003} 

Ich weiß, dass, durch das Design des Android OS, killProcess() nicht der richtige Weg ist, um eine Anwendung zu beenden. Das liegt daran, dass killProcess() den Prozess immediately stoppt, ohne irgendeinen Weg oder eine Chance zu geben, dass die App dies verhindert oder sich darauf vorbereitet.

Ich weiß, dass, wenn ich finish() aufrufen, der Anwendungsstapel nur in den Hintergrund geschoben wird (und noch im Speicher vorhanden ist). Android selbst entscheidet, wann die Anwendung geschlossen wird (d. H. Ihre Instanz aus dem Speicher entfernt) und im Allgemeinen wird dies getan, wenn die Anwendung "die älteste, die am längsten nicht verwendet wird" wird. Sein Verhalten ist tatsächlich vorhersehbarer, wenn es wirklich die last one ist.

Das Problem ist, dass finish() stoppt nur und zerstört die Aktivität, für die es aufgerufen wurde. Es stoppt nicht andere Aktivitäten, die durch die Anwendung oder andere Aktivitäten hervorgebracht werden. Also, für die Leichtigkeit des Tests & Debug während der Entwicklung, verwende ich killProcess() als bequeme Verknüpfung.

Aber jetzt sehe ich, dass dies den Nebeneffekt der Anwendung hat manchmal Neustart unmittelbar nach selbst zu töten - all innerhalb von 30 Millisekunden.

Eine einfache Lösung wäre, alle Aktivitäten der Anwendung iterieren und finish() ihnen. Aber bevor ich damit fortfahre, möchte ich verstehen, was in der Android-OS macht eine Anwendung wieder auferstehen.

Warum würde Android eine getötete Anwendung neu starten?

Und warum inkonsistent? (d. h. manchmal)

+0

Sie haben Empfänger mit Intent-Filtern gesendet, die im Manifest registriert sind? Das würde dazu führen, dass deine App startet. –

Antwort

4

Es ist ein bekannter Fehler in der Weg, um Anwendungen zum ersten Mal von dem Installateur, Web-Browser und über IDE (IntelliJ, Eclipse etc.) beginnen. Bitte versuchen Sie Ihre App zu installieren, ohne sie zu starten und dann starten Sie es aus der Liste der verfügbaren Anwendungen und sehen, ob das Problem verschwindet. Sehen Sie diese schon vor langer Zeit abgelegt Fragen im Zusammenhang mit dem Problem:

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

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

+1

Die App würde übrigens ** manchmal ** neu starten, auch wenn sie das erste mal vom Installer oder von Eclipse gestartet wird. Es wird nicht immer bei diesen Aufrufen neu gestartet. – ef2011

2

Wird Ihre App in einem oder mehreren Prozessen ausgeführt? killProcess wird einen einzelnen Prozess beenden, nicht unbedingt Ihre gesamte Anwendung. Verwenden Sie stattdessen ActivityManager#killBackgroundProcesses(String packageName).

Wenn das nicht funktioniert, sieht es so aus, als könnten diese linkshelpful sein, um das Verhalten des Systems zu erklären, wenn der Prozess beendet wird.

Übrigens, das Android-System ist, was Ihre Anwendung neu startet ... es ist in Ordnung, das Verhalten zu manipulieren (zB durch Neustarten von Apps bei Force-Close), aber Sie sollten dies nicht tun Du schiebst deine App zur Produktion.

+0

Wow. Danke für die tollen Tipps. Ich dachte immer, ich würde in einem einzigen Prozess laufen, aber lass mich das nochmal überprüfen. Ich werde aktualisieren, da ich mehr Ergebnisse habe. – ef2011

+0

OK, ich habe es überprüft und ich laufe nur in einem Prozess. Ich rufe jedoch Aktivitäten auf, die in einem anderen Prozess ausgeführt werden (z. B. Google Maps), zählt das? Ich neige dazu, Ihre Antwort zu akzeptieren, weil sie Links zu Fällen enthält, die meinen sehr ähnlich sind, mit Informationen, die erklären, was in meinem Fall passiert. Aber ich werde ein wenig warten, um zu sehen, ob jemand eine genauere Erklärung finden kann (ich bezweifle, dass das passieren wird). Vielen Dank! – ef2011

+0

** Update: ** Ich traf nur noch einen solchen Neustart Vorfall und jetzt, wo ich ein paar mehr Protokoll Anrufe an der richtigen Stelle kann ich Ihnen sagen, dass. ** 1 ** Es kommt immer auf eine völlig neue Installation (dh App Zuerst manuell über die Anwendungseinstellungen deinstallieren und dann über 'Ausführen> Ausführen (Strg + F11)'. ** 2. ** Der Neustart erstellt eine neue Instanz der Anwendung ('Activity.getApplication(). toString()'). Es ist definitiv nicht die gleiche Anwendung, die an den Anfang des Stapels gebracht wurde. Was kann ich daraus lernen? – ef2011

1

Von ADT 17.0.0 gibt es ein statisches Feld BuildConfig.DEBUG, das Ihnen beim Debuggen helfen wird. Zum Beispiel können Sie eine statische Klasse haben, die alle Instanzen von laufenden Aktivitäten enthält. Dann können Sie alle auf einmal abschließen.Ich denke, es ist besser als killProcess() ...

+0

Toller Tipp. Vielen Dank. Plus eine Verbesserung. – ef2011

+0

Ich bin froh, dass es nützlich ist. Gern geschehen :-) –

Verwandte Themen