我有一个活动A,声明为Manifest
withandroid: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 > B与A获得调用onNewIntent
和B与新实例。此外,我希望活动A保持它的状态。
但发生的情况是:我没有接到Activity A的电话onNewIntent
,而是接到onDestroy
Activity A 的电话。如果我从新创建的 Activity B 返回,onCreate
则调用 Activity A的新实例。(它们不相等!)。
任何人都可以向我解释,为什么我的 Activity A被扔掉而不是什么都不做,而是将B添加到堆栈中?很遗憾,我无法自己解决这个问题,但我看不到这里的障碍。
编辑/ PS:该context
我使用的StackBuilder可以是一个视图上下文或服务上下文。
因此,由于到目前为止没有人回答,我同时深入研究了 android 的代码,并发现StackBuilder 本身就是问题所在。
详细地说..这部分代码存在于方法中startActivities()
,也存在于中getPendingIntent()
,导致我的活动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 A的onCreate
/内部构建堆栈onNewIntent
,方法是提供一个带有可打包物(意图)列表的 Bundle 来启动。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句