【问题标题】:Opening app from recents restore not last activity, but previous one从最近打开的应用程序恢复不是最后一个活动,而是前一个
【发布时间】:2014-12-10 19:02:37
【问题描述】:

我从具有待处理意图的通知开始活动,并带有返回堆栈。这是我的制作方法

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。我错过了什么?

【问题讨论】:

  • 澄清!当我使用返回按钮和主页按钮时效果不同。如果是主页按钮,它会按预期恢复活动 B。只有在返回按钮的情况下,它才会恢复活动 A。也许它会保存启动应用程序的意图并在从最近的应用程序启动时重用它?附:应强制停止应用程序以重现此行为。
  • 你的说法毫无意义。 BACK 和 HOME 做完全不同的事情 当你按下 BACK 时,这会完成当前的 Activity 并返回到堆栈上的前一个 Activity。如果没有以前的活动,您的应用程序将退出。但是,按 HOME 不会在任何活动上调用 finish()。它只是将您的任务移至后台。当您将现有任务从后台带到前台时(通过从最近的任务列表中选择它),您的任务应该处于与您离开时完全相同的状态(即:相同的 Activity 应该在顶部) .
  • 另见stackoverflow.com/questions/19813652/…也许这解释了你所看到的。

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


【解决方案1】:

如果您在 Android 2.3 设备上运行,则您使用的是兼容库版本TaskStackBuilder。这构造了一个回栈,但在 Android TaskStackBuilder 的文档,它会明确指出:

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

我用粗体突出了文本的相关部分。

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

【讨论】:

  • 我知道我在 android 3.0 及更低版本上没有后台堆栈。如果我在活动 A 中按下返回按钮,它将转到主屏幕。但是我完成了活动A并开始了另一个活动B。它真的启动了,我可以清楚地看到这一点。现在为什么它仍然恢复 A?
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2017-01-08
  • 1970-01-01
相关资源
最近更新 更多