2011-08-18 13 views
18

Ho due attività:Come si crea uno stack posteriore Android quando un'attività viene avviata direttamente da una notifica?

Attività A - elenco di elementi
Attività B - vista di dettaglio un elemento

Normalmente, un utente apre l'applicazione e attività A è lanciata. Un utente visualizza un elenco di elementi, fa clic su uno e l'attività B viene avviata per visualizzare i dettagli dell'elemento.

L'attività B può anche essere avviata direttamente facendo clic su una notifica. In questo caso non ci sono back stack.

Come posso fare in modo che quando l'attività B viene avviata direttamente da una notifica, l'utente può fare clic sul pulsante Indietro e andare all'Attività A?

+0

ho mai essere a t la sua situazione, quindi la mia risposta potrebbe non essere perfetta. Anziché avviare l'attività B ... Avviare l'attività A e passare un valore utilizzando Intent dal ricevitore e verificare tale valore in onCreate dell'attività A, se la condizione soddisfa avviare l'attività B.Quindi attraverso questo avrai un'attività A in backStack. Ma solo la cattura è che l'utente vedrà strane animazioni come l'attività A in arrivo e la transizione all'attività B. Ha senso? – Gopal

+0

@gopal si stavo considerando di implementare qualcosa del genere. Proverò presto e riferirò. –

+0

sicuro per favore fatemi sapere – Gopal

risposta

22

È possibile aggiungere un extra nel intenti lanciato dalla notifica per rilevare quando l'applicazione è stata lanciata in quel modo.

Quindi è possibile ignorare il metodo di attività onBackPressed() e gestire tale scenario, ad es.

@Override 
    public void onBackPressed() 
    { 
    Bundle extras = getIntent().getExtras(); 

    boolean launchedFromNotif = false; 

    if (extras.containsKey("EXTRA_LAUNCHED_BY_NOTIFICATION")) 
    { 
     launchedFromNotif = extras.getBoolean("EXTRA_LAUNCHED_BY_NOTIFICATION"); 
    } 

    if (launchedFromNotif) 
    { 
     // Launched from notification, handle as special case 
     Intent intent = new Intent(this, ActivityA.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     mActivity.startActivity(intent); 
     finish(); 
    } 
    else 
    { 
     super.onBackPressed(); 
    }  
    } 
+0

1a volta perché questa soluzione è indipendente dal livello API, contrariamente alla soluzione PendingIntent.getActivities() (http://stackoverflow.com/a/13801159/1894568) – AndacAydin

+0

Un controllo se il bundle 'extras' non è' null' è necessario prima di accedervi. – Joe

+0

@AndacAydin Che cosa intendi con "PendingIntent.getActivities() dipende dal livello API"? Come sottolinea Cassio Landim, consiglierei la soluzione "TaskStackBuilder", modificando il backStack, come consigliato dalle linee guida. – John

0

catturare l'evento tasto back-tasto con onKeyDown() - metodo e consentire all'utente di andare all'attività A. Non dimenticare di restituire true per impedire che l'evento venga ulteriormente propagato.

http://developer.android.com/reference/android/app/Activity.html#onKeyDown(int, android.view.KeyEvent)

+0

Con "lasciare che l'utente passi all'Attività A", intendi creare un Intento e avviare l'Attività A? Se l'avessi fatto e l'utente avesse premuto il pulsante Indietro nell'Attività A, tornerebbe all'Attività B, giusto? –

+0

sì, è vero. Se vuoi evitare questo comportamento, prova a terminare l'attività B dopo aver avviato l'attività A, ad esempio Intento i = nuovo intento (questo, ActivityA.class); startActivity (i); finish(); – AZ13

5

Si dovrebbe prendere cura di questo quando si riceve la notifica.

ho una situazione simile risolto:

Intent intent = new Intent(context,ListDetail.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
stackBuilder.addParentStack(ListDetail.class); 
stackBuilder.addNextIntent(intent); 
PendingIntent contentIntent = 
      stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
Notification.Builder mBuilder = new Notification.Builder(context); 
mNotifM.notify(NotificationId.getID(), mBuilder.setStyle(new Notification.BigTextStyle(mBuilder) 
      .bigText(bigText) 
      .setBigContentTitle(title) 
      .setSummaryText(summaryText)) 
      .setContentTitle(title) 
      .setSmallIcon(icon) 
      .setContentText(summaryText) 
      .setAutoCancel(true) 
      .setContentIntent(contentIntent) 
      .setTicker(bigText) 
      .build()); 

È necessario impostare nel vostro manifesto gerarchia delle Attività:

<activity 
     android:name=".ListDetail" 
     android:label="Detail" 
     android:parentActivityName=".List" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value=".List" /> 
</activity> 
2

ho provato uno sample.Please passare attraverso con questo link

https://github.com/rajajawahar/NotificationBackStack 

attività che si desidera avviare ..

Intent launchIntent = new Intent(context, SecondActivity.class).putExtra("Id", id); 

Parent Attività, se di nuovo premuto

Intent parentIntent = new Intent(context, FirstActivity.class); 

aggiungere sia l'attività nel TaskBuilder

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    PendingIntent resultPendingIntent = stackBuilder.addNextIntentWithParentStack(parentIntent).addNextIntent(launchIntent).getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder notificationCompatBuilder = 
       new NotificationCompat.Builder(context); 
     NotificationManager mNotificationManager = 
       (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(id, notificationCompatBuilder.build()); 
     NotificationManager mNotifyMgr = 
       (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationCompatBuilder.setAutoCancel(true). 
       setContentTitle("First Notification"). 
       setContentText("Sample Text"). 
       setSmallIcon(R.mipmap.ic_launcher). 
       setContentIntent(resultPendingIntent); 
     mNotifyMgr.notify(id, notificationCompatBuilder.build()); 
Problemi correlati