当前位置: 首页 > 知识库问答 >
问题:

Android 12-前台服务启动限制

沈旻
2023-03-14

我正在开发一个需要从后台启动前台服务的SDK。因为它使用后台定位和蓝牙相关的工作。如果应用程序被杀死,监控正在后台执行。这就是我使用前台服务的原因。有一个条件是从后台启动前台服务。

目前,我的SDK使用服务来处理此作业。但Android 12不支持从后台启动服务。

我正在尝试从以下异常引发的后台启动服务。

ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false

如何使用WorkManager解决此问题,我的所有处理都由Service类完成,以及如何将Service对象传递给Worker类并在Worker类中启动此作业。

实际上,我的项目是基于beacon技术的。信标信号用于向用户显示不同的建议。

在我当前的实现中,如果应用程序被用户终止,并且还接受前台服务,那么SDK将在后台运行。并检测信标并提供适当的操作。

我的实现是,如果应用程序使用前台服务“OFF”初始化我的SDK,然后某个时候,当应用程序在后台并试图从后台启动前台服务时,会引发此异常。前台服务相关的决策由服务器端API持有。我定期检查服务器端值是否更改,如果值更改,则更改的操作会反映在SDK中。

共有3个答案

令狐宣
2023-03-14

早些时候,我们使用服务来运行后台任务。但是,由于Android 12-前台服务启动限制,我们将无法调用服务来执行Android 12的后台任务。

所以从现在开始,从Target etSdk 31开始,Service只能在应用程序在前台时调用。当应用程序关闭或应用程序转到后台时,使用start Foreground Service调用Service会导致Foreground ServiceStartNotAlloweException

因此,要执行后台任务,我们需要使用工作人员,而不是服务人员。请参考此答案了解如何实施。希望有帮助。此外,请参阅以下链接,从较高的层次了解需要进行哪些更改。

>

  • Android 12行为变化

    工作请求

  • 汪典
    2023-03-14

    根据官方文档,如果您的应用程序执行以下操作之一,它应该能够启动FGS:

    您的应用接收到需要Bluetooth\u连接或Bluetooth\u扫描权限的Bluetooth广播。

    您的应用程序接收到与地理Geofence或活动识别转换相关的事件。

    至少从我的理解来看,这两个似乎是您用例的非常好的候选者。

    秋博容
    2023-03-14

    世界上没有人能给你答案。所有这些限制的想法是,我们作为开发人员需要优化我们的应用程序。因此,如果这对你来说是不可能的,这意味着你很可能需要优化你的工作方式。要做到这一点,您需要提供更多关于您正在接收的确切事件、您的具体用例等的信息。

    https://developer.android.com/about/versions/12/foreground-services#cases-fgs-background-starts-allowed

    如您所见,有以下例外情况的相关信息:

    您的应用接收到需要Bluetooth\u连接或Bluetooth\u扫描权限的Bluetooth广播。

    但是您的问题中没有任何内容表明您的用例可能与此相关。

    此外,我不明白这个应用程序是如何被杀死的,但你一直在后台工作。

    此外,如果你想不断地做一些事情,为什么会有一个事件,当你在后台。就在用户打开应用程序时,启动服务并继续运行。

    你也可以“破解”它,并要求用户将你从电池优化中删除。

    https://developer.android.com/training/monitoring-device-state/doze-standby#support_for_other_use_cases

     类似资料:
    • 我创建了一个跟踪设备移动位置的服务。服务由绑定到它的活动启动,在该活动中有一个“开始跟踪”按钮。当按下这个按钮时,我需要服务在前台启动,这样它就可以存储设备移动到的位置,即使与它绑定的活动已经关闭,或者应用程序被最小化。 以下是我的服务:

    • 我正在构建一个应用程序来检测Android上的iBeacons。基本功能是通过信标将广告数据存储到设备上,并将其上传到服务器。为此,我正在使用Android信标库。 当应用程序在非活动约30分钟后进入区域时发生的事件序列 首先,在didExit(图像) 之后重新启动,在这里您可以看到从区域11切换到区域9。中途应用程序关闭并立即重新触发,但没有发送推送 在第二个didExit(Image) 后退出

    • 我用Android BLE(蓝牙低能)开发了一个应用程序,它工作得很好,但当Android需要更多内存时,我的服务就被干掉了。 > 我正在使用具有单独进程的前台服务。 <接收器Android:name=“.BluetoOthleservice$MyReceiver”/> 为我效劳: 但当我的服务被操作系统杀死时,它就不会重新启动。我已经尝试关闭所有最近的应用程序,但没有得到任何解决方案.... 对

    • 问题内容: 我有一个flask应用程序,目前正在以以下方式启动: 当我运行此脚本时,它通过打印成功执行: 但是它永远不会返回,如果我执行CTRL-C,服务器将停止。我正在尝试将其部署到生产环境中,并希望在后台运行此启动,只要服务器启动,进程就可以启动。 做这个的最好方式是什么? 问题答案: 可能是使其在后台运行的最简单方法。就是说,如果你要将其转入生产环境(如@LukasGraf所提到的那样,则不

    • 服务启动前事件 function beforeWorkerStart(\swoole_server $server); 在执行beforeWorkerStart事件时,框架已经完成的工作有: frameInitialize 事件内的全部事务 frameInitialized 事件内的全部事务 错误处理函数的注册 swoole_http_server对象创建,且设置了启动参数。(未启动) 在该回调事

    • 这是我遇到的问题,与设计和实现相关: 我有一个接受 POST 请求的 REST Web 服务。没什么特别的。它当前以同步方式响应。 但是,此web服务将启动一个后台进程,这可能需要很长时间。 我不希望此服务在 30 分钟后响应。 相反,它应该立即向客户端返回一个ack响应,仅此而已(即使在30分钟后,也不会有更多的信息要发送)。 我如何在泽西实施这种行为? 我读了那一页https://jersey