Как создать обратный стек Android, когда действие запускается непосредственно из уведомления? - PullRequest
21 голосов
/ 19 августа 2011

У меня есть два действия:

Задание A - список предметовДействие B - подробный вид элемента

Обычно пользователь открывает приложение и запускает Действие А.Пользователь видит список элементов, щелкает один, и начинается действие «Б», чтобы отобразить сведения об элементе.

Кроме того, действие «Б» можно запустить непосредственно, щелкнув уведомление.В этом случае нет стека назад.

Как сделать так, чтобы при запуске действия B непосредственно из уведомления пользователь мог нажать кнопку «Назад» и перейти к действию A?

Ответы [ 5 ]

22 голосов
/ 25 октября 2011

Вы можете добавить 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();
    }    
  }
7 голосов
/ 10 февраля 2014

Следуйте официальным инструкциям для решения этой проблемы:

http://developer.android.com/training/implementing-navigation/temporal.html

5 голосов
/ 01 мая 2015

Вы должны позаботиться об этом при получении уведомления.

У меня похожая ситуация решена:

 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>
3 голосов
/ 05 октября 2016

Я попробовал один образец. Пожалуйста, пройдите по этой ссылке

https://github.com/rajajawahar/NotificationBackStack

Активность, которую вы хотите запустить ..

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

РодительУпражнение, если снова нажать

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

Добавить Обе операции в построителе задач

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());
0 голосов
/ 23 августа 2011

перехватывает событие back-button-key с помощью метода onKeyDown () - и позволяет пользователю перейти к заданию A. Не забудьте вернуть true, чтобы предотвратить дальнейшее распространение события.

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

...