通过 TaskStackBuilder 启动时,launchMode singleTask 中的活动被破坏

JacksOnF1re

我有一个活动A,声明为Manifestwithandroid: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 > BA获得调用onNewIntentB与新实例。此外,我希望活动A保持它的状态。

但发生的情况是:我没有接到Activity A的电话onNewIntent,而是接到onDestroyActivity A 的电话如果我从新创建的 Activity B 返回onCreate则调用 Activity A的新实例(它们不相等!)。

任何人都可以向我解释,为什么我的 Activity A被扔掉而不是什么都不做,而是将B添加到堆栈中?很遗憾,我无法自己解决这个问题,但我看不到这里的障碍。

编辑/ PS:context我使用的StackBuilder可以是一个视图上下文或服务上下文。

JacksOnF1re

因此,由于到目前为止没有人回答,我同时深入研究了 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 AonCreate/内部构建堆栈onNewIntent,方法是提供一个带有可打包物(意图)列表的 Bundle 来启动。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

设置launchMode =“ singleTask”与设置活动launchMode =“ singleTop”

当launchMode为singleTask时,强制活动使用startActivity调用onCreate()

Android中的singleTask launchMode无法正常工作

使用“singleTask”作为启动模式时无法完全关闭活动

Android:launchMode = SingleTask问题

从主屏幕返回后,当前活动(具有SingleTask launchMode)不会恢复(而是调用启动器活动的onNewIntent)

SingleTask活动,但通过两个不同的应用程序打开

Android singleTask活动背景问题

启动时启动活动

launchMode =“ singleTask”不创建新任务

在启动器中通过按图标启动时,应用程序完全重启

启动singleTask活动会使它产生在调用者任务之上

在Xcode中通过推送通知启动时如何调试应用

首次启动时通过iOS应用中的转储文件创建数据库

通过intellij在本地计算机中启动时,如何存储spark的日志输出?

android singleTask活动不是作为根吗?

在同一过程中多次创建SingleTask活动

通过活动快捷方式启动时如何在字段中设置数据库中的特定数据?

startActivity(intent)它不起作用?当我的DemoActivity使用android:launchMode =“ singleTask”时,

singleTask 启动模式不起作用

导航组件SingleTask启动片段导航

onActivityResult不适用于android:launchMode =“ singleTask”

如何在启动时通过dotnet core 3中的依赖项调用自定义服务?

通过意图过滤器启动时,应用程序未显示在“最近的屏幕”中

Android“ singleTask”活动创建该活动的新实例

启动时的位置更新 - 在活动中打开和关闭

动态活动启动时布局更改

在启动时隐藏活动事件

动画在启动时崩溃的活动