Activity 在 launchMode 中,singleTask 在通过 TaskStackBuilder 启动时被销毁
Activity in launchMode singleTask gets destroyed when started via TaskStackBuilder
我有一个 activity A,在 Manifest
中用 android:launchMode="singleTask"
声明
和另一个没有更多属性的 activity B。
据我所知,如果已经有一些任务运行 activity A,
不是创建新实例,而是将当前任务放在最前面,
如果我尝试开始 activity A.
现在,我想使用 TaskStackBuilder
进行包括这两项活动的通话。
假设我在 Activity A 中的片段上并调用:
TaskStackBuilder.create(context)
.addNextIntent(new Intent(context, A.class))
.addNextIntent(new Intent(context, B.class))
.startActivities();
我假设当前堆栈变为:A > B 其中 A 得到一个使用新实例调用 onNewIntent
和 B。此外,我希望 Activity A 保持它的状态。
但是发生的事情是:我 没有 接到 onNewIntent
的电话,但是 onDestroy
Activity A。如果我从新创建的 Activity B 返回,onCreate
会被调用以获得 Activity A[ 的新实例=51=]。 (他们不相等!)。
任何人都可以向我解释一下,为什么我的 Activity A 被丢弃而不是什么都不做,而是添加 B 到堆栈?很遗憾,我自己无法解决这个问题,但我看不到这里的障碍。
Edit/Ps: 我用于 StackBuilder 的 context
可以是视图上下文或服务上下文。
所以,到目前为止还没有人回答,我同时深入研究了 android 的代码,发现 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);
我的 Activity A 在现有任务中。虽然它有 launchMode = "singleTask" 并且应该正常重新排序到前面,但 FLAG_ACTIVITY_CLEAR_TASK 设置为我的第一个 activity (这是 A) 并导致与 A 关联的现有任务在 activity 启动之前被清除。
也就是说,我现在不会在我的特殊情况下使用 StackBuilder。
我看到了几种方法:要么在之前使用空 Activity
我的第一个目标 Activity 或自己在其中构建堆栈
我的 Activity A 的 onCreate
/ onNewIntent
,通过提供 Bundle
从 parcelables(意图)列表开始。
我有一个 activity A,在 Manifest
中用 android:launchMode="singleTask"
声明
和另一个没有更多属性的 activity B。
据我所知,如果已经有一些任务运行 activity A, 不是创建新实例,而是将当前任务放在最前面, 如果我尝试开始 activity A.
现在,我想使用 TaskStackBuilder
进行包括这两项活动的通话。
假设我在 Activity A 中的片段上并调用:
TaskStackBuilder.create(context)
.addNextIntent(new Intent(context, A.class))
.addNextIntent(new Intent(context, B.class))
.startActivities();
我假设当前堆栈变为:A > B 其中 A 得到一个使用新实例调用 onNewIntent
和 B。此外,我希望 Activity A 保持它的状态。
但是发生的事情是:我 没有 接到 onNewIntent
的电话,但是 onDestroy
Activity A。如果我从新创建的 Activity B 返回,onCreate
会被调用以获得 Activity A[ 的新实例=51=]。 (他们不相等!)。
任何人都可以向我解释一下,为什么我的 Activity A 被丢弃而不是什么都不做,而是添加 B 到堆栈?很遗憾,我自己无法解决这个问题,但我看不到这里的障碍。
Edit/Ps: 我用于 StackBuilder 的 context
可以是视图上下文或服务上下文。
所以,到目前为止还没有人回答,我同时深入研究了 android 的代码,发现 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);
我的 Activity A 在现有任务中。虽然它有 launchMode = "singleTask" 并且应该正常重新排序到前面,但 FLAG_ACTIVITY_CLEAR_TASK 设置为我的第一个 activity (这是 A) 并导致与 A 关联的现有任务在 activity 启动之前被清除。
也就是说,我现在不会在我的特殊情况下使用 StackBuilder。
我看到了几种方法:要么在之前使用空 Activity
我的第一个目标 Activity 或自己在其中构建堆栈
我的 Activity A 的 onCreate
/ onNewIntent
,通过提供 Bundle
从 parcelables(意图)列表开始。