Android, welche Intent-Flags werden für Aktivitäten empfohlen, die von Notifications gestartet werden

8

Ich stoße auf ein seltsames Problem mit einer App, die mehrere Aktivitäten hat. Ich habe eine Screen Manager-Klasse, die an einen Dienst gebunden ist. Der Dienst fragt einen Server nach Daten ab. Der Bildschirmmanager startet die Aktivität A, B oder C basierend auf den Daten. Außerdem kann der Benutzer auswählen, dass die anderen Aktivitäten angezeigt werden sollen, oder er kann eine Aktivität basierend auf neuen Daten aus dem Service automatisch austauschen. Momentan funktioniert die gesamte Navigation hervorragend und wenn der Benutzer Home drückt, wird die entsprechende Aktivität wieder in den Vordergrund gebracht, wenn der Benutzer das Apps-Symbol vom Android-Startbildschirm oder der kürzlich ausgeführten Apps-Liste drückt.

Ich musste dann eine neue Funktion implementieren, um ein Symbol und eine Benachrichtigung anzuzeigen. Ich habe dies zuerst implementiert, indem ich die Benachrichtigung nur dann angezeigt habe, wenn die Aktivitäten nicht mehr sichtbar waren, indem ich sie in jedem Activities onPause festlegte. Arbeitete wie ein Zauber und gab dem Benutzer eine dritte Möglichkeit, die App nach dem Drücken der Home-Taste erneut anzuzeigen. Wenn jedoch die Daten vom Server (wenn die App nicht angezeigt wird) bewirkt, dass der Bildschirmmanager die Aktivität aktualisiert, die angezeigt werden soll, habe ich Probleme. Ich denke, mein Activity-Stack wird vermasselt. Ich habe seitdem ein wenig anderes Modell ausprobiert, wo der Bildschirm-Manager die Benachrichtigungen behandelt und immer die Benachrichtigung anzeigt und sie mit einer neuen Absicht aktualisiert, wann immer eine Aktivität aktualisiert wird, aber sie schneidet sie immer noch nicht ab.

Wenn die App minimiert wird und sich die Daten ändern, kann der Bildschirmmanager das startActivityForResult für die neue Aktivität aufrufen, und Android scheint zu wissen, dass wir minimiert sind und die Aktivität nicht anzeigt. Ich kann dann auch den Screenmanager aufrufen, um auf die alte oberste Aktivität zu schließen.

Für jede Aktivität ist derzeit das Flag im Manifest auf singleTop und im Code auf FLAG_ACTIVITY_SINGLE_TOP gesetzt. Wenn sich die Daten auf dem Server nicht geändert haben, ziehe ich die App mit einem der oben genannten Schritte zurück. Ich bekomme, was ich erwarte, und die Aktivität onNewIntent wird aufgerufen. Wenn sich die Daten jedoch geändert haben und der Benutzer die App über die Benachrichtigung aufruft, ruft er die Aktivitäten onCreate auf. Die Aktivität wird ausgeführt und ausgeführt, aber wenn ich dann zurück drücke, wird ich zu einer anderen Instanz derselben Aktivität geführt, anstatt sie zu beenden. Ich habe mir meinen Logcat genauer angeschaut und sehe zwei Aufrufe der Aktivität onResume, aber danach keine Doppel.

Ich habe das Gefühl, dass ich vielleicht etwas Einfaches verpasse wie eine andere Absichtsflagge in der Absicht der Benachrichtigung? Danke für irgendwelche Ideen!

    
bursk 08.11.2010, 23:35
quelle

1 Antwort

5
  

Was mich umbringt, ist, dass sich die Daten vom Server ändern, wenn sie nicht angezeigt werden.

Ich habe keine Ahnung, was das bedeutet.

  

Ich habe das Gefühl, dass ich vielleicht etwas Einfaches verpasse wie eine andere Absichtsflagge in der Absicht der Benachrichtigung?

Ich habe Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP verwendet, um mit dem Problem zu arbeiten, dass es wie eine andere Instanz derselben Aktivität aussieht, aber in meinem Fall hatte ich eine Anwendung mit einer einzigen Aktivität.

Die Dokumentation für FLAG_ACTIVITY_CLEAR_TOP sagt auch:

"Dieser Startmodus kann auch in Verbindung mit FLAG_ACTIVITY_NEW_TASK genutzt werden: Wenn er zum Starten der Root-Aktivität eines Tasks verwendet wird, bringt er jede aktuell laufende Instanz dieses Tasks in den Vordergrund und löscht sie dann in den Vordergrund root state. Dies ist besonders nützlich, wenn Sie beispielsweise eine Aktivität aus dem Benachrichtigungsmanager starten. "

Es gibt auch FLAG_ACTIVITY_REORDER_TO_FRONT :

"Betrachten Sie zum Beispiel eine Aufgabe, die aus vier Aktivitäten besteht: A, B, C, D. Wenn D startActivity () mit einer Absicht aufruft, die in die Komponente von Aktivität B aufgelöst wird, dann wird B nach vorne gebracht der Historienstapel mit der resultierenden Reihenfolge: A, C, D, B. Dieses Flag wird ignoriert, wenn auch FLAG_ACTIVITY_CLEAR_TOP angegeben wird. "

Vielleicht passt eines dieser Muster zu Ihnen.

    
CommonsWare 09.11.2010, 00:04
quelle

Tags und Links