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

And*_*w C 21 android activity-lifecycle android-activity

我有两个活动:

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

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

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

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

Dan*_*n J 22

您可以在通知启动的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();
    }    
  }
Run Code Online (Sandbox Code Playgroud)


Cas*_*dim 7

遵循官方指南来解决此类问题:

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

  • 这是正确的方法.关于onBackPressed()方法的解决方法很好,但这不是Android的工作方式. (7认同)

Fra*_*lin 6

收到通知后,您应该注意这一点.

我遇到了类似的情况:

 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());
Run Code Online (Sandbox Code Playgroud)

您需要在Manifest中设置活动的层次结构:

<activity
        android:name=".ListDetail"
        android:label="Detail"
        android:parentActivityName=".List" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".List" />
</activity>
Run Code Online (Sandbox Code Playgroud)