当直接从通知启动活动时,如何构建Android后台堆栈?

当直接从通知启动活动时,如何构建Android后台堆栈?,android,android-activity,activity-lifecycle,Android,Android Activity,Activity Lifecycle,我有两项活动: 活动A-项目列表 活动B-项目的详细视图 通常,用户打开应用程序并启动活动a。用户看到一个项目列表,单击一个,活动B开始显示项目详细信息 活动B也可以通过单击通知直接启动。在这种情况下,没有后堆栈 如何使其在直接从通知启动活动B时,用户可以单击后退按钮并转到活动a?使用onKeyDown()方法捕获后退按钮键事件并让用户转到活动a。不要忘记返回true以防止事件进一步传播 ,android.view.KeyEvent)您可以在通知启动的意图中添加额外的内容,以检测应用程序以这种方

我有两项活动:

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

通常,用户打开应用程序并启动活动a。用户看到一个项目列表,单击一个,活动B开始显示项目详细信息

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


如何使其在直接从通知启动活动B时,用户可以单击后退按钮并转到活动a?

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


,android.view.KeyEvent)

您可以在通知启动的意图中添加额外的内容,以检测应用程序以这种方式启动的时间

然后您可以重写
onBackPressed()
活动方法并处理该场景,例如

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

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

我解决了一个类似的问题:

 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>

我尝试了一个示例。请使用此链接

https://github.com/rajajawahar/NotificationBackStack
要启动的活动

父活动,如果按back键

在taskbuilder中添加这两个活动


我从来没有想过这种情况,所以我的答案可能并不完美。如果条件满足启动活动B,则启动活动A并从接收方使用Intent传递一个值,并在活动A的onCreate中检查该值。因此,通过此操作,活动A将处于后退状态。但唯一需要注意的是,用户会看到像活动A这样的奇怪动画出现并过渡到活动B。这有意义吗?@gopal是的,我正在考虑实现类似的东西。我将很快尝试并报告。所谓“让用户进入活动A”,您的意思是创建意图并开始活动A吗?如果我这样做了,用户在活动A中按下后退按钮,他们会返回到活动B,对吗?是的,没错。如果要防止这种行为,请尝试在开始活动A后完成活动B,即:Intent i=new Intent(this,ActivityA.class);星触觉(i);完成();1up因为此解决方案与PendingEvent.getActivities()解决方案()相反,是api级别独立的解决方案。在访问此解决方案之前,请检查
extras
捆绑包是否为
null
。@AndacAydin“PendingEvent.getActivities()与api级别相关”是什么意思?正如Cassio Landim所指出的,我建议使用“TaskStackBuilder”解决方案,按照指南的建议编辑backbackback。
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());