我从带有后备堆栈的待处理意图的通知开始活动。我就是这样做的
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.我缺少什么?
答案 0 :(得分:0)
如果您在Android 2.3设备上运行,则使用兼容性库版本TaskStackBuilder
。这构造了一个后栈,但在Android&lt; 3.0,它不支持完整的行为。如果您查看TaskStackBuilder
的文档,请明确说明:
TaskStackBuilder提供了一种向后兼容的方式来遵守 关于设备上的跨任务导航的正确约定 该平台的版本。在运行Android 3.0或更高版本的设备上, 调用startActivities()方法或发送PendingIntent 由getPendingIntent(int,int)生成的将构造合成 如规定的背堆。 在运行旧版本的设备上 平台,这些相同的调用将调用最顶层的活动 提供堆栈,忽略合成堆栈的其余部分并允许 后退键可以导航回上一个任务。
我在粗体中突出显示了相关部分。
因此,在2.3设备上,当您从通知启动应用程序时,没有后备堆栈。它只是启动活动A.稍后,在您退出应用程序(完成堆栈中的所有活动)后,当您从最近的任务列表启动应用程序时,它只是以您从启动它的方式启动应用程序通知:启动活动A.