Wenn meine App ausgeführt wird und ich die Home-Taste drücke, wird die App im Hintergrund angezeigt. Wenn nun ein langes Drücken der Taste nach Hause und die App töten , indem sie aus der letzten App - Liste klauen, keines der Ereignisse mag onPause()
, onStop()
oder onDestroy()
wird aufgerufen , sondern der Prozess beendet wird. Wie kann ich das tun, wenn ich möchte, dass meine Dienste gestoppt werden, Benachrichtigungen beendet werden und die Registrierung von Listenern aufgehoben wird? Ich habe einige Artikel und Blogs gelesen, aber keine nützlichen Informationen erhalten und keine Dokumentation dazu gefunden. Jede Hilfe wäre dankbar. Danke im Voraus.
104
Antworten:
Ich habe gerade ein ähnliches Problem gelöst.
Folgendes können Sie tun, wenn Sie den Dienst nur beenden möchten, wenn die Anwendung durch Wischen aus der Liste der zuletzt verwendeten Apps beendet wird.
In Ihrer Manifest - Datei, halte Flagge
stopWithTask
wietrue
für Service. Mögen:Aber wenn Sie sagen, Sie möchten die Registrierung von Hörern aufheben und die Benachrichtigung usw. beenden, würde ich diesen Ansatz vorschlagen:
In Ihrer Manifest - Datei, halte Flagge
stopWithTask
wiefalse
für Service. Mögen:MyService
Überschreiben Sie jetzt in Ihrem Dienst die MethodeonTaskRemoved
. (Dies wird nur ausgelöst, wenn eingestelltstopWithTask
istfalse
).Weitere Informationen finden Sie in meiner Frage , die auch einen anderen Teil des Codes enthält.
Hoffe das hilft.
quelle
Ich habe einen Weg gefunden, dies zu tun
mache einen Dienst wie diesen
}}
2) Registrieren Sie diesen Dienst in manifest.xml
3) Starten Sie diesen Dienst dann bei Ihrer Splash-Aktivität
Und jetzt, wann immer Sie Ihre App von Android löschen, wird diese Methode onTaskRemoved () ausgeführt.
quelle
Ich habe ein ähnliches Problem gelöst. Wenn Sie nach dem Wischen von der letzten Aufgabe und beim nächsten Start ein ordnungsgemäßes Verhalten wünschen, führen Sie die folgenden Schritte aus: -
1) Speichern Sie die Prozess-ID in einer gemeinsamen Einstellung:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2) Wenn die Anwendung vom Launcher aus gestartet wird, nachdem die letzte Aufgabe gelöscht wurde, gehen Sie wie folgt vor:
quelle
Wenn Sie nach Hause drücken -
onPause
undonStop
Ihre Aktivität aufgerufen wird, müssen Sie zu diesem Zeitpunkt alle Einsparungen und Bereinigungen vornehmen, da die Android-Plattform nicht weiter garantiert, dassonDestroy
oder eine andere Lebenszyklusmethode aufgerufen wird, sodass der Prozess abgebrochen werden kann ohne Benachrichtigung.quelle
onPause()
undonstop()
sie müssen nur beendet werden, wenn der Benutzer die App beendet, dh sich abmeldet.Sie müssen Ihre Daten speichern, wenn on
onPause()
aufgerufen wird. Schauen Sie sich dieses Lebenszyklusdiagramm an: Android DeveloperSie können sehen, dass eine App nach
onPause()
oder getötet werden kannonStop()
.Behandeln Sie Ihre Daten dort und stellen Sie sie in
onRestart()
\ wieder heronCreate()
.Viel Glück!
quelle
Sie können Swipe nicht verarbeiten, da das System Ihren Prozess nur aus dem Speicher entfernt, ohne einen Rückruf aufzurufen.
Ich habe überprüft, dass onPause () immer aufgerufen wird, bevor der Benutzer den Bildschirm "Letzte Apps" aufruft. Sie müssen also alle Daten in der onPause-Methode speichern, ohne isFinishing () zu überprüfen.
Verwenden Sie die onBackPressed-Methode, um die Schaltfläche "Zurück" zu aktivieren.
quelle
ViewModel.onCleared () kann nützlich sein, wenn das Ziel darin besteht, eine Ressource (möglicherweise ein System, das an einer anderen Stelle im Netzwerk ausgeführt wird) freizugeben, wenn der Benutzer einen Überraschungsexit durch Wischen ausführt, anstatt durch Drücken der Taste "Stopp" oder "Stopp". [So bin ich ursprünglich zu dieser Frage gekommen].
Die Anwendung erhält keine Benachrichtigung und Activity.onDestroy () wird für Konfigurationsänderungen wie z. B. Änderungen der Ausrichtung aufgerufen, sodass die Antwort nicht vorhanden ist. ViewModel.onCleared wird jedoch aufgerufen, wenn die Anwendung entfernt wird (sowie wenn der Benutzer die Aktivität beendet). Wenn die Ressource, die Sie verwenden möchten, mehr als einer Aktivität im Stapel zugeordnet ist, können Sie Referenzzähler oder einen anderen Mechanismus hinzufügen, um zu entscheiden, ob ViewModel.onClear die Ressource freigeben soll.
Dies ist ein weiterer von vielen guten Gründen, ViewModel zu verwenden.
- Bob
quelle
Ich weiß nicht wirklich, warum die oben genannten Ansätze bei meinem Fall nicht funktionieren, obwohl ich
android:stopWithTask="false"
dasonTaskRemoved()
nicht aufgerufen habe.Ein weiterer guter Ansatz wäre die Verwendung
AndroidViewModel
. Dieser funktioniert sogar in dem Fall, in dem der Benutzer die Anwendung durch Drücken der Zurück-Taste verlässt.Binden Sie einfach die
ViewModel
Klasse an IhreMainActivity
und erledigen Sie dann Ihre AufgabeonCleared()
.Beispiel:
Binden Sie es dann an Ihre MainActivity:
~ Voila!
quelle
Das hat bei mir auf Android 6,7,8,9 funktioniert.
Machen Sie einen Dienst wie folgt:
2) Registrieren Sie diesen Service in
manifest.xml
:3) Starten Sie diesen Dienst dann bei Ihrer Splash-Aktivität
quelle
Wie Bob Cram in seiner Antwort erwähnt hat, ist die onCleared () -Methode von View Model die Antwort. Es funktioniert in beiden Fällen:
OnTaskRemoved () des Dienstes funktioniert, wenn der Benutzer die App aus dem Hintergrund wischt, funktioniert jedoch nicht, wenn die Apps mit der Schaltfläche Alle beenden gelöscht werden.
Die onCleared () -Methode von viewModel funktioniert jedoch in beiden Fällen. Sie können if verwenden, um einen laufenden Prozess zu stoppen oder eine Aufgabe auf dem Remote-Server zu löschen.
quelle