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