Was passiert eigentlich, wenn Sie eine App aus der Liste der zuletzt verwendeten Apps streichen?

147

In der letzten App-Liste in Ice Cream Sandwich wurde die Möglichkeit hinzugefügt, Apps aus der Liste zu streichen und damit dauerhaft zu verwerfen (und soweit ich weiß, handelt es sich um eine Vanille-Funktion, nicht um eine CM / Custom-ROM-Funktion). Die Dokumentation und die Plattform-Highlights scheinen nicht die Funktionsweise dieser Funktionalität zu beschreiben, aber ich bin gespannt, was das System tatsächlich tut.

Um meine Neugier zu steigern, entschied ich mich für einen kurzen Test: Ich startete Music mit einer CM9-Installation und machte dann einen Rückzieher. Ich habe dann die Liste der zuletzt verwendeten Apps überprüft und festgestellt, dass sie tatsächlich vorhanden ist (und sich im richtigen Zustand befindet, basierend auf der Miniaturansicht). Ich habe daraufhin Settings->Applicationsdie Musik-App mit Gewalt gestoppt, sie wurde jedoch immer noch in der aktuellen Liste aufgeführt, was mich zu der Annahme veranlasste, dass sie nicht mit im Hintergrund verweilenden Prozessen zusammenhängt.

Als mir klar wurde, dass Musik eine schlechte Wahl war, testete ich sie auch mit der USA Today-App. Dies zeigte im Grunde das gleiche Verhalten, und es schien, als ob es nach dem erzwungenen Stopp "neu gestartet" werden musste (was Sinn macht), obwohl die Miniaturansicht in der Liste der letzten Apps dies nicht widerspiegelte (zwischengespeichert, vermute ich?).

Was passiert auf Betriebssystemebene, wenn Sie eine App aus der aktuellen Liste streichen? Löscht es einfach die Daten der App aus dem RAM und sammelt es Müll, wodurch der gespeicherte Zustand zerstört wird?

eldarerathis
quelle

Antworten:

68

Das Entfernen von Apps aus der Liste der zuletzt verwendeten Apps ist Vanille und nicht gut dokumentiert. Dies war das Thema einer anständigen Diskussion in verschiedenen Android-Foren ... der Konsens scheint hier in einigen Kommentaren am besten beschrieben zu werden : Das Verhalten ähnelt dem Schließen einer App, ist aber nicht genau dasselbe - im Allgemeinen ( Für Apps, die keine explizite Zurück-Button-Behandlung definieren, ist dies dasselbe, als würden Sie innerhalb einer Anwendung so oft zurückschlagen, bis Sie sie verlassen.

Der Link enthält einige Details zu den Details, aber insgesamt können Sie sich vorstellen, dass die Anwendung beendet wird.

Ich glaube, dass der Dienst speziell für die Musik-App gestartet wird. Während die Aufgabe selbst (die Musik-App / Benutzeroberfläche) geschlossen wird, wird der Dienst weiterhin im Hintergrund ausgeführt, sodass Ihre Musik nicht plötzlich angehalten wird, nur weil die Aufgabe ausgeführt wird wurde aus Gründen der Speicherverwaltung gelöscht. Das hat möglicherweise Auswirkungen auf das, was Sie gesehen haben.

Austin Mills
quelle
1
Vielen Dank, dieser Link hat viele gute Diskussionen. Vielleicht haben Sie auch recht: Musik, das war vielleicht ein schlechter Test. Ich werde eine andere App ausprobieren, nur zum Spaß.
Eldarerathis
2
Ich werde das akzeptieren, da die reddit-Diskussion mir geholfen hat, einige bessere Suchbegriffe zu finden, und einige Posts von Dianne Hackborn, die ich in meiner Antwort notiert habe , scheinen dies zu bestätigen . Vielen Dank!
Eldarerathis
1
Perfekt, danke! Für mich hat mir dieser Beitrag geholfen: reddit.com/r/Android/comments/mpevh/…
Boris Strandjev
Musik-Player von Drittanbietern wie Rocket Player stoppen die Musik, wenn Sie die App aus der Liste der zuletzt verwendeten Programme streichen, auch wenn der Dienst im Hintergrund ausgeführt wird und Sie die App öffnen oder erneut im Widget spielen müssen, um die Musik zu starten.
Lucky
78

Ich habe anscheinend die magischen Suchbegriffe gefunden, die zu einigen Erklärungen von Google-Mitarbeitern geführt haben. Insbesondere habe ich einige Stellen gefunden, an denen Dianne Hackborn erklärt, was passiert, wenn Sie etwas aus der aktuellen Liste streichen. Der erste ist ein Kommentar zu einem ihrer Google+ Beiträge :

[W] Was speziell passiert, wenn Sie eine aktuelle Aufgabe wegwischen, ist: (1) Alle Hintergrund- oder leeren Prozesse der Anwendung werden abgebrochen (siehe http://developer.android.com/guide/topics/fundamentals/processes-and- threads.html # Lifecycle für das, was dies bedeutet) und (2) verwendet die neue API http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent), um dies mitzuteilen Dienste der Anwendung über die zu entfernende Aufgabe, damit sie tun kann, was sie für angemessen hält.

Sie stellt auch in einem Blog-Kommentar fest :

Tatsächlich werden durch das Entfernen eines Eintrags in den letzten Tasks alle für den Prozess vorhandenen Hintergrundprozesse beendet. Dienste werden nicht direkt gestoppt, es gibt jedoch eine API, mit der sie herausfinden können, dass die Aufgabe entfernt wurde, um zu entscheiden, ob dies bedeutet, dass sie gestoppt werden sollen. Das Entfernen von beispielsweise der letzten Aufgabe einer E-Mail-App führt nicht dazu, dass diese nicht mehr nach E-Mails sucht.

Wenn Sie eine App wirklich vollständig stoppen möchten, können Sie lange auf die zuletzt ausgeführten Aufgaben drücken, um zu den App-Informationen zu gelangen, und dort auf Stopp klicken. Zum Beenden wird die App vollständig beendet - alle Prozesse werden beendet, alle Dienste gestoppt, alle Benachrichtigungen entfernt, alle Alarme entfernt usw. Die App darf erst nach ausdrücklicher Aufforderung erneut gestartet werden.

Es sieht also so aus, als würde die Zusammenfassung so aussehen, als würde das Wischen einer App aus der Liste zuerst alle Hintergrundprozesse für die App beenden und dann onTaskRemoveddie App darüber benachrichtigen, dass die Hintergrundaufgabe entfernt wurde. An diesem Punkt scheint es an der App zu liegen, zu entscheiden, was passiert. Ich vermute, dass es technisch keine feste Regel gibt, was danach mit der App passiert.

eldarerathis
quelle
Das ist sicherlich kein offensichtliches Verhalten, sehr interessant!
Matthew Read
msgstr "töte alle Hintergrundprozesse, die für den Prozess existieren. Es wird nicht direkt dazu führen, dass Dienste gestoppt werden." Ist das noch wahr? Ich habe gestern einen Test gemacht. Gestern habe ich eine App mit einem Hintergrunddienst im Hauptprozess weggewischt. Die apps => running UI zeigte 0 Prozesse und 0 Dienste. Später habe ich dieselbe App mit einem Prozess entfernt, der in einem separaten anwendungsspezifischen Prozess ausgeführt wird. Die Apps => mit laufender Benutzeroberfläche sagten, ich hätte 0 Prozesse und 1 Dienst. Das war auf einem Moto X (2014) mit Android 4.4.4.
Steven Wexler
@StevenWexler: Es kann sein, dass der Dienst im ersten Fall von selbst beendet wurde, aber nicht im zweiten, oder dass der Hauptprozess im zweiten Szenario (aus irgendeinem Grund) feststellte, dass er den Dienst nicht stoppen wollte. Schwer mit Sicherheit zu wissen.
Eldarerathis
Der gestartete Dienst startet automatisch erneut, nachdem er aus der Liste der zuletzt verwendeten Dienste entfernt wurde. In einigen Apps wird onCreate jedoch vor onTaskRemoved und in einigen nach onTaskRemoved aufgerufen. Warum ist dieses Verhalten dann?
Umesh
21

Der Quellcode enthält einige Informationen in den Klassen com.android.internal.policy.impl.RecentApplicationsBackground und com.android.internal.policy.impl.RecentApplicationsDialog .

Wenn ich diese richtig lese, gibt es spezielle Handler zum Auswählen der Apps, aber nichts Besonderes zum Wischen, außer dass das Element durch onDetachedFromWindow()Aufrufen verborgen com.android.View.onDetachedFromWindow()und die Daten gelöscht werden. Dies würde darauf hindeuten, dass beim Wischen der App nichts Besonderes passiert, was mit der Antwort von Austin Mills übereinstimmt, da in der Liste nicht die aktive App angezeigt wird, die onPause()und andere Systemaufrufe, die beim "Beenden" einer Anwendung ausgeführt werden Schon passiert.

onik
quelle
10

Ich denke, es wird dasselbe tun wie der Zurück-Button. Bis auf eine kleine Veränderung. Es werden finish()alle Aktivitäten / Fragmente in der App angezeigt.

Habe gerade ein wenig mit einer kleinen selbstgebauten App getestet. Sie können auch testen. Hier ist meine Test-App: https://bitbucket.org/Leandros99/lifecycletest (auch als Download erhältlich. Für diejenigen, die nicht bauen können.)
In jeder Activity-Lifecycle-Methode ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) druckt die App ein Protokoll. Sie können es mit adb logcat anzeigen (Android SDK installieren, CD in Plattform-Tools in cmd / shell adb logcatspeichern und eingeben. Jetzt sehen Sie, dass die App jedes Mal die oben erwähnte Lebenszyklusmethode druckt, wenn Sie etwas wie "Zurück" oder "Start" tun. )

Ihre Frage: Wenn ich eine App aus der letzten App-Schublade wische, wird die onDestroyMethode aufgerufen. Es funktioniert fast genauso wie der Zurück-Knopf.
Hoffe ich habe ein bisschen geholfen. Wenn es Fragen gibt, frag einfach.

Leandros
quelle
3

Es schließt die App und ihre Daten, die im RAM gespeichert sind. Auf diese Weise erhalten Sie mehr RAM-Speicher, sodass Sie andere Apps ausführen können. Hintergrunddienste werden jedoch NICHT automatisch geschlossen, da die verwendende App geschlossen wird.

user3067986
quelle
1
Obwohl in der Alltagssprache geschrieben, ist dies tatsächlich eine ziemlich genaue Antwort - es erfasst die Tatsache, dass der Prozess verworfen wurde, etwas, das viele andere Antworten (die es fälschlicherweise mit dem Zurück-Button vergleichen) vermissen. Was hier jedoch fehlt, ist die Erkenntnis, dass Android ohnehin über Prozesse verfügt, die zum Abrufen von Arbeitsspeicher benötigt werden. Während also eine Speicherbereinigung durchgeführt wird, würde dies bei Bedarf automatisch geschehen.
Chris Stratton