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

Posted

技术标签:

【中文标题】SingleTask 活动在同一个进程中多次创建【英文标题】:SingleTask activity is created multiple times within the same process 【发布时间】:2020-02-12 04:54:03 【问题描述】:

我有一个 启动器应用,它有一个 singleTask 活动作为主要入口点。当用户导航到另一个 Activity 或第 3 方应用程序然后点击 主页按钮 时,应该将此 Activity 置于最前面。但是我的经验是仅对于第一次按下主页按钮,会创建另一个实例(创建一个新任务,调用onCreate())。与此同时,旧任务仍然存在,包含此活动的原始实例,但无法导航回该任务/活动或将其带到前台。

在第一次按下主页按钮后,下一次按下主页按钮会将这个活动的第二个实例带到前台。不知道为什么不第一次调用第一个实例的 onNewIntent() 方法......所以这只发生一次,之后总是调用第二个实例的 onNewIntent() 方法。这意味着将无法访问原始活动..

我试图将任务带到前台,但没有发生任何事情......就像它从未存在过一样(但任务与活动一起存在,它不会在任何时候被杀死)。我可以从代码中找到任务,也可以使用 shell 脚本。它包含原始活动

这发生在 Android TV(Os: Pie)上。知道这可能是什么原因吗?我真的不明白这是怎么发生的......顺便说一句,如果我将活动设置为singleInstance,结果是一样的。

活动如下所示:

<activity
            android:name=".activities.MainActivity"
            android:excludeFromRecents="true"
            android:launchMode="singleTask"
            android:theme="@style/AppTheme">
            <intent-filter android:priority="2">
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.HOME"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.ALL_APPS"/>

                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

我尝试交替使用上述属性(priority、excludeFromRecents、taskAffinity),也将它们完全删除,它们没有任何效果...

按下主页按钮会发送以下意图:

动作:“android.intent.action.MAIN” 类别: “android.intent.category.HOME” 组件:上述活动

它还有一些额外的东西,但我认为它不相关

【问题讨论】:

你在用taskAffinity吗? 有没有试过都没有效果 你为什么要加android:excludeFromRecents="true"呢?这将阻止活动显示在任务切换器中,因此如果它不可见,您将无法有效地返回任务。 (我知道你提到过它们,但仍然看起来很奇怪)。 安装后第一次如何启动应用程序?您可能会看到这个讨厌的 Android 错误:***.com/questions/16283079/… 顺便说一句,我想就这个特定问题与你联系,因为我看到你在这个话题上(也)相当不错,但你还是找到了这个问题,所以谢谢! 【参考方案1】:

您正在经历这个长期存在的令人讨厌的 Android 错误:

Re-launch of Activity on Home button, but...only the first time

您在评论中说真实用户不会发生这种情况。这实际上不是真的。如果真正的用户会从 Play 商店安装您的应用,然后立即启动它(安装后单击“打开应用”按钮),那么问题将完全按照您的描述重现。

【讨论】:

【参考方案2】:

在过去的几个小时里,我一直在为同样的问题苦苦挣扎,并且我在 *** 上阅读了许多关于此主题/错误的类似问答。直到出于好奇,我才做了以下解决方案。

如果你正在构建一个启动器并在你的 MainActivity 中使用 onNewIntent() (尽管 OP 没有提到他正在使用这种方法),那么只需注释掉这一行:

super.onNewIntent(intent);

卸载您的应用并重新安装。

我不知道这是如何工作的,但是即使您取消注释同一行,它仍然以正确的方式运行,即:应用程序实际上一直只有其主要活动的单个实例。我怎么知道的?我的 MainActivity 正在做一些数据库操作,之前我在我的 Logcat 中看到这些操作每次都进行了两次,但现在它们只进行了一次。

顺便说一句,我在 AndroidManifest.xml 中的 MainActivity 标记并没有什么特别之处:

    <activity
            android:name=".activities.MainActivity"
            android:exported="true"
            android:excludeFromRecents="true"
            android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

【讨论】:

以上是关于SingleTask 活动在同一个进程中多次创建的主要内容,如果未能解决你的问题,请参考以下文章

Android singleTask 还是 singleInstance 启动模式? [关闭]

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

即使使用 launchMode="singleTask" 也可以启动两次活动

使用LaunchMode方式防止多次创建activity的总结

singleTask 启动模式不起作用

Android:恢复 singleTask 活动