Как вы создаете задний стек Android, когда действие запускается непосредственно из уведомления?
У меня есть два действия:
Активность A - список элементов
Активность B - подробный вид элемента
Обычно пользователь открывает приложение и запускается действие A. Пользователь видит список элементов, нажимает один, и начинает действие Activity B, чтобы отобразить детали элемента.
Активность B также может быть запущена непосредственно нажатием на уведомление. В этом случае нет обратного стека.
Как я могу сделать это так, чтобы при запуске Activity B из уведомления пользователь мог нажать кнопку "Назад" и перейти к "Активность А"
Ответы
Ответ 1
Вы можете добавить Extra в Intent, запущенное уведомлением, чтобы обнаружить, когда приложение было запущено таким образом.
Затем вы можете переопределить метод onBackPressed()
Activity и обработать этот сценарий, например
@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();
}
}
Ответ 2
Следуйте официальным рекомендациям для решения этой проблемы:
http://developer.android.com/training/implementing-navigation/temporal.html
Ответ 3
Вы должны позаботиться об этом, когда получите уведомление.
У меня аналогичная ситуация решена:
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());
Вам нужно указать в манифесте иерархию действий:
<activity
android:name=".ListDetail"
android:label="Detail"
android:parentActivityName=".List" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".List" />
</activity>
Ответ 4
Я попробовал один образец. Пожалуйста, перейдите по этой ссылке
https://github.com/rajajawahar/NotificationBackStack
Действия, которые вы хотите запустить.
Intent launchIntent = new Intent(context, SecondActivity.class).putExtra("Id", id);
Родительская активность, если нажата кнопка
Intent parentIntent = new Intent(context, FirstActivity.class);
Добавить как активность в 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());
Ответ 5
поймать событие back-button-key с помощью метода onKeyDown() и позволить пользователю перейти к активности A. Не забывайте возвращать значение true, чтобы предотвратить дальнейшее распространение события.
http://developer.android.com/reference/android/app/Activity.html#onKeyDown(int, android.view.KeyEvent)