今天是“是芥末!日”了,大家有什么紧急的事情要处理了没?

今天也是冬至,大家有没有回家团聚呀?

恩,今天特殊的日子,说下题外话,问候一下大家。

回到主题,最近项目上需要在 android 上实现通知服务,目前比较流行的通知协议,就是 IBM 设计的 MQTT 协议,在开源的支持下,java 有其相应的类库,可以应用在 android 上,那就是 wmqtt 。

具体实现的 demo ,可以参考这里

这里主要只说一个问题:

我们的项目需要在 andriod 4.0 的平板上面进行开发,相应的项目也是用 4.0 的 SDK 进行开发的。

上面链接提供的 demo 在 android 下运行没有任何问题,可是将后台服务移植到我们的程序上时,日志就报错了,报错信息如下:

connecting…
MqttException:NULL
Rescheduling connection in 18000ms.
Service started with intent = null.

为了解决这个问题,我又将我的修改后的文件移植到 demo 里面进行运行,没有发生任何问题。比对了两天,最终只发现两个不一样的地方。

一个是 AndroidManifest.xml 文件中的 Min/Target/Max SDK Version;

一个是 project.properties 文件中的 target。

在最后尝试一下,最终确定了问题所在。在于 SDK 版本的选择。

选择Min SDK Version 低于 10 即可。

并且不要填写 Target/Max SDK Version ,

project.properties 文件中的版本控制这当前编译时调用的 android 支持包的版本。

最后思考一下为什么会这样子:

mqtt 3.1 版本最后确定已经是一零年的事情了。当时 android 正好是 2.3 版本,当时编写的 wmqtt java 支持包是基于 android 2.3 的方法,到 android 4.0 时,可能有些网络协议的方法规定了一些其他必填的内容,导致了在 4.0 支持包下运行出错。所以必须修改最低 SDK 版本以支持旧的网络协议特性。

按照上面的方法去做,最终还是有不完善的地方。当我们在开发界面时,调用到 fregment 切片布局特性时,将无法编译通过,因为这个特性的最低 SDK 版本为 10 ,所以在 android 4.0 同一程序下编译通知服务与界面设计,只能取其一,不能两全其美了。

最终,我们的项目将 MQTT 通知服务单独做成一个安装程序让并调用主程序处理数据。

这样的项目还有一个缺点,就是单独的通知服务程序,在手机上必须有程序图标,并且必须被用户运行一次,因为 android 4.0 以上有一个这样的特性,用户没有点击启动过的程序,不允许一安装就让其自动启动。