Setzen von Flag in onSaveInstanceState (), um den Exit-Typ in onDestroy () zu bestimmen

8

Für Online-Spiele wäre es toll zu wissen, ob ein Android Activity 's onDestroy () nur aufgerufen wird, weil Android es neu erstellen wird (zB Geräte-Rotation) oder wenn der Benutzer sich entscheidet, das Spiel zu beenden .

Mein Plan war es, ein Flag in Activity 's onSaveInstanceState() zu setzen, wenn Android wahrscheinlich Activity neu erstellt:

%Vor%

Wenn Sie dies getan haben, können Sie mDestroyedForReCreation in onDestroy() :

überprüfen
  • Wenn das Flag gesetzt ist (true), darf der Benutzer nicht aus dem Online-Spiel entlassen werden.
  • Wenn das Flag nicht gesetzt ist (false), lehnen Sie den Benutzer vom Online-Spiel ab, da er das Spiel freiwillig verlassen hat.

Ist das ein richtiger Ansatz? Und wenn ja, wird es empfohlen oder gibt es eine bessere Lösung? Ich hoffe es, weil mir diese Lösung nicht wirklich gefällt ...

    
caw 21.01.2013, 05:06
quelle

6 Antworten

5

Ich schlage vor, dass Sie eine solche Spiellogik aus dem Lebenszyklus der Aktivität entfernen. Erstellen Sie einen Service. Wenn niemand gebunden ist - alle Aktivitäten sind tot. Ist jemand gebunden - weiterarbeiten.

Wenn Sie keinen Service erstellen möchten, können Sie onRetainNonConfigurationInstance Methode. Hier ist ein Beispiel .

Sie sollten onRetainNonConfigurationInstance verwenden, da es vom System aufgerufen wird, wenn eine Aktivität aufgrund einer Konfigurationsänderung zerstört wird, wenn bekannt ist, dass eine neue Instanz für die neue Konfiguration sofort erstellt wird ( sofort ) . onSaveInstanceState aufgerufen, wenn Android Aktivität zu töten und vielleicht manchmal wiederherstellen oder nicht).

    
Leonidos 23.01.2013, 10:06
quelle
3

Sie können einfach Neustarts bei der Rotation vermeiden, indem Sie diese Konfigurationsänderungen per Code bearbeiten. Sie können dies in Ihrem Manifest.xml wie folgt tun:

%Vor%

So wird Ihre App bei der Rotation und beim Öffnen / Schließen der Tastatur nicht neu gestartet.

Ich denke, diese Lösung ist viel einfacher.

In diesem Fall müssen Sie onSaveInstanceState() nicht zum Beenden behandeln, außer Sie starten eine andere Absicht / Aktivität, in der Sie Ihren Spielstatus speichern müssen. Beachten Sie, dass ein Telefonanruf den Code ebenfalls unterbricht. Ich kenne einige Spiele mit lustigen Bugs, bei denen die Zeit zurückgesetzt wird, aber nicht das Ergebnis.

    
rekire 23.01.2013 12:44
quelle
2

Ich würde das Ganze einfach vereinfachen und ein Flag setzen, das beim Verlassen des Spiels umgeschaltet wird, etwa wie folgt:

%Vor%

(Oder Sie benötigen möglicherweise mehr Logik, wenn Sie mehrere Aktivitäten zerstören müssen)

Dann überprüfen Sie das Flag in onDestroy ().

Welche Logik Sie auch bei Konfigurationsänderungen (Rotation usw.) haben, hat nichts mit der Flag für den Spielausgang zu tun.

Denken Sie auch daran, dass das Standardverhalten des "Zurück" -Knopfs darin besteht, die aktuelle Aktivität zu beenden (wenn nichts anderes darüber liegt) - das wird in diesem Fall nicht als "Exit" gezählt. Das Verhalten hier liegt an dir.

    
SirKnigget 29.01.2013 13:14
quelle
2

Activity hat eine Methode namens isFinishing () ist wahrscheinlich das, was Sie suchen.

Siehe: Ссылка

    
cottonBallPaws 29.01.2013 20:39
quelle
1

Wenn Sie dies wissen müssen, sollten Sie sich selbst damit befassen, die Rotation und andere konfigurationsveränderte Ereignisse selbst zu behandeln, anstatt es dem System zu überlassen. Wenn Sie in Ihrem Manifest festlegen, dass die Aktivität configChanges verarbeitet, wird onConfigChange beim Drehen aufgerufen, anstatt die Aktivität zu zerstören und neu zu erstellen. Eine große Anzahl von Apps tun dies, die Zerstörung und Neuerstellung auf Rotation, die Android tut, ist absolut zurückgeblieben.

    
Gabe Sechan 21.01.2013 05:14
quelle
0

onRestoreInstanceState () wird aufgerufen, wenn beim Wiederherstellen / Wiederherstellen der Aktivität, wenn sie von Android getötet wurde, sie ihren UI-Status der Aktivität speichert und einige Werte, die Sie onSaveInstanceState überschreiben können Da onSaveInstanceState () jedoch nicht garantiert aufgerufen wird, sollten Sie nur den vorübergehenden Status der Aktivität (den Zustand der UI) aufzeichnen. Sie sollten sie niemals zum Speichern persistenter Daten verwenden. Stattdessen sollten Sie onPause () verwenden, um persistente Daten (z. B. Daten, die in einer Datenbank gespeichert werden sollen) zu speichern, wenn der Benutzer die Aktivität verlässt. Auch onRestart wird nach onStop () aufgerufen, wenn die aktuelle Aktivität dem Benutzer erneut angezeigt wird. Wahrscheinlich können Sie Ihren Zustand in onPause speichern / wenn onRestart aufgerufen wird, ist es so, als würde es wieder angezeigt werden, während wenn onCreate ohne onRestart aufgerufen wird, wird es neu erstellt. Eine andere Lösung besteht darin, die Methode singleInstance und override onNewIntent zu verwenden, die aufgerufen wird, wenn die Aktivität nicht zerstört, sondern wie bei einer neuen Absicht neu gestartet wird.

    
android2013 25.01.2013 10:36
quelle

Tags und Links