2012-12-10 12 views
21

Ich versuche, das beschriebene Verhalten here zu implementieren, wo eine Benachrichtigung (oder was auch immer) eine "interne" Aktivität in Ihrer App startet, und dann, wenn der Benutzer zurückgedrückt es geht meine "Heim" -Aktivität.Zurück zur Hauptaktivität von Benachrichtigung erstellt Aktivität

Die Android docs sagt

Im Fall der Zurück-Taste, sollen Sie die Navigation mehr vorhersehbar durch Einfügen in die Aufgabe der zurück stapeln den kompletten nach oben Navigation Pfad zum obersten Bildschirm des App machen. So können die Nutzer, die vergessen haben, wie sie Ihre App eingegeben haben, aufrufen, um zum obersten Bildschirm der App zu gelangen, bevor sie den Bildschirm verlassen ( ).

Gibt es eine gute Möglichkeit, das zu tun? Andere Fragen zu Stackoverflow schlagen vor, die Hauptaktivität mit einer Absicht zu starten, die sie anweist, die interne Aktivität zu starten, aber das scheint ein riesiger Hack zu sein, den Google ein wenig in Google Mail verwendet hätte, und ich nehme an, dass es eine anständige Methode gibt dass sie das Verhalten befürworten.

Gibt es einen nicht-hacky Weg, dies zu tun?

Antwort

55

Aha, ich brauche einfach PendingIntent.getActivities() statt getActivity() zu verwenden. Erwähnenswert ist auch TaskStackBuilder

Hier ist ein Code:

Intent backIntent = new Intent(ctx, MainActivity.class); 
    backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Intent intent = new Intent(ctx, ConversationActivity.class); 
    intent.putExtra("whatever", whatever); 
    final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++, 
      new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT); 

gerade getestet. Es wirkt wie ein Zauber. Ich vermutete zunächst, dass es ein Problem geben könnte, wenn die App bereits läuft und Sie zu einer Benachrichtigung gehen. I.e. sagen Sie Aktivitätsstapel (oberste auf der rechten Seite):

[MainActivity] [SomeActivity] 

und eine Benachrichtigung für ConversationActivity klicken. Würdest du bekommen :?

[MainActivity] [SomeActivity] [MainActivity] [ConversationActivity] 

Nun, es stellt sich heraus, Sie auf magische Weise

[MainActivity] [SomeActivity] [ConversationActivity] 

bekommen das ist, was ich wollte, aber ich habe keine Ahnung, wie es das tut. Ich habe keine besonderen Optionen für eine der Aktivitäten festgelegt. Naja!

+0

Leider scheint dies für mich nicht zu funktionieren. Meine MainActivity wird tatsächlich wieder auf den Navigationsstapel geschoben und funktioniert nur einmal für eine Benachrichtigung (ich lehne sie nicht automatisch ab). Irgendwelche Ideen? – bompf

+1

@bompf, das liegt wahrscheinlich daran, dass 'PendingIntent.FLAG_ONE_SHOT' in' PendingIntent.getActivities' verwendet wird. Ich schlage stattdessen 'PendingIntent.FLAG_CANCEL_CURRENT' vor. – Sam

+1

Danke; Das funktionierte für mich, während 'TaskStackBuilder' nicht zu funktionieren schien. Allerdings hat Ihr Code eine seltsame Situation ausgelöst: Wenn ich 'MainActivity' über den Launcher geöffnet habe und dann die Aktion aus der Benachrichtigung geöffnet habe, nachdem ich die Zurück-Taste gedrückt habe, um zurück zu' MainActivity' zu gelangen, drückte die Zurück-Taste 'MainActivity' wieder. So: '[MainActivity] [MainActivity] [ConversationActivity]'. Ich habe es behoben, indem ich die zweite Codezeile in 'backIntent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK)' geändert habe. – Sam

1

Ich weiß, 2 Möglichkeiten, dies zu erreichen:

  1. Beginnen Sie Ihren home activity aus Aktivität durch Benachrichtigung gestartet. Dies kann ziemlich trickreich werden, da Sie verschiedene mögliche Einstiegspunkte unterscheiden und verfolgen müssen.
  2. Sie beginnen immer mit Ihnen home activity, die überprüft, ob durch eine Benachrichtigung gestartet wird und startet dann die notification activity. Dies stellt einen konsistenten Einstiegspunkt sicher, und der Backstack wird vorhanden sein, wenn der Benutzer die Up-Taste drückt.

Grüße.

0

Schön.

Aber seien Sie sich bewusst, dass das nicht auf Pre-3 funktioniert.System 0 (vor API Level 11), da PendingIntent.getActivities() dort nicht verfügbar ist.

Und das ist das gleiche für die Erstellung eines Backstacks für den Zugriff auf eine Aktivität aus einer Benachrichtigung (über Intent) und die Schaltfläche zurück kohärent mit Ihrer Anwendung verhält (Detailaktivität kommt zurück zu Listenaktivität zum Beispiel).

0

Aktivitäten sind mit einer Aufgabe verbunden, die nur eine Gruppe von Aktivitäten im Backstack darstellt. Wenn Sie beim Klicken auf die Benachrichtigung eine neue Aktivität öffnen, wird diese Aktivität als eigenständige Aktivität geöffnet und in eine neue Aufgabe eingefügt. Dies bedeutet, dass nur die Benachrichtigungsaktivität und die Elternaktivität vorhanden sind.

Geben Sie einfach den Startmodus Ihrer Aktivität als "Standard" in der Manifestdatei an und das Problem sollte gelöst werden.

Intent resultIntent = new Intent(getApplicationContext(), 
         ResultActivity.class); 

PendingIntent resultPendingIntent = 
    PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT); 

mBuilder.setContentIntent(resultPendingIntent); 

NotificationManager mNotificationManager = (NotificationManager) 
    getSystemService(Context.NOTIFICATION_SERVICE); 
mNotificationManager.notify(notId, mBuilder.build()); 

manifestiert:

<activity 
      android:name="com.mns.exercisenotifications.ResultActivity" 
      android:label="@string/app_name" 
      android:launchMode="standard" > <--- 
      <intent-filter> 
       <action android:name="com.mns.exercisenotifications.ResultActivity" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 

</activity> 
Verwandte Themen