从最近打开应用程序恢复不是最后一个活动,而是前一个活动

时间:2014-12-10 19:02:38

标签: android android-intent android-pendingintent android-2.3-gingerbread back-stack

我从带有后备堆栈的待处理意图的通知开始活动。我就是这样做的

TaskStackBuilder stackBuilder = TaskStackBuilder.create(mContext);
stackBuilder.addNextIntentWithParentStack(intent);
stackBuilder.editIntentAt(0).putExtra(GCMUtils.NEXT_INTENT,BaseFragment.FragmentId.DIALOGS).
        setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
resultPendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_ONE_SHOT);

然后从活动A(以intent开始)开始活动B并完成活动A

Bundle extras = activity.getIntent().getExtras();
boolean isFromNotification = extras != null && 
        extras.getBoolean(GCMUtils.NOTIFICATION_INTENT, false);
boolean noBackStack = isFromNotification && 
        Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB;
if (activity.isTaskRoot() || noBackStack) {
    Intent intent = activity instanceof ActionBarActivity ? 
            ((ActionBarActivity)activity).getSupportParentActivityIntent() : 
            NavUtils.getParentActivityIntent(activity);
    if (noBackStack) {
        intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    }
    activity.startActivity(intent);
    activity.finish();
} else {
    activity.onBackPressed();
}

之后我用后退按钮退出我的应用程序(活动B是主要活动)。现在,如果打开最近的应用程序并单击我的应用程序,它将恢复活动A而不是活动B.它在android 2.3上重现。我不明白为什么它会恢复A而不是B.我缺少什么?

1 个答案:

答案 0 :(得分:0)

如果您在Android 2.3设备上运行,则使用兼容性库版本TaskStackBuilder。这构造了一个后栈,但在Android&lt; 3.0,它不支持完整的行为。如果您查看TaskStackBuilder的文档,请明确说明:

  

TaskStackBuilder提供了一种向后兼容的方式来遵守   关于设备上的跨任务导航的正确约定   该平台的版本。在运行Android 3.0或更高版本的设备上,   调用startActivities()方法或发送PendingIntent   由getPendingIntent(int,int)生成的将构造合成   如规定的背堆。 在运行旧版本的设备上   平台,这些相同的调用将调用最顶层的活动   提供堆栈,忽略合成堆栈的其余部分并允许   后退键可以导航回上一个任务。

我在粗体中突出显示了相关部分。

因此,在2.3设备上,当您从通知启动应用程序时,没有后备堆栈。它只是启动活动A.稍后,在您退出应用程序(完成堆栈中的所有活动)后,当您从最近的任务列表启动应用程序时,它只是以您从启动它的方式启动应用程序通知:启动活动A.