Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过TaskStackBuilder启动时,启动模式下的活动singleTask将被销毁_Android_Android Activity_Launchmode_Taskstackbuilder - Fatal编程技术网

Android 通过TaskStackBuilder启动时,启动模式下的活动singleTask将被销毁

Android 通过TaskStackBuilder启动时,启动模式下的活动singleTask将被销毁,android,android-activity,launchmode,taskstackbuilder,Android,Android Activity,Launchmode,Taskstackbuilder,我有一个活动A,在Manifest中用android:launchMode=“singleTask” 和另一个没有其他属性的活动B 据我所知,如果已经有任务运行活动A, 不创建新实例,而是将当前任务放在前面, 如果我尝试启动活动A 现在,我想使用TaskStackBuilder进行一个调用,该调用包括两个活动 假设我在活动a中的一个片段上,并调用: TaskStackBuilder.create(context) .addN

我有一个活动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();
我假设当前堆栈变为:AB,其中A调用了
onNewIntent
,而B调用了一个新实例。此外,我希望活动A保持其状态

但是发生的事情是:我没有接到一个呼叫
onNewIntent
,而是接到了活动a
onDestroy
。如果我从新创建的ActivityB返回,将为Activitya的新实例调用
onCreate
。(他们不平等!)

有谁能向我解释一下,为什么我的活动A被扔掉了,而不是什么都不做,而是添加B?很遗憾,我不能独自解决这个问题,但我看不到这里的障碍


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

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

详细说明..这部分代码出现在方法
startActivities()
getpendingent()
中,导致我的活动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”,并且应该正常地重新排序到前面,但标志“活动”的“清除”任务被设置为“我的第一个活动”(即A),并导致在活动开始之前清除与A关联的现有任务

也就是说,我现在不会在我的特殊情况下使用StackBuilder。 我看到了几种方法:或者在开始之前使用一个空的活动 我的第一个目标活动或在其中构建堆栈 通过提供捆绑包,我的活动A
onCreate
/
onNewIntent

将要启动的包裹列表。

Yep,
TaskStackBuilder
始终重置任务。这就是为什么你可能永远不应该使用它。IMHO
TaskStackBuilder
是一个很大的错误,大多数使用它的人(因为建议使用它)最终会遇到比它解决的问题更多的问题。我完全同意你的观点@davidwasser请接受这个答案,这样问题就会从未回答的问题列表中删除。我已经有了。由于这两天没有资格接受限制,我忘记接受了。谢谢你的提示。我刚刚发现了这一点,很高兴在这里得知我没有疯。我的第一个实验将是覆盖getintent,因为不管出于什么原因,它们将其公开为非最终版本。