【问题标题】:StartActivity method from background从后台启动活动方法
【发布时间】:2021-12-23 14:17:18
【问题描述】:

问题似乎是已知的,但我找不到正确的解决方案。


我将描述场景:


有一个应用程序向 API 发出请求。在某些 FirstActivity 中,向 API 发出一个请求,如果得到肯定结果,则在 SecondActivity 中调用 startActivity()。问题是,如果在发送请求时,应用程序被最小化到后台(即后台会调用startActivity()),那么:

  1. 如果android 版本> = 29 那么startActivity() 基本上是行不通的。 startActivity()finish() 之后的一个将起作用,并且在重新启动时应用程序将重新启动(这是合乎逻辑的)
  2. 如果 android 版本

基于此,问题是。如何强制应用程序(无论版本如何)在活动之间转换而不是将它们置于最前面?

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
            finish();

【问题讨论】:

  • 就过渡而言,也许这些不应该是单独的活动,而是具有多个片段或屏幕组合的单个活动。当用户决定这样做时,用户会将您的应用重新置于前台。
  • @CommonsWare,这些是问题的条件。我需要使用活动。

标签: java android start-activity


【解决方案1】:

根据文档

Android 10(API 级别 29)及更高版本对何时应用的限制 可以在应用在后台运行时启动 Activity。

解决方法:在特定情况下,您的应用可能需要紧急引起用户的注意,例如正在进行的警报或来电。您之前可能已经为此目的配置了您的应用,方法是在您的应用处于后台时启动一个 Activity。

要在运行 Android 10(API 级别 29)或更高版本的设备上提供类似的行为,请完成此guide 中描述的步骤。

您可以显示具有全屏意图的高优先级通知。

More Details

新要求的更新答案:供您发表评论 (好吧,请告诉我如何让后台的 startActivity() 也在后台启动活动,而不是从后台启动应用程序)

您可以添加一个 LifecycleObserver,当 LifecycleOwner 更改状态时会收到通知。

在您的活动 api 响应回调中使用以下条件

if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
            // Activity is in resumed state, Open new activity immediately
        } else {
            // else add a LifecycleObserver that will be notified when the LifecycleOwner changes state
            lifecycle.addObserver(object : DefaultLifecycleObserver {
                override fun onStart(owner: LifecycleOwner) {
                    super.onStart(owner)
                    // remove observer immediately so that it will not get triggered all the time
                    lifecycle.removeObserver(this)
                    // Activity is in start state again, Open new activity here
                }
            })
        }

【讨论】:

  • 这不是我想要的。用户需要点击通知。我需要在不分散用户注意力的情况下偷偷打开下一个 Activity。尝试自己创建一个包含两个活动的小项目,并在后台测试 startActivity。
  • 我理解您的要求......但这已经不可能了......这就是为什么我提到该解决方案是一种解决方法而不是确切的解决方案。
  • 好吧,请告诉我如何让后台的 startActivity() 也在后台启动活动,而不是从后台启动应用程序
  • @AlmecDoux 我已经更新了我的答案,希望对你有帮助