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.intent.action.MAIN"
- 类别:
"android.intent.category.HOME"
- 组件:以上activity
它还有一些额外的东西,但我认为它不相关
您遇到了这个令人讨厌的长期 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>
我有一个 启动器应用程序 ,它有一个 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.intent.action.MAIN"
- 类别: "android.intent.category.HOME"
- 组件:以上activity
它还有一些额外的东西,但我认为它不相关
您遇到了这个令人讨厌的长期 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>