Ich erweitere die Anwendungsklasse, um mit einigen globalen Variablen zu arbeiten, die Kontext benötigen. Ich weiß, dass es in der Application-Klasse eine onCreate () -Methode gibt, die vor anderen onCreate () in Aktivitäten aufgerufen wird, aber ich würde gerne wissen, ob es in der Application-Klasse eine onDestroy () - oder eine ähnliche Methode gibt, die überschrieben werden könnte, damit ich könnten Variablen im persistenten Speicher gespeichert, die Registrierung des Listeners aufgehoben und die letzte Nachricht an den Server gesendet werden, bevor der App-Prozess beendet wird? Wenn nicht, gibt es eine andere Möglichkeit, dies zu tun?
android
android-lifecycle
Vielleicht Julius
quelle
quelle
Activity
oderService
Antworten:
Auf einem Produktionsgerät für die Anwendungsklasse gibt es keinen solchen Rückruf.
Die Dinge, die Sie tun möchten, sollten normalerweise direkt nach den Änderungen oder in
onPause()
der jeweiligen App-Komponente ausgeführt werden.quelle
In Android gibt es kein Konzept zum Schließen einer App. Der Benutzer geht einfach: Dies ist das einzige Ereignis, das Ihnen bekannt ist (
onPause()
in einer Aktivität). Sie sollten Ihre App so gestalten, dass sie zu diesem Lebenszyklus passt.Normalerweise sollten Sie alle Änderungen sofort, aber asynchron speichern, damit die Benutzeroberfläche nicht hängt. Dies ist viel besser als das Speichern von Änderungen,
onPause()
da alle Daten bereits ordnungsgemäß gespeichert wurden, wenn vor dem Anhalten der App etwas Schlimmes passiert (die App stürzt ab, der Benutzer hat keinen Akku mehr).SharedPreferences
Speichern Sie Änderungen bereits asynchron. Wenn Sie diese verwenden, haben Sie nichts anderes zu tun. Ansonsten können Sie Kotlin-Coroutinen verwenden oder wenn Sie Java verwenden, ist das gute alteAsyncTask
großartig.quelle
Zuallererst: Ich bin ein absoluter Anfänger
Ich muss Code ausführen, wenn meine App beendet wird (ja, ich weiß so etwas in Android nicht) und das funktioniert für mich in Ordnung:
-Ich habe MyApplication, die die Anwendung erweitert. Als Mitglied von MyApplication gibt es ein AtomicInteger-Feld mit dem Namen activeActivitiesNumber und eine öffentliche Getter-Methode.
-Alle Anwendungsaktivitäten erweitern MyActivy (das selbst die Aktivität erweitert)
-MyActivity überschreibt die Methoden onCreate, onResume und onStop und verfügt außerdem über ein geschütztes Feld: Protected MyAppication mAppState;
a) OnCreate(){ super.onCreate(); mAppState=this.getApplication();...} b) onResume(){ super.OnResume(); myAppState.getactiveActivitiesNumber().addAndGet(1) ....} c) onStop(){ super.onStop() if (myAppStatemyAppState.getactiveActivitiesNumber()..decrementAndGet()<1){ ...call exiting code (for instance a public method defined in MyApplication} }
Es gibt ein Problem: Wenn Sie eine Aktivität starten, die nicht zu Ihrer Anwendung gehört (z. B. eine E-Mail senden), wird die Beendigungsmethode ausgelöst.
Ein weiteres Problem (ich weiß nicht, ob es sich um ein echtes oder theoretisches Problem handelt) ist, dass es in einigen Situationen keine Garantie für die Bräune gibt. OnStop wird aufgerufen.
Ich hoffe das hilft.
quelle
Sie können außer Kraft setzen
onDestroy()
in derActivity
die die letzten in Ihrer App wird geschlossen und überprüfen , ob es die Weiterverarbeitung. In diesem Fall wird Ihr Code bei einer Gerätedrehung nicht aufgerufen. Sie sollten sich jedoch bewusst sein, dass diesonDestroy()
nicht aufgerufen wird, wenn eine App über die Home-Schaltfläche des Geräts geschlossen wird.@Override public void onDestroy(){ super.onDestroy(); if(isFinishing()){ //do your stuff here } }
quelle
Sie können
registerActivityLifecycleCallbacks()
in der Application-Klasse die folgenden Rückrufe verwenden (ich empfehle, eineAppLifecycleCallbacks
Klasse zu erstellen , die das erweitertActivityLifecycleCallbacks
):public interface ActivityLifecycleCallbacks { void onActivityCreated(Activity activity, Bundle savedInstanceState); void onActivityStarted(Activity activity); void onActivityResumed(Activity activity); void onActivityPaused(Activity activity); void onActivityStopped(Activity activity); void onActivitySaveInstanceState(Activity activity, Bundle outState); void onActivityDestroyed(Activity activity); }
quelle