SingleTask activity 在同一个进程中创建了多次

SingleTask activity is created multiple times within the same process

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

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

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

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

activity 看起来像这样:

<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 错误:

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

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

在过去的几个小时里,我一直在努力解决完全相同的问题,并且我在 Whosebug 上阅读了许多关于此 topic/bug 的类似问答。没有任何解决方案真正适合我,直到出于好奇,我做了以下事情。

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

super.onNewIntent(intent);

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

我不知道它是如何工作的,但即使你随后取消注释同一行,它仍然以正确的方式运行,即:应用程序实际上只有一个主实例 activity 每时每刻。我怎么知道的?我的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>