Android: onDestroy () oder eine ähnliche Methode in der Anwendungsklasse

75

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?

Vielleicht Julius
quelle
Nein, tun Sie dies in den entsprechenden Methoden von ActivityoderService
Michael Butscher
12
Hab das schon gemacht. Was für ein Ärgernis. Eigentlich ist der Grund, warum ich die Anwendung erweitere, der, dass ich mit dem Android-Dienst weinen möchte ... oder vom Gebäude springen möchte :(
Vielleicht Julius

Antworten:

32

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.

Raghav Sood
quelle
8

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).

SharedPreferencesSpeichern 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 alte AsyncTaskgroßartig.

Dalmas
quelle
4

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.

absoluter Anfänger
quelle
4

Sie können außer Kraft setzen onDestroy()in der Activitydie 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 dies onDestroy()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
    }
}
dzikovskyy
quelle
2

Sie können registerActivityLifecycleCallbacks()in der Application-Klasse die folgenden Rückrufe verwenden (ich empfehle, eine AppLifecycleCallbacksKlasse zu erstellen , die das erweitert ActivityLifecycleCallbacks):

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);
}
Box
quelle