vida savedinstancestate onrestart example ciclo activity android android-activity activity-lifecycle

savedinstancestate - onstart android example



¿Cómo se construye una pila trasera de Android cuando una actividad se inicia directamente desde una notificación? (5)

Debes encargarte de esto cuando recibas la Notificación.

Tengo una situación similar resuelta:

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

Necesitas establecer en tu Manifiesto 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>

Tengo dos actividades:

Actividad A - lista de artículos
Actividad B - vista detallada de un artículo

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

La actividad B también se puede iniciar directamente haciendo clic en una notificación. En este caso no hay back stack.

¿Cómo puedo hacer que cuando la Actividad B se inicia directamente desde una notificación, el usuario puede hacer clic en el botón Atrás e ir a la Actividad A?


He probado una muestra. Por favor, siga este enlace.

https://github.com/rajajawahar/NotificationBackStack

Actividad que quieres lanzar ..

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

Actividad para padres, si se presiona hacia atrás

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

Añadir tanto la actividad en el generador de tareas

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


Puede agregar un Extra en la Intención iniciada por la notificación para detectar cuándo se ha iniciado la aplicación de esa manera.

Luego, puede anular el método de 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(); } }