当我将我的应用程序带到前台时,没有加载最后一个 activity

When I bring my app to the foreground doesn´t load the last activity

我遇到了意外行为:

当我关闭应用程序并从通知打开它时,Activity B 启动。

所以,当我点击主页按钮时,应用程序导航到 Activity A。 然后,我按下“返回”按钮,应用程序进入后台,我进入 Android 主屏幕。

这没问题,但如果我打开最近的应用程序菜单并再次 select 我的应用程序,它会加载 Activity B 而不是我预期的 Activity A。我真的不知道发生了什么。

通知生成器中设置的意图是:

Intent intent = new Intent(this, ActivityB.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

在Activity B 我有:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (id == android.R.id.home) {
        Intent intent = new Intent(ActivityB.this, ActivityA.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    }

有什么想法或建议吗?

您可以改用 FLAG_ACTIVITY_REORDER_TO_FRONT 标志,它只会对活动重新排序,而不是 FLAG_ACTIVITY_CLEAR_TOP,后者会删除其上的其他活动。

例如,当使用 FLAG_ACTIVITY_REORDER_TO_FRONT

考虑一项由四个活动组成的任务:A, B, C, D。如果 D 使用解析为 activity B 的组件的 Intent 调用 startActivity(),则 B 将被带到历史堆栈的前面,结果顺序为: A, C, D, B。如果还指定了 FLAG_ACTIVITY_CLEAR_TOP,则此标志将被忽略。

你可以参考这个link:https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

发生这种情况的原因是最近任务列表中的任务是从 NotificationActivityB 作为根 Activity 开始的。如果您从最近任务列表中选择此任务,Android 会将现有任务置于前台。但是,如果任务中没有活动活动(所有活动都已完成),则 Android 会再次从该任务启动根 Activity

如果应用程序是从 Notification 启动的,您需要阻止该应用程序被添加到最近任务列表中。您可以通过添加:

android:excludeFromRecents="true"

ActivityB 的清单条目。

我找到了符合我预期的解决方案。 当我收到通知时,我创建了一个新的任务堆栈,我的 mainActivity 位于顶部:

Intent intent = new Intent(this, ActivityB.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ActivityB.class);
stackBuilder.addNextIntent(intent);

PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

现在,我还可以删除 Activity B:

中对主页按钮的覆盖检查
// This can be now removed
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (id == android.R.id.home) {
    Intent intent = new Intent(ActivityB.this, ActivityA.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}