2012-12-10 18 views
21

Sto tentando di implementare il comportamento descritto here, in cui una notifica (o qualsiasi altra cosa) avvia un'attività "interna" nella tua app, e quindi quando l'utente lo ha premuto torna a la mia attività "casa".Torna all'attività principale dell'attività creata dalla notifica

La documentazione Android dicono

Nel caso del pulsante Indietro, si dovrebbe rendere la navigazione più prevedibile inserendo nella schiena del compito pila completa verso l'alto il percorso di navigazione a schermo più alta dell'app. Ciò consente agli utenti di dimenticare come sono entrati nella tua app per passare allo schermo più in alto dell'app prima di uscire.

C'è un buon modo per farlo davvero? Altre domande su Stackoverflow suggeriscono di avviare l'attività principale con un intento che dice di avviare l'attività interna, ma che sembra un enorme hack, che dubito in qualche modo che Google avrebbe usato in Gmail, e presumo che ci sia un metodo decente, dato che stanno sostenendo il comportamento.

Quindi c'è un modo non hacky per fare questo?

risposta

55

Aha, ho semplicemente bisogno di utilizzare PendingIntent.getActivities() anziché getActivity(). Degno di menzione è TaskStackBuilder

Ecco il codice:

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); 

appena provato. Esso funziona magicamente. Inizialmente sospettavo che potesse esserci un problema se l'app è già in esecuzione e si passa a una notifica. Cioè dire l'attività stack è (più in alto a destra):

[MainActivity] [SomeActivity] 

e si fa clic una notifica per ConversationActivity. Vorresti :?

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

Bene, si scopre che magicamente ottiene

[MainActivity] [SomeActivity] [ConversationActivity] 

che è quello che volevo, ma non ho idea di come lo fa. Non ho impostato alcuna opzione speciale su nessuna delle attività. Oh bene!

+0

Purtroppo, questo non sembra funzionare per me. La mia MainActivity viene effettivamente spinta nuovamente nello stack di navigazione, e funziona solo una volta per una notifica (non li auto-licenzia). Qualche idea? – bompf

+1

@bompf, probabilmente a causa di 'PendingIntent.FLAG_ONE_SHOT' utilizzato in' PendingIntent.getActivities'. Suggerisco invece 'PendingIntent.FLAG_CANCEL_CURRENT'. – Sam

+1

Grazie; questo ha funzionato per me, mentre 'TaskStackBuilder' non sembrava funzionare. Tuttavia, il codice ha provocato una condizione strana: se avessi aperto "MainActivity" tramite il programma di avvio e poi avessi aperto l'azione dalla notifica, dopo aver premuto il pulsante Indietro per tornare a "MainActivity", premendo il pulsante Indietro si è arrivati ​​a 'MainActivity' di nuovo. In questo modo: '[MainActivity] [MainActivity] [ConversationActivity]'. L'ho risolto cambiando la seconda riga di codice in 'backIntent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK)'. – Sam

1

so 2 modi per raggiungere tale obiettivo:

  1. avvia il home activity dall'interno attività è iniziata con una notifica. Questo può diventare piuttosto un trucco, in quanto dovrai differenziare e tenere traccia dei vari possibili punti di ingresso.
  2. Inizia sempre con te home activity che controlla se viene avviato da una notifica e quindi avvia il notification activity. Ciò garantisce un punto di ingresso coerente e lo stack posteriore sarà lì quando l'utente preme il tasto Su.

Cordiali saluti.

0

Nice.

Ma sappiate che non funziona su pre-3.0 (pre livello API 11) perché PendingIntent.getActivities() non è disponibile lì.

E questo è lo stesso per la costruzione di un backstack per accedere a un'attività da una notifica (tramite Intento) e il pulsante Indietro si comporta in modo coerente con l'applicazione (ad esempio l'attività di dettaglio torna ad elencare attività).

0

Le attività sono associate a un'attività che non è altro che un gruppo di attività nello stack posteriore. Quando apri una nuova attività al clic della notifica, quell'attività viene aperta come un'attività indipendente e viene inserita in una nuova attività. Ciò significa che sono presenti solo l'attività di notifica e l'attività principale.

Basta specificare la modalità di avvio dell'attività come "standard" nel file manifest e risolvere il problema.

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()); 

manifestare:

<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> 
0

Questa soluzione funziona alla grande proprio per questo problema

android:noHistory="true" 
Problemi correlati