Paho MQTT Android服务唤醒活动

8
我正在尝试使用Paho Android MQTT库(从这里下载)。 示例服务应用程序正常工作,当示例应用程序运行时,订阅发布方法也正常工作。但是当我关闭它时,设备不再接收消息通知。 有没有人有经验如何正确修改/实现服务以便在应用程序未运行时接收消息?

1
你曾经解决过这个问题吗?我遇到了类似的问题,即使应用程序已经关闭,我仍想保持服务运行。 - Coova
1
暂时还没有。很抱歉,我现在工作太忙了,无法处理这个业余项目,但如果我能让它正常运行,我会把我的解决方案发给你。 - wyzard
我已经取得了一些进展。我实现了一个包含MqttClient对象(以及setCallback、connect、subscribe等方法)的服务(START_STICKY)。这样,即使我的活动没有运行,我的应用程序也能接收回调通知。目前我的问题是:在小米设备上,我无法实现“开机启动服务”的功能,因为MIUI有一个内置的安全组件,会拒绝它,但这是另一个问题。 - wyzard
5个回答

6
据我理解,Paho是您所需的一切。在我的应用程序中,只要我想要,paho mqtt-service就永远不会停止。 我使用以下代码片段在Android清单中注册了Paho服务。
‹!-- Mqtt Service --›
‹service android:name="com.ibm.android.service.MqttService" /›

这应该能解决问题。
更多信息请参阅http://www.eclipse.org/paho/files/android-javadoc/index.html的描述。

2
如果您给答案投反对票,请告诉我原因。尤其是当您投反对票给我所有的答案时,请告诉我!我在这里学习,所以如果有我可以做得更好的地方,请告诉我! - kdoteu
谢谢。我又有一些空闲时间了,所以很快就会继续这个项目。 :) - wyzard
你是从哪里启动服务的?如果服务是从活动中启动的,则应该随着活动一起销毁服务。但是,你可以重新连接,但像其他帖子所说,这并不能保证连接或回调。 - Clocker
该服务应该从Android操作系统启动,如@Kane所预期的那样。因此,它不受活动的影响。 - kdoteu
请问您能否提供一个样例给我们吗?如果我理解正确:有一个MqttService,它连接到代理并订阅指定的主题,发布消息等...,那么应该还有另一个自己的服务,允许我的应用在后台接收消息,即使我的活动已经销毁了?如果我是对的,我的后台服务应该包括什么? - wyzard

3

Mqtt服务有些类似于库,而不是一般的服务。它只是由您的应用程序连接给定的代理并订阅指定主题。MqttAndroidService库在被Android OS启动后并不知道代理和主题。

因此,正确的方法是为您的应用程序拥有一个后端服务,该服务了解代理和主题的详细信息。您的服务负责在适当的时间重新连接Mqtt代理并订阅主题。


1
你可能是对的,但在paho官方网站上(https://eclipse.org/paho/clients/android/)声明“为Android客户端应用程序提供长时间运行的服务,以处理发送和接收消息,当应用程序的主要活动可能没有运行时”。 - user2814778

1

谢谢,我会尝试的。 - wyzard
请在此处查看MQTT Paho Android服务示例:http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.java.git/tree/org.eclipse.paho.android.service/org.eclipse.paho.android.service.sample - Teixi

1
Paho的Android库运作良好。只是一旦应用程序进入后台,维护连接状态就变得困难。为了提供任何其他功能,如在后台状态下存储连接选项、发布/订阅主题,需要在库级别进行一些重写。
我的观察:-
1.一旦建立连接,MqttService即使应用程序进入后台,也会保持连接活动状态。除非系统服务管理器杀死应用程序及其服务。这一切都可能发生,除非网络保持不间断。
2.该服务具有自己的Alarm Manager来保持自身活动状态。
我进行了一次实验,并制定了一个小解决方案,可以帮助在整个应用程序的活动中保持连接对象可访问性。除非您断开连接。
PS:- 解决方案非常简单。但它确实像魔法一样运作。

https://github.com/ameykshirsagar/mqttconnectionpersistence

我还没有实现一种方法,使得在应用程序的活动被销毁后 MqttService 仍然保持活动状态。


0

如果你所说的“关闭”是指“强制停止”应用程序,那么是的,这会完全停止应用程序,你将无法接收到消息(但这可能正是用户想要的)。

然而,如果你所说的“关闭”是指用户/Android杀死应用程序,那么你之所以无法接收通知,是因为你不再与代理服务器“连接”了。

一个解决方案是创建一个自定义Service来管理连接。

查看我的答案这里,了解我使用的详细解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接