我的活动 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
可以是视图上下文或服务上下文。
答案 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(意图)列表开始。