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?
- Kann das System nur eine oder einige meiner Aktivitäten zerstören, um den Speicher wiederherzustellen?
- Wird das System den gesamten Prozess meiner Bewerbung beenden? Werden alle Aktivitäten schön zerstört?
- 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?
- 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.
- Testen Sie Ihre Anwendung mit der Schaltfläche DDMS - Prozess stoppen. Sieh dir das an
- 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.
- 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 :)
quelle
Antworten:
Bitte schauen Sie sich zuerst Folgendes an:
Also, wenn Sie „HOME“ Taste auf dem Gerät drücken, Ihre aktuelle Vordergrundaktivität wird auf setzen
onPause()
dannonStop()
sollte die anderen 4 bleibenonStop()
Laut Google-Dokumenten:
Und für den Prozesslebenszyklus:
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 :
quelle
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.
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.
Es ist ähnlich wie ein Neustart. Wieder gibt Ihnen der dritte Punkt einige Antworten wie
When 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.
quelle