2015-04-22 7 views
6

Ich habe eine Anwendung mit vielen Aktivitäten. Unter ihnen gibt es InitialActivity, die die Kerndaten lädt. Es ist eine Startaktivität und keine der nächsten Aktivitäten kann ohne die geladenen Daten leben.Clear-Back-Stack, wenn Anwendungsobjekt vom System getötet wird

Also starte ich die App, die InitialActivity lädt Daten, navigiert dann zu der MainActivity und dann bin ich auf der Suche nach einigen FarAwayActivity. Dann wechsle ich zu anderen Apps (einige von ihnen sind schwere Spiele) und meine Anwendung wird im Hintergrund getötet. Ich habe einen Log-Anruf in meine eingefügt und ich kann sehen, dass es wieder aufgerufen wird, wenn ich zurück zu meiner Anwendung wechseln. Ich bin mir sicher, dass die App im Hintergrund verloren geht. Aber Android bringt die allerletzte FarAwayActivity nach oben und es stürzt sofort ab, weil alle geladenen Daten Nullen sind.

Die Frage ist also: Wie kann ich der Anwendung sagen, von der InitialActivity zu starten, wenn (und nur wenn) es getötet und wiederhergestellt wird? Etwas wie "Vergiss mein Backstack", aber vermutlich automatisch im Manifest.

Ich habe schon alles von Activity tag docs gelesen und probiert, aber nichts entspricht meinen Erwartungen. Die nächste Sache ist android:clearTaskOnLaunch="true", aber es löscht alle anderen Aktivitäten auf dem Stapel, wenn die App vom Desktop neu gestartet wird (und die App wird noch nicht beendet, so dass alle Daten verfügbar sind). Um klar zu sein, ich möchte mit InitialActivity erst beginnen, nachdem die App tatsächlich getötet wurde.

+0

Haben Sie einen Rückruf für die Application-Klasse gefunden, wenn Ihr Anwendungskontext beendet wird? Soweit ich weiß, gibt es keins. Wenn es da wäre, könntest du an diesem Punkt deinen vollen Stapel löschen. es sei denn, Sie haben diesen spezifischen Rückrufpunkt nicht, müssen Sie umgehen, um über die Daten zu entscheiden. –

+0

@ AmitK.Saha: Es gibt 'Application.onLowMemory()' und 'Application.onTrimMemory()' Methoden, aber ich bezweifle, dass ich sie verwenden kann, um den Backstack zu löschen. Wie ich weiß, wird die Zurück-Stapel-Bereinigung durchgeführt, indem eine einzelne Wurzel "Aktivität" mit dem Flag "FLAG_ACTIVITY_CLEAR_TOP" gestartet wird. Es ist definitiv nicht in Ordnung, zu diesem Zeitpunkt neue Aktivitäten zu starten. – Andrew

+0

Application.onTrimMemory() und Application.onLowMemory() sind nur spezielle Ereignisrückrufe, sie werden nicht immer aufgerufen. Also können wir sie nicht für diesen Zweck verwenden. –

Antwort

0

Zuerst würde ich vorschlagen, dass Sie, anstatt es in der Anwendung zu speichern, Ihre Daten durch Intent an Ihre Aktivität übergeben könnten. Auf diese Weise werden beim Wiederherstellen der Aktivität die gespeicherte Absicht ihre Daten zurückgeben.

nun auf einen Vorschlag zu Ihrer eigentlichen Frage:

  1. Wenn Ihre Aktivität wiederhergestellt wird, werden Sie überprüfen, ob Ihre Daten in das Application-Objekt null ist
  2. wenn sie Sie dies nennen sollte:

    Intent newIntent = new Intent(FarAwayActivity.this, InitialActivity.class); 
    newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(newIntent); 
    

Nun sollte es den Stapel löschen, bis InitialActivity finden.