1

我有一个活动A,在Manifest其中声明android:launchMode="singleTask" ,另一个活动B没有其他属性。

据我所知,如果已经有一些任务正在运行活动 A,如果我尝试启动活动 A,则不会创建新实例,而是将当前任务置于前面。

现在,我想使用TaskStackBuilder来拨打包括这两项活动的电话。

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

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

我假设当前堆栈变为:A > BA被调用onNewIntentB被新实例调用。此外,我希望活动A保持其状态。

但是会发生什么:我没有接到Activity A的电话onNewIntent,而是接到了电话。如果我从新创建的 Activity B返回,则调用 Activity A的新实例。(他们不相等!)。onDestroyonCreate

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

编辑/附言:context用于 StackBuilder 的可以是视图上下文或服务上下文。

4

1 回答 1

3

因此,由于到目前为止没有人回答,我同时潜入了 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);

我的活动A在现有任务中。尽管它具有launchMode = "singleTask"并且应该正常重新排序到前面,但 FLAG_ACTIVITY_CLEAR_TASK 设置为我的第一个活动(即A )并导致与A关联的现有任务在活动开始之前被清除.

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

于 2017-07-12T16:47:12.077 回答