2010-01-13 4 views
13

In meinem Android-App, Ich habe eine Haupttätigkeit, die als Einstiegspunkt zu meiner Anwendung dient, die in meiner Manifest-Datei wie folgt konfiguriert ist:Halte android app Zustand alwaysRetainTaskState und lauchMode

<activity android:name=".Main" 
       android:label="@string/app_name" 
       android:screenOrientation="portrait" 
       android:alwaysRetainTaskState="true" 
       android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Also für Bei einem bestimmten Anwendungsfall startet ein Benutzer die App vom Startbildschirm aus, indem er auf das Symbol im Anwendungsstartfenster klickt. Nach dem Start der App navigiert der Benutzer von der Hauptaktivität zu Aktivität A und schließlich zu Aktivität B. An dieser Stelle entscheidet der Benutzer, sein Facebook zu überprüfen, so dass er auf die Home-Schaltfläche klickt, um meine App in den Hintergrund zu stellen, und startet die Facebook App

Nach der Überprüfung ihrer Facebook möchte der Benutzer zu meiner App zurückkehren, so dass sie den Home-Taste drücken, und starten Sie die Anwendung aus dem Application Launcher (genau wie sie es beim ersten Mal getan hatte).

Wenn ein Benutzer zu meiner App zurückkehrt, möchte ich, dass die App zur letzten Aktivität des Benutzers zurückkehrt, als die App in den Hintergrund versetzt wurde. In diesem Fall handelt es sich um Aktivität B. In der Manifestdatei habe ich Setzen Sie alwaysRetainTaskState = true, um sicherzustellen, dass das Betriebssystem die App-Aktivitäten nicht beendet.

Nun zu meiner Frage: Wie bekomme ich das oben beschriebene Verhalten? Immer wenn ich auf das Symbol meiner App klicke, beginnt es immer bei der Hauptaktivität, egal was passiert. Ich denke, das liegt am Attribut category.LAUNCHER. Ich habe versucht Android: launchMode = singleTask, aber es hat keinen Unterschied gemacht; Es beginnt immer am Main.

Wenn jemand Absicht Filter, Start-Modi und Aufgaben klären könnte, wäre das toll!

+0

Ich denke, diese Frage zu alt ist, und sollte accrding zu http://developer.android.com aktualisiert werden /guide/components/tasks-and-back-stack.html –

Antwort

3

Ich löste das, indem ich das screenless DispatcherActivity hinzufügte und es zum Standard eins machte (indem ich den gleichen Absichtfilter verwendete). In der Methode onCreate erstellen Sie die Absicht und rufen sie ab, basierend auf einem angemessenen Standard (z. B. Ihre Hauptaktivität) ODER basierend auf einem gespeicherten Token, das angibt, welche Aktivität gestartet werden soll. Dieses Token wird in der Methode onStop jeder Aktivität gespeichert/aktualisiert, die Sie beim Neustart aufrufen möchten. Sie können dieses Token in den Einstellungen speichern.

Die rationale hier ist, dass letzte Aktivität, die sichtbar war, OnStop-Methode ausgeführt wird, wenn unterbrochen.

Vorsicht hier: Ich habe dieses Muster implementiert und es funktionierte einigermaßen gut. Aber es scheint nicht so gut mit der Geschichte zu spielen und schließlich gab ich einfach auf und riss diesen Code raus. Niemand hat sich bisher beschwert.

+0

das ist eine intuitive Lösung. Wenn Sie zu meinem Beispiel zurückkehren, wenn ich ein Token in OnStop von Aktivität B gespeichert habe und in DispatcherActivity nach diesem Token gesucht und die Aktivität B gestartet habe, wenn das Token gesetzt ist, würde dies Sie zurück zur letzten Aktivität bringen, würde aber nicht Sie müssen ein Token für Aktivitäten speichern, die der Benutzer vor B ebenfalls besucht hat (Aktivität A in meinem Beispiel)? – jlim

+0

Überraschend nein. Ich denke, aufgrund der Zwischenspeicherung von Informationen wird Ihre Aktivität B nicht von Grund auf neu erstellt und behält ihre Geschichte bei. Wenn Sie zum Beispiel die Zurück-Taste drücken, weiß es, dass Sie zur Anrufer-Aktivität gehen müssen. Wenn Sie also die Aktivität vom Dispatcher aufrufen, müssen Sie auch finish() ausführen, damit der Dispatcher nicht erneut aufgerufen wird, wenn Sie auf die Schaltfläche – Bostone

+0

klicken. Ich habe das Gefühl, dass es einen besseren Weg gibt, dies zu tun. Das Programm-Umschalter-Menü (lange drücken Sie die Home-Taste) behandelt es einfach gut .. Ich sehe nicht, warum wir dieses Verhalten nicht in der Anwendung Tray kopieren können. – jlim

8

FYI singleTask ist nicht das, was Sie wollen, da sie eine neue Aufgabe beginnt:

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

Wie Sie starten Aktivität B? Irgendwelche Nicht-Standard-Startmodi oder Intent-Flags?

+0

Nein Ich habe keine Absicht Filter für B eingestellt, und ich mache einfach eine startActivity (neue Absicht (this, B.class)); – jlim

+2

ja ich weiß nicht warum so viele SO Antworten auf Fragen wie diese (app resuming etc) empfehlen singleTask - es ist einfach nicht das, was Sie wollen ... –

+0

Sie sind absolut richtig! In meinem Fall war SingleTask die Ursache für dieses Problem. – Apfelsaft

7

Für jeden, der mit ähnlichen Problemen hierher kommt, habe ich etwas seltsames gefunden, das vielleicht das ist, was Sie sehen ... vielleicht.

Angenommen, ich habe eine App mit den Aktivitäten A -> B -> C usw. Ich hatte Probleme mit meiner App immer wieder zu "A", wenn es aus der App-Liste aka Launcher gestartet wurde. Das Fortsetzen von dem Bildschirm "Resents" (langes Drücken von zu Hause) würde jedoch ein korrektes Wiederaufnahmeverhalten zeigen (wie erwartet zu B oder C zurückkehren). Mein Manifest war nichts besonderes, ich habe immerRetainTaskState = "true" in meiner Root-Aktivität gesetzt, und der Startmodus ist Standard (Standard).

Ich habe die apk auf meinem Handy über eine Website geladen. Nach dem Herunterladen und Installieren, würde ich "Open" drücken, um die App sofort zu starten. Aus irgendeinem Grund (nach der Deinstallation der App) habe ich müde Download erneut, installieren, aber dann drückte die Schaltfläche "Fertig" statt. Dann hat das Starten der App aus der Launcher-/"all apps" -Liste das gleiche Resume-Verhalten wie das Wiederaufnehmen von recents - mit anderen Worten, meine Probleme wurden irgendwie aufgrund des Installationsprozesses verursacht, wenn auf "Öffnen" anstelle von "Fertig" geklickt wurde.

Ich überprüfte diese „Lösung“ auf API10 (2.3.5) und API15 (4.0.4)

+0

Haben Sie jemals eine Lösung dafür gefunden ????? –

+4

Nein. Hier gibt es einen Fehler (erstellt von jemand anderem): https://code.google.com/p/android/issues/detail?id=38194&q=app+resume+open+done&colspec=ID+Type + Status + Besitzer + Zusammenfassung + Sterne Ich finde es schwer zu verstehen, wie nicht mehr Menschen von diesem Verhalten genervt sind: / –