关闭 Receiver 触发启动画面 (activity) 在关闭后打开主要 activity

Closing Receiver triggered splash screen (activity) opens main activity after closing

[第一个应用程序] 我有一个特定的动画启动画面 (activity),它通过广播打开,可以通过 activity 本身的按钮或通过另一个广播关闭。打开和关闭都工作正常。但是,每当启动画面处于活动状态(在屏幕上)并且我发送广播或单击按钮时,activity 确实会关闭但会将我的主(启动器)activity 带到前台。如果我在初始屏幕上按后退按钮,它会打开我的主 activity。如果我按下主页按钮并通过通知操作发送广播,那么一切正常。

如果我打开我的应用程序(即启动器 activity),按后退按钮然后交付接收器以打开启动画面,然后它在关闭时不会打开我的主程序 activity。这意味着我的启动画面总是在我的应用程序堆栈的顶部提供。这种行为正常吗?我想避免这种情况,欢迎任何解决方法。

启动启动画面的代码:

private void showSplashScreen() {
    Intent m_intent = new Intent(this, SafSplashActivity.class);
    m_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    m_intent.putExtra("theme", theme);
    context.startActivity(m_intent);
}

更新 1: 如果我在我的 splash activity 中使用 System.exit(0) 代替 finish(0),那么我的 main activity 不是从前台开始的,而是从从头开始(并最终进入前台)...

P.S。 - 这对我的应用程序来说是一个严重的问题,因为如果用户发现自己在启动器 activity 上,即使在启动画面上单击关闭按钮后,他们也可能会想要对应用程序执行 'force-stop'。这对应用程序不利,因为它高度依赖系统触发的广播,然后将被阻止。

我通过为启动 activity 设置 launchMode="singleInstance" 解决了这个问题。虽然,我仍然不确定原始问题是否应该存在。如果 singleInstance 启动模式在其他人的用例中不可用怎么办?那么解决方案是什么?

尽管这是我问的一个老问题,但我最终通过添加到我的启动意图中解决了它:

m_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

根据文档:

If set in an Intent passed to Context.startActivity(), this flag will cause a newly launching task to be placed on top of the current home activity task (if there is one). That is, pressing back from the task will always return the user to home even if that was not the last activity they saw.

因为我的 splash activity 是一个独立的,即使 phone 被锁定也应该启动,所以上面的标志非常合适。一个缺点是该标志仅适用于 API 11+(即我的总共 4 个用户不会从中受益 :D)。无论如何,这似乎比使用非标准 launchMode.

要好得多