Activity 在 launchMode 中,singleTask 在通过 TaskStackBuilder 启动时被销毁

Activity in launchMode singleTask gets destroyed when started via TaskStackBuilder

我有一个 activity A,在 Manifest 中用 android:launchMode="singleTask" 声明 和另一个没有更多属性的 activity B

据我所知,如果已经有一些任务运行 activity A, 不是创建新实例,而是将当前任务放在最前面, 如果我尝试开始 activity A.

现在,我想使用 TaskStackBuilder 进行包括这两项活动的通话。

假设我在 Activity A 中的片段上并调用:

                TaskStackBuilder.create(context)
                    .addNextIntent(new Intent(context, A.class))
                    .addNextIntent(new Intent(context, B.class))
                    .startActivities();

我假设当前堆栈变为:A > B 其中 A 得到一个使用新实例调用 onNewIntentB。此外,我希望 Activity A 保持它的状态。

但是发生的事情是:我 没有 接到 onNewIntent 的电话,但是 onDestroy Activity A。如果我从新创建的 Activity B 返回,onCreate 会被调用以获得 Activity A[ 的新实例=51=]。 (他们不相等!)。

任何人都可以向我解释一下,为什么我的 Activity A 被丢弃而不是什么都不做,而是添加 B 到堆栈?很遗憾,我自己无法解决这个问题,但我看不到这里的障碍。

Edit/Ps: 我用于 StackBuilder 的 context 可以是视图上下文或服务上下文。

所以,到目前为止还没有人回答,我同时深入研究了 android 的代码,发现 StackBuilder 本身就是问题所在

详细..这部分代码存在于方法 startActivities()getPendingIntent() 中,导致我的 Activity A 被摧毁:

    public PendingIntent getPendingIntent(int requestCode, int flags, Bundle options) {
        if (mIntents.isEmpty()) {
            throw new IllegalStateException(
                    "No intents added to TaskStackBuilder; cannot getPendingIntent");
        }

        Intent[] intents = mIntents.toArray(new Intent[mIntents.size()]);
        intents[0] = new Intent(intents[0]).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
            IntentCompat.FLAG_ACTIVITY_CLEAR_TASK |
            IntentCompat.FLAG_ACTIVITY_TASK_ON_HOME);
        // Appropriate flags will be added by the call below.
        return IMPL.getPendingIntent(mSourceContext, intents, requestCode, flags, options);
    }

是这部分:

Intent[] intents = mIntents.toArray(new Intent[mIntents.size()]);
    intents[0] = new Intent(intents[0]).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
            IntentCompat.FLAG_ACTIVITY_CLEAR_TASK |
            IntentCompat.FLAG_ACTIVITY_TASK_ON_HOME);

我的 Activity A 在现有任务中。虽然它有 launchMode = "singleTask" 并且应该正常重新排序到前面,但 FLAG_ACTIVITY_CLEAR_TASK 设置为我的第一个 activity (这是 A) 并导致与 A 关联的现有任务在 activity 启动之前被清除。

也就是说,我现在不会在我的特殊情况下使用 StackBuilder。 我看到了几种方法:要么在之前使用空 Activity 我的第一个目标 Activity 或自己在其中构建堆栈 我的 Activity AonCreate / onNewIntent,通过提供 Bundle 从 parcelables(意图)列表开始。