24

我有两个活动:

活动 A - 项目列表
活动 B - 项目的详细视图

通常,用户打开应用程序并启动 Activity A。用户看到一个项目列表,单击其中一个,然后启动 Activity B 以显示项目详细信息。

活动 B 也可以通过单击通知直接启动。在这种情况下,没有回栈。

我怎样才能使当 Activity B 直接从通知启动时,用户可以单击“后退”按钮并转到 Activity A?

4

4 回答 4

24

您可以在通知启动的 Intent 中添加一个 Extra,以检测应用程序何时以这种方式启动。

然后您可以覆盖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();
    }    
  }
于 2011-10-25T18:40:09.137 回答
9

当您收到通知时,您应该注意这一点。

我解决了类似的情况:

 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>
于 2015-05-01T16:47:37.377 回答
5

我试过一个样品。请通过这个链接

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());
于 2016-10-05T10:20:57.543 回答
0

使用 onKeyDown() 方法捕获后退按钮事件并让用户转到活动 A。不要忘记返回 true 以防止事件进一步传播。

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

于 2011-08-22T23:45:26.683 回答