2011-08-18 21 views
18

Tengo dos actividades:¿Cómo construyes una pila posterior de Android cuando una actividad se inicia directamente desde una notificación?

Actividad A - Lista de artículos
Actividad B - vista de detalle de un elemento

Normalmente, un usuario abre la aplicación y se puso en marcha una actividad. Un usuario ve una lista de elementos, hace clic en uno y la Actividad B se inicia para mostrar el detalle del elemento.

Actividad B también se puede iniciar directamente desde al hacer clic en una notificación. En este caso, no hay pila de respaldo.

¿Cómo puedo hacerlo de modo que cuando se inicia la actividad B directamente desde una notificación, el usuario puede hacer clic en el botón Atrás y vaya a una actividad?

+0

nunca estar a t su situación, por lo que mi respuesta podría no ser perfecta. En lugar de comenzar la Actividad B ... Comience la Actividad A y pase un valor usando el Intento de su receptor y verifique ese valor en onCreate of Activity A, si la condición satisface, comience la Actividad B.Entonces a través de esto tendrás la Actividad A en BackStack. Pero lo único que atrapa es que el usuario verá una animación extraña como la Actividad A que viene y la transición a la Actividad B. ¿Tiene sentido esto? – Gopal

+0

@gopal Sí, estaba considerando implementar algo así. Lo intentaré pronto e informaré. –

+0

seguro, por favor avíseme – Gopal

Respuesta

22

Se puede añadir un extra a la intención puesta en marcha por la notificación para detectar cuando la aplicación se ha puesto en marcha de esa manera.

A continuación, se puede reemplazar el método Actividad onBackPressed() y manejar ese escenario, por ejemplo,

@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

1up porque esta solución es independiente de nivel api, contrariamente a la solución PendingIntent.getActivities() (http://stackoverflow.com/a/13801159/1894568) – AndacAydin

+0

A comprobar si el paquete 'extras' no es' null' es necesario antes de acceder a él. – Joe

+0

@AndacAydin ¿Qué quiere decir con "PendingIntent.getActivities() depende de la API"? Como señala Cassio Landim, recomendaría la solución "TaskStackBuilder", editando BackStack, como lo aconsejan las directrices. – John

0

captura el evento de back-botón-llave con onKeyDown() - Método y dejar que el usuario vaya a la actividad A. No se olvide de volver fiel a evitar que el evento se propague aún más.

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

+0

Al decir "deje que el usuario vaya a la Actividad A", ¿quiere decir crear un Intento e iniciar la Actividad A? Si lo hiciera, y el usuario presionó el botón Atrás en la Actividad A, volverían a la Actividad B, ¿verdad? –

+0

sí, eso es correcto. Si desea evitar este comportamiento, intente finalizar su actividad B después de iniciar la Actividad A, es decir: Intención i = nueva intención (this, ActivityA.class); startActivity (i); acabado(); – AZ13

5

Debe hacerse cargo de esto cuando reciba la notificación.

Tengo una situación similar resuelto:

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

Es necesario establecer en su Manifiesto de la jerarquía de las Actividades:

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

he probado uno sample.Please seguir adelante con este enlace

https://github.com/rajajawahar/NotificationBackStack 

actividad que desee poner en marcha ..

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

Actividad de Padres, si la espalda apoyada

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

añadir tanto la actividad en el 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()); 
Cuestiones relacionadas