当通过TaskStackBuilder启动时,launchMode singleTask中的活动被销毁

时间:2017-07-12 12:15:31

标签: android android-activity launchmode taskstackbuilder

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

据我所知,如果已经有一些任务正在运行A, 而不是创建一个新的实例,当前的任务被带到前面, 如果我尝试开始活动A。

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

假设我在活动中的片段 A 并致电:

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

我假设当前的堆栈变为: A > B A 使用新实例调用onNewIntent B 。此外,我希望活动 A 能够保持其状态。

但接下来会发生的事情是:我打电话给onNewIntent,而onDestroy打电话给 A 。如果我从新创建的活动 B 返回,则会调用onCreate来创建活动 A 的新实例。 (他们不平等!)。

有人可以向我解释一下,为什么我的活动 A 被抛弃而不是什么都不做,只是将 B 添加到堆栈中?遗憾的是,我无法独自解决这个问题,但我无法在这里看到障碍。

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

1 个答案:

答案 0 :(得分:3)

所以,至于目前为止没有人回答,我同时从脑中潜入了代码,发现 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或者自己构建堆栈 我的活动 A onCreate / onNewIntent,提供了一个捆绑包 用一个parcelables(意图)列表开始。