Android: onDestroy() oder eine ähnliche Methode in der Application-Klasse

Lesezeit: 4 Minuten

Ich erweitere die Application-Klasse, um mit einigen globalen Variablen zu arbeiten, die einen Kontext benötigen. Ich weiß, dass es eine onCreate()-Methode in der Application-Klasse gibt, die vor allen anderen onCreate() in Aktivitäten aufgerufen wird, aber Ich würde gerne wissen, ob es onDestroy() oder eine ähnliche Methode in der Application-Klasse gibt, die überschrieben werden könnte damit ich Variablen im persistenten Speicher speichern, den Listener abmelden und die letzte Nachricht an den Server senden kann, bevor der App-Prozess beendet wird? Wenn nicht, gibt es eine andere Möglichkeit, dies zu tun?

  • Nein, tun Sie dies in den entsprechenden Methoden Activity oder Service

    – Michael Butscher

    24. Juni 2013 um 14:45 Uhr

  • Habe das schon gemacht. Was für ein Ärgernis. Eigentlich ist der eigentliche Grund, warum ich die Anwendung erweitere, der, dass ich bei der Verwendung des Android-Dienstes am liebsten weinen möchte … oder vom Gebäude springen 🙁

    – Vielleicht Julius

    24. Juni 2013 um 14:55 Uhr

Es gibt keinen solchen Rückruf auf einem Produktionsgerät für die Anwendungsklasse.

Die Dinge, die Sie tun möchten, sollten in der Regel direkt nach den Änderungen oder in der erledigt werden onPause() der jeweiligen App-Komponente.

Benutzer-Avatar
Dalmas

In Android gibt es kein Konzept zum Schließen einer App. Der Benutzer geht einfach: Dies ist das einzige Ereignis, das Sie bemerken werden (onPause() bei einer Aktivität). Sie sollten Ihre App so gestalten, dass sie zu diesem Lebenszyklus passt.

In der Regel sollten Sie alle Änderungen sofort, aber asynchron speichern, damit die Benutzeroberfläche nicht hängen bleibt. Das ist viel besser, als Änderungen zu speichern onPause() denn wenn etwas Schlimmes passiert, bevor die App pausiert wird (die App stürzt ab, der Akku des Benutzers ist leer), wurden alle Daten bereits ordnungsgemäß gespeichert.

SharedPreferences Änderungen bereits asynchron speichern, wenn Sie das also verwenden, müssen Sie nichts weiter tun. Ansonsten können Sie Kotlin-Coroutinen verwenden oder wenn Sie Java verwenden, das gute alte AsyncTask ist toll.

  • Wenn Sie WhatsApp verwenden, wissen Sie, dass sie unsere zuletzt gesehenen Daten speichern. Wie können sie das tun, wenn sie nicht wissen können, wann die Anwendung geschlossen wird?

    – Sourav Kannantha B

    13. April 2021 um 12:26 Uhr

Vorweg: Ich bin absoluter Anfänger

Ich muss einen Code ausführen, wenn meine App beendet wird (ja, ich kenne so etwas in Android nicht) und das funktioniert für mich in Ordnung:

-Ich habe MyApplication, die Application erweitert. Als Mitglied von MyApplication gibt es ein AtomicInteger-Feld namens activeActivitiesNumber und eine öffentliche Getter-Methode.

-Alle Anwendungsaktivitäten erweitern MyActivy (das selbst Activity erweitert)

-MyActivity überschreibt die Methoden onCreate, onResume und onStop und hat auch ein geschütztes Feld: Protected MyApplication 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 hat ein Problem: Wenn Sie eine Aktivität starten, die nicht zu Ihrer Anwendung gehört (z. B. eine E-Mail senden), wird die Exiting-Methode ausgelöst.

Ein weiteres Problem (ich weiß nicht, ob es ein echtes oder theoretisches ist) ist, dass es keine Garantie dafür gibt, dass in manchen Situationen onStop aufgerufen wird.

Ich hoffe das hilft.

Sie können überschreiben onDestroy() in dem Activity welches das letzte sein wird, das in deiner App geschlossen wird, und überprüfe, ob es fertig ist. In diesem Fall wird Ihr Code bei einer Geräterotation nicht aufgerufen. Aber das sollte dir bewusst sein onDestroy() wird nicht aufgerufen, wenn eine App über die Home-Taste des Geräts geschlossen wird.

@Override
public void onDestroy(){
    super.onDestroy();
    if(isFinishing()){
        //do your stuff here
    }
}

Benutzer-Avatar
Kasten

Sie können verwenden registerActivityLifecycleCallbacks() in der Application-Klasse mit den folgenden Rückrufen (ich empfehle, eine AppLifecycleCallbacks Klasse, die die 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);
}

Benutzer-Avatar
Vodet

Mit dem ist das jetzt möglich DefaultLifecycleObserver Ein Beispiel habe ich unten aufgeführt

public class YourApplication extends Application implements DefaultLifecycleObserver {

@Override
public void onCreate() {
//Do your onCreate things
}

@Override
public void onStop(@NonNull @NotNull LifecycleOwner owner) {
    //Do your onStop things
}

@Override
public void onDestroy(@NonNull @NotNull LifecycleOwner owner) {
    //Do your onDestroy things
}
}

Sie können feststellen, dass onStart onCreate onDestroy onResume onPause onStop das sehr gut funktioniert

1282540cookie-checkAndroid: onDestroy() oder eine ähnliche Methode in der Application-Klasse

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy