【问题标题】:Is it possible to implement MQTT connection with WorkManager?是否可以使用 WorkManager 实现 MQTT 连接?
【发布时间】:2020-01-07 07:54:19
【问题描述】:
我正在开发一个应用程序,我们在其中维护与服务器的 mqtt 连接,以实时接收来自服务器的作业。
目前我们正在使用一种方法,即使应用程序被终止,我们也使用前台服务来保持连接活跃。
问题是长时间运行的服务会很快耗尽电池。而且我不确定它在不同供应商的设备中会有什么反应。
例如在小米设备中,如果应用程序没有启用自动启动设置,当应用程序被杀死时,服务将无法在前台启动。我已经解决了这个问题,但我不确定它是否适用于所有其他版本的 MIUI 和其他供应商。
此外,我还了解到较新的 android 版本将使用机器学习算法让耗电的应用程序进入睡眠状态。
所以我正在寻找另一种解决方案而不是前台服务。所以我问是否可以使用 WorkManager 实现这个场景?使用 WorkManager 而不是前台服务是个好主意吗?有没有更好的解决方案?
【问题讨论】:
标签:
android
mqtt
android-workmanager
foreground-service
【解决方案1】:
目前我们正在使用一种方法,即使用前台服务来保持连接处于活动状态,即使应用程序被终止也是如此。
Android 确保前台服务继续运行,如果被终止,很快就会再次启动它们。但是,前台服务需要发布一个粘性通知,对于始终运行的后台应用程序,这可能很烦人。还有另一种方法!您可以为您的应用 request Android to ignore battery optimizations。忽略电池优化的应用不受 Android O+ 后台限制,可以随时启动普通服务(不是前台服务)。
问题是长时间运行的服务会很快耗尽电池电量。
服务不会耗尽电池电量,而是网络活动会耗尽电池电量。网络活动来自 MQTT keepalive 属性。另请注意,电池消耗也很大程度上取决于底层网络传输技术。 WiFi 使用更少的电力,但蜂窝网络使用更多的电力。因此,为了保持与代理的可靠连接并降低电池使用量,您应该权衡保活与电池使用量。这里有一篇很好的文章来调整 keepalive 参数:
所以我想问是否可以使用 WorkManager 来实现这个场景?
不,WorkManager 作业是一次性作业,Android 会安排它们并在未来的特定时间运行它们。同时,您的应用进程可能会被杀死,并且代理会向您发送一条消息,然后当您的 JobService 再次启动时您将收到该消息,因此这不再是实时的,它现在是轮询而不是推送。