Android zerstört Aktivitäten, beendet Prozesse

117

Hallo, ich frage mich, wie Android den Speicher verwaltet, und ich kann nirgendwo eine genaue Antwort finden. Nehmen wir an, ich habe eine Anwendung mit 5 Aktivitäten auf dem aktuellen Aktivitätsstapel (4 werden gestoppt und 1 wird fortgesetzt). Es ist kein Dienst verbunden. Ich drücke die HOME-Taste, damit alle meine Aktivitäten gestoppt werden. Ich starte eine andere speicherintensive Anwendung und der gesamte Gerätespeicher ist langsam niedrig. Und die Frage ist

... Was passiert mit meiner Bewerbung?

  1. Kann das System nur eine oder einige meiner Aktivitäten zerstören, um den Speicher wiederherzustellen?
  2. Wird das System den gesamten Prozess meiner Bewerbung beenden? Werden alle Aktivitäten schön zerstört?
  3. Was passiert, wenn ich zu meiner Bewerbung zurückkehre, wenn sie vollständig beendet wurde? Wird es von Anfang an beginnen (wie beim ersten Start) oder wird es versuchen, Aktivitäten in den vorherigen Zustand zurückzubringen / wenn ja - ist es nur die oben auf dem Stapel oder alle?

AKTUALISIEREN:

Bevor ich diese Frage stelle, habe ich einige Male den Aktivitätslebenszyklus gesehen, aber er hat keine Antworten auf meine Fragen. Ich habe einige Tests gemacht und ich habe einige Antworten. "Prozess stoppen" in DDMS war ein Hinweis zum Testen.

Ich habe die Antwort auf Frage 1 nicht getestet, aber wie der Leitfaden sagt:

Wenn eine Aktivität angehalten oder gestoppt wird, kann das System die Aktivität aus dem Speicher löschen, indem es sie entweder zum Abschluss auffordert oder einfach den Prozess beendet.

Es scheint, dass eine oder mehrere der Aktivitäten (mit der onDestroy-Methode) sanft zerstört werden können, ohne den Prozess zu beenden. Sie erhalten einfach (onCreate + Bundle), wenn Sie zu ihnen zurückkehren.

Frage 2 Antwort:

JA. Im Allgemeinen beendet das System den gesamten Prozess. Dies bedeutet, dass alle Daten einschließlich Aktivitäten und statischen Feldern zerstört werden. Dies wird NICHT gut gemacht - Sie werden für keine Ihrer angehaltenen / gestoppten Aktivitäten onDestroy oder finialize () erhalten. Aus diesem Grund wird saveInstanceState () unmittelbar vor der onPause-Methode aufgerufen. onPause ist im Grunde die letzte Methode, bei der Sie etwas speichern sollten, da Sie nach dieser Methode onStop oder onDestroy nie mehr sehen konnten. Das System kann den Prozess einfach beenden und alle Ihre Objekte zerstören, unabhängig davon, was sie enthalten und was sie tun.

Frage 3 Antwort:

Was passiert, wenn Sie zu einer getöteten Anwendung zurückkehren?

  • Vor Android 2.2 startet die Anwendung von Anfang an mit der Launcher-Aktivität.
  • Ab 2.2 stellt das System den vorherigen Anwendungsstatus wieder her. Was heißt das? Dies bedeutet, dass die letzte sichtbare Aktivität neu erstellt wird (onCreate + Bundle). Was passiert mit dem Aktivitätsstapel? Der Stapel ist in Ordnung, aber alle Aktivitäten darauf sind tot. Jeder von ihnen wird neu erstellt (onCreate + Bundle), wenn Sie mit der Schaltfläche "Zurück" darauf zurückkommen. Daran ist noch etwas:

Normalerweise löscht das System in bestimmten Situationen eine Aufgabe (entfernt alle Aktivitäten vom Stapel über der Stammaktivität), wenn der Benutzer diese Aufgabe auf dem Startbildschirm erneut auswählt. Dies erfolgt normalerweise, wenn der Benutzer die Aufgabe eine bestimmte Zeit lang nicht besucht hat, z. B. 30 Minuten.

Fazit?

  1. Denken Sie nicht, dass die Behandlung von Aktivitätsrotationsproblemen durch Android gelöst werden kann: configChanges = "Orientierung". Wenn Sie das tun, werden Sie viele andere Probleme bekommen, die Sie nicht einmal kennen.
  2. Testen Sie Ihre Anwendung mit der Schaltfläche DDMS - Prozess stoppen. Sieh dir das an
  3. Seien Sie vorsichtig, wenn Sie statische Variablen verwenden. Denken Sie nicht, dass Sie sie bei der Initialisierung in Aktivität 1 in Aktivität 2 initialisieren lassen. Der einzige sichere Ort für die Initialisierung der globalen Statik ist die Anwendungsklasse.
  4. Denken Sie daran, dass Sie möglicherweise nie onStop oder onDestroy sehen. Schließen Sie Dateien / Datenbanken und stoppen Sie Downloader in onPause. Wenn Sie möchten, dass die App etwas in BG tut, verwenden Sie den Vordergrunddienst.

Das wäre es ... Hoffe ich habe mit meinem essey geholfen :)

Kennzeichen
quelle
Kommen diese 5 Aktivitäten Ihrer Meinung nach von derselben App oder von mehreren verschiedenen Apps?
Dummköpfe
1
"Ich habe eine Anwendung mit 5 Aktivitäten auf dem aktuellen Aktivitätsstapel." Natürlich stammen alle aus meiner ein und derselben Prozessanwendung.
Mark
4
Danke, das war auch genau meine Frage ... Ihre Frage und die Antworten haben mir sehr geholfen.
craigrs84
@ Mark: Ist dieses Problem jetzt gelöst? Wie wenn es ist?
Ameer Moaaviah

Antworten:

30

Bitte schauen Sie sich zuerst Folgendes an:

img1

onPause () aufgerufen, wenn das System eine vorherige Aktivität wieder aufnehmen . Dies wird normalerweise verwendet, um nicht gespeicherte Änderungen an persistenten Daten festzuschreiben, Animationen zu stoppen und andere Dinge, die möglicherweise CPU verbrauchen usw. Die Implementierung dieser Methode muss sehr schnell erfolgen, da die nächste Aktivität erst wieder aufgenommen wird, wenn diese Methode zurückgegeben wird. Gefolgt von onResume (), wenn die Aktivität wieder in den Vordergrund zurückkehrt, oder onStop (), wenn sie für den Benutzer unsichtbar wird.

onStop () Wird aufgerufen, wenn die Aktivität für den Benutzer nicht mehr sichtbar ist, weil eine andere Aktivität wieder aufgenommen wurde und diese abdeckt. Dies kann entweder passieren, weil eine neue Aktivität gestartet wird, eine vorhandene vor diese gestellt wird oder diese zerstört wird. Gefolgt von onRestart (), wenn diese Aktivität zurückkehrt, um mit dem Benutzer zu interagieren, oder onDestroy (), wenn diese Aktivität beendet wird.

Also, wenn Sie „HOME“ Taste auf dem Gerät drücken, Ihre aktuelle Vordergrundaktivität wird auf setzen onPause()dann onStop()sollte die anderen 4 bleibenonStop()

Laut Google-Dokumenten:

  • Wenn sich eine Aktivität im Vordergrund des Bildschirms (oben im Stapel) befindet, ist sie aktiv oder wird ausgeführt.
  • Wenn eine Aktivität den Fokus verloren hat, aber immer noch sichtbar ist (dh eine neue nicht vollständige oder transparente Aktivität hat den Fokus über Ihrer Aktivität), wird sie angehalten. Eine angehaltene Aktivität ist vollständig aktiv (sie behält alle Status- und Mitgliederinformationen bei und bleibt mit dem Fenstermanager verbunden), kann jedoch vom System in Situationen mit extrem geringem Arbeitsspeicher beendet werden.
  • Wenn eine Aktivität durch eine andere Aktivität vollständig verdeckt wird, wird sie gestoppt. Es behält weiterhin alle Status- und Mitgliedsinformationen bei, ist jedoch für den Benutzer nicht mehr sichtbar, sodass sein Fenster ausgeblendet ist und vom System häufig gelöscht wird, wenn an anderer Stelle Speicher benötigt wird.
  • Wenn eine Aktivität angehalten oder gestoppt wird, kann das System die Aktivität aus dem Speicher löschen, indem es sie entweder zum Abschluss auffordert oder einfach den Prozess beendet. Wenn es dem Benutzer erneut angezeigt wird, muss es vollständig neu gestartet und in seinen vorherigen Zustand zurückversetzt werden.

Und für den Prozesslebenszyklus:

Prozesslebenszyklus 3. Eine Hintergrundaktivität (eine Aktivität, die für den Benutzer nicht sichtbar ist und angehalten wurde) ist nicht mehr kritisch, sodass das System seinen Prozess sicher abbrechen kann, um Speicher für andere Vordergrund- oder sichtbare Prozesse zurückzugewinnen. Wenn der Prozess abgebrochen werden muss und der Benutzer zur Aktivität zurück navigiert (um sie wieder auf dem Bildschirm sichtbar zu machen), wird die Methode onCreate (Bundle) mit dem zuvor in onSaveInstanceState (Bundle) bereitgestellten savedInstanceState aufgerufen kann sich in demselben Zustand neu starten, in dem der Benutzer ihn zuletzt verlassen hat.

Alle obigen Zitate stammen von: Android Developers Reference: Activity

Es wird bestätigt, dass das System nicht aktivierte Aktivitäten zerstören und Speicher recyceln kann, wenn Sie einige speicherintensive Anwendungen gestartet haben. Und Sie können isFinishing()Folgendes implementieren: in Ihrer Aktivität und dann mithilfe der Schaltfläche "Töten" in DDMS erkennen, welche Ihrer Aktivitäten vom System gelöscht werden. Aber ich denke, das System wird das älteste zuerst zerstören. Es ist jedoch nicht sinnvoll, andere Aktivitäten beizubehalten, wenn die "Startaktivität" recycelt wurde.

AKTUALISIEREN

Hier sind einige Meinungen, die ich von hier gefunden habe :

Angehaltener Zustand

Wenn eine Aktivität nicht sichtbar ist, sich aber noch im Speicher befindet, sagen wir, dass sie gestoppt ist. Gestoppte Aktivitäten könnten wieder nach vorne gebracht werden, um wieder zu einer Laufaktivität zu werden. Oder es könnte zerstört und aus dem Speicher entfernt werden.

Das System hält Aktivitäten in einem gestoppten Zustand, da es wahrscheinlich ist, dass der Benutzer bald wieder zu diesen Aktivitäten zurückkehren möchte, und ein Neustart einer gestoppten Aktivität ist weitaus billiger als das Starten einer Aktivität von Grund auf neu. Das liegt daran, dass wir bereits alle Objekte im Speicher geladen haben und einfach alles in den Vordergrund stellen müssen.

Gestoppte Aktivitäten können jederzeit aus dem Speicher entfernt werden.

Dummköpfe
quelle
4
Die Dokumentation ist zu diesem Thema ziemlich verwirrend, es kann jedoch nur ein ganzer Prozess beendet werden, nicht einzelne Komponenten (Aktivitäten, Dienste usw.). Siehe: stackoverflow.com/questions/7536988/…
greg7gkb
Diese Frage sollte mit den Informationen im Link von @ greg7gkb Kommentar aktualisiert werden, seine irreführende
Luke De Feo
1

Kann das System nur eine oder einige meiner Aktivitäten zerstören, um den Speicher wiederherzustellen?

Ja. Android beendet Aktivitäten, die im Hintergrund ausgeführt werden, wenn Speicher benötigt wird. Das Töten eines oder aller kann von bestimmten Bedingungen abhängen. Zum Beispiel kann eine angehaltene oder angehaltene Instanz dazu führen, dass Android eine Aktivität oder einen Prozess selbst beendet. Hier unter Aktivitätslebenszyklus erhalten Sie die folgenden Punkte. Ich empfehle Ihnen, diese Seite vollständig durchzugehen. Es wird definitiv Ihre Zweifel klären.

Wenn eine Aktivität den Fokus verloren hat, aber immer noch sichtbar ist (dh eine neue nicht vollständige oder transparente Aktivität hat den Fokus über Ihrer Aktivität), wird sie angehalten. Eine angehaltene Aktivität ist vollständig aktiv (sie behält alle Status- und Mitgliederinformationen bei und bleibt mit dem Fenstermanager verbunden), kann jedoch vom System in Situationen mit extrem geringem Arbeitsspeicher beendet werden.

Wenn eine Aktivität durch eine andere Aktivität vollständig verdeckt wird, wird sie gestoppt. Es behält weiterhin alle Status- und Mitgliedsinformationen bei, ist jedoch für den Benutzer nicht mehr sichtbar, sodass sein Fenster ausgeblendet ist und vom System häufig gelöscht wird, wenn an anderer Stelle Speicher benötigt wird.

Wenn eine Aktivität angehalten oder gestoppt wird, kann das System die Aktivität aus dem Speicher löschen, indem es sie entweder zum Abschluss auffordert oder einfach den Prozess beendet. Wenn es dem Benutzer erneut angezeigt wird, muss es vollständig neu gestartet und in seinen vorherigen Zustand zurückversetzt werden.


Wird das System den gesamten Prozess meiner Bewerbung beenden? Werden alle Aktivitäten schön zerstört?

Die Aktivität bezieht sich auf eine Person, während sich der Prozess auf eine Gruppe von Aktivitäten bezieht. Schauen Sie sich den dritten Punkt oben noch einmal an, er beendet den Prozess wie erwähnt.


Was passiert, wenn ich zu meiner Bewerbung zurückkehre, wenn sie vollständig beendet wurde?

Es ist ähnlich wie ein Neustart. Wieder gibt Ihnen der dritte Punkt einige Antworten wieWhen it is displayed again to the user, it must be completely restarted and restored to its previous state

Weitere Informationen zu speicherbezogenen Themen finden Sie hier .

Bearbeiten:
Alle Aktivitäten in einer Anwendung werden in einem einzigen Prozess ausgeführt. Wenn also ein Prozess beendet wird, werden alle Aktivitäten, egal ob 5 oder 10, beendet, dh neu gestartet. Durch einen Neustart wird Ihre Anwendung von einem Anfang ohne gespeicherte Zustände gestartet.

Vinay
quelle
2
Ich habe den Aktivitätslebenszyklus mindestens fünf Mal gesehen, aber er beantwortet meine Fragen nicht. Was Sie gesagt haben, würde bedeuten, wenn mein App-Prozess beendet wird - wenn ich zur App zurückkehre, wird der vorherige Zustand wiederhergestellt. Also, als ich 5 Aktivitäten gestoppt hatte ... sind sie alle gestorben (onDestroy aufgerufen), als der Prozess beendet wurde? Als ich zu meiner App zurückkam, wurden alle Aktivitäten wiederhergestellt (onCreate + Bundle) oder nur die oben auf dem Stapel (für den Benutzer sichtbar)?
Mark
1
Alle Aktivitäten in einer Anwendung werden in einem einzigen Prozess ausgeführt. Wenn also ein Prozess beendet wird, werden alle Aktivitäten, egal ob 5 oder 10, beendet, dh neu gestartet. Ein Neustart führt dazu, dass Ihre Anwendung von einem Anfang ohne gespeicherte Zustände startet.
Vinay
1
Fast wahr, aber nicht für 2.2 und höher. Siehe mein UPDATE oben auf der Seite.
Mark
1
Nein, das ist nicht wahr und war noch nie wahr. Es ist verwirrend basierend auf den Dokumenten, aber siehe: stackoverflow.com/questions/7536988/…
greg7gkb
2
@JJPA Android kann keine einzelnen Aktivitäten zerstören, um Speicher zurückzugewinnen, sondern nur Prozesse. Siehe diese Antwort von Dianne Hackbor, Mitglied des Android-Kernteams, das an der Implementierung des "Out of Memory Killer" beteiligt ist: stackoverflow.com/a/7576275/1290264 .
Bcorso