使用单连接实例实现 Eclipse MQTT Android 客户端

2023-11-29

我在我的应用程序中使用 Eclipse Paho android mqtt 服务。我能够订阅消息并将消息发布到 mqtt 代理。 我的应用程序中有几个活动,当任何活动启动时,它都会使用以下方式连接到代理mqttAndroidClient.connect(null, new IMqttActionListener() {}并得到响应mqttAndroidClient.setCallback(new MqttCallback() {}.

我的问题:

  1. 这是实现 android mqtt 服务的正确方法吗?
  2. 有没有办法在整个应用程序中使用相同的连接和回调实例?

一个“更好”的方法是创建一个Service它连接/重新连接到 MQTT 代理。

我创建了自己的服务,名为MqttConnectionManagerService它维护和管理与代理的连接。

该解决方案的主要特点:

  1. 只要服务还活着,它就会维护一个实例。
  2. 如果服务被终止,Android 会重新启动它(因为START_STICKY)
  3. 设备启动时可以启动服务。
  4. 服务在后台运行,并始终保持连接以接收通知。
  5. 如果服务还活着,调用startService(..)再次会触发其onStartCommand()方法(而不是onCreate())。在此方法中,我们只需检查该客户端是否已连接到代理,并根据需要进行连接/重新连接。

示例代码:

MqttConnectionManager服务

public class MqttConnectionManagerService extends Service {

    private MqttAndroidClient client;
    private MqttConnectOptions options;

    @Override
    public void onCreate() {
        super.onCreate();
        options = createMqttConnectOptions();
        client = createMqttAndroidClient();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        this.connect(client, options);
        return START_STICKY;
    }

    private MqttConnectOptions createMqttConnectOptions() {
        //create and return options
    }

    private MqttAndroidClient createMqttAndroidClient() {
        //create and return client
    }

    public void connect(final MqttAndroidClient client, MqttConnectOptions options) {

        try {
            if (!client.isConnected()) {
                IMqttToken token = client.connect(options);
                //on successful connection, publish or subscribe as usual
                token.setActionCallback(new IMqttActionListener() {..});
                client.setCallback(new MqttCallback() {..});
            }
        } catch (MqttException e) {
            //handle e
        }
    }

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="...">

    <!-- Permissions required to receive BOOT_COMPLETED event -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- activities go here -->

        <!-- BroadcastReceiver that starts MqttConnectionManagerService on device boot -->
        <receiver android:name=".MqttServiceStartReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <!-- Services required for using MQTT -->
        <service android:name="org.eclipse.paho.android.service.MqttService" />
        <service android:name=".MqttConnectionManagerService" />
    </application>

</manifest>

MqttServiceStartReceiver

public class MqttServiceStartReceiver extends BroadcastReceiver {    
    @Override
    public void onReceive(Context context, Intent intent) {
        context.startService(new Intent(context, MqttConnectionManagerService.class));
    }
}

在您的活动中onResume()

startService(new Intent(this, MqttConnectionManagerService.class));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用单连接实例实现 Eclipse MQTT Android 客户端 的相关文章

随机推荐

  • NSNumber 计算和精度?

    两个简单的问题 如果可以的话 我应该如何获取两个 NSNumber 对象 执行计算并最终得到一个 NSNumber 的结果 NSNumber flux NSNumber alloc initWithDouble 100 0 NSNumber
  • 从隐藏的控制台应用程序显示表单

    我有一个运行控制台应用程序的主应用程序 控制台应用程序通常是隐藏启动的 ProcessWindowStyle Hidden 但出于测试目的 我可以使用显示的窗口来运行它 在控制台应用程序中 我可以加载和执行插件 其中一个插件尝试打开 Win
  • 为 HTML 表格行添加边框,

    是否可以为表格行加边框 tr 一次性而不是为单个单元格提供边框 td like table cellpadding 0 cellspacing 0 width 100 style border 1px tbody tr th style w
  • 如何在 OpenXML 段落、运行、文本中保留具有格式的字符串?

    我按照此结构将字符串中的文本添加到 OpenXML Runs 中 OpenXML Runs 是 Word 文档的一部分 该字符串具有新的行格式 甚至段落缩进 但是当文本插入到运行中时 这些都会被删除 我该如何保存它 Body body wo
  • 什么是 Angular 4?我可以从哪里了解更多相关信息?

    最近有人告诉我 Angular 4 它是什么 它与 Angular 2 有什么不同 我正在学习 Angular 2 我试图找到 Angular 4 的官方网站 但没有得到结果 我对此很好奇 EDIT Angular 4 网站现已推出here
  • UnitTestIsolationException:在发布/调试模式下运行 Shims 测试时引发异常

    我正在尝试使用 Microsoft Shims 运行此单元测试 但它引发了异常Shims Context Create 方法 环境 VS 2012 Win2K8 R2 namespace MyShimsUnitTest TestClass
  • 使用Python从电报通道获取信号并将其放入MT4中

    我想从 Telegram 频道读取消息 这是重要的外汇信号 并在 MT4 Windows 应用程序中下订单 现在 我制作了一个 python 脚本 用于监听频道并将消息存储在数据库中 我还可以解析消息以获取必要的值 例如 TP SL 等 现
  • BST 中某个节点的所有父节点?

    使用递归函数 预序 打印二叉搜索树 BST 时 我需要打印当前节点的所有父节点 路径形式的根 辅助数据结构可以 例如path在我的代码中 可以使用但我不想保留节点 gt 路径来存储路径 4 2 6 1 3 5 7 假设我使用预序遍历按行打印
  • 无法将数据插入 WPF 中的本地数据库

    在一个项目中 我有一个本地数据库 我使用数据网格来查看数据 但问题是当我使用插入查询插入数据库时 插入不持久 即当我重新运行应用程序时 数据库未更改 并且更改不会反映在数据库视图 在 Visual Studio 中查看表数据 中 插入查询是
  • 不可见的 reCAPTCHA 以多种形式发送空的 g-recaptcha-response

    我正在尝试使用谷歌隐形 reCAPTCHA 但它发送的是空的g recaptcha response当我在同一页面中有多个表单时 POST 参数 这是我的代码 谷歌JS Form 1
  • C++ Win32静态控制透明背景

    解决方案 如下所述 最好为文本创建自己的方法 而不是尝试让控件表现异常 因此 为此创建一个自定义控件是最好的 我找到了一个解释这一切的教程 http www codeproject com Articles 559385 Custom Co
  • 是什么导致 randomForest.partialPlot 函数出现这种奇怪的行为?

    我正在使用randomForestR 2 15 2 中的包 v 4 6 7 我找不到该程序的源代码partialPlot函数 我试图弄清楚它到底做了什么 帮助文件似乎不完整 它应该采用变量的名称x var作为一个论点 library ran
  • 关闭 tomcat 时停止计划的计时器[重复]

    这个问题在这里已经有答案了 我有一个部署到 Tomcat 服务器的 WAR 文件 其中一个类将在启动时被调用 然后 init 方法将安排一个计时器每 5 小时触发一次以执行一些任务 我的 init 代码如下所示 public void in
  • 如何使用 .htaccess 从 url 中删除 %20

    如何删除 20 还有更多来自 htaccess 的 url 我已经尝试了这篇文章中的代码 但仍然没有替换 重定向到新的网址 htaccess url 重写并删除 20 这是我的 htaccess 代码 RewriteEngine On Re
  • 仅使用一个 dbContext 对多个数据库执行投影

    我们正在将 EF Core 用于当前项目 该项目有三个数据库 这是一个真正无法避免的麻烦 数据库具有相同的结构 因此我们能够交换上下文并使用相同的 EF 模型来执行 CRUD 操作 我们有一个特别复杂的查询 我们将从传统的 ADO NET
  • 如何在iPad中实现文字转语音功能?

    是否有任何 3rd 方 API 可以提供文本转语音功能 Yes The CMU Flite 节日精简版 语音合成库已移植到iOS并且似乎在 App Store 中的许多 iPhone 和 iPad 应用程序中使用
  • 如何从 T 中减去 1,其中 T: num 特征::Num?

    我正在尝试创建一个适用于所有数字整数类型的特征 我认为限制它num traits Num将强制它仅适用于 u8 u16 等 因此 1 始终有效 pub fn divide round up
  • 在生产环境中,Socket.io websocket 在 Nuxt 3 中无法工作

    我正在 Nuxt 3 应用程序中创建一个 socket io 实现 当我处于开发模式时 Websocket 可以工作 但出现此错误错误信息 我使用的是 Nuxt 版本 nuxt v3 0 0 rc 8 这是我的 nuxt config ts
  • 将数据从一个表插入到另一个表

    我有两个不同的表 但列的命名略有不同 我想从一张表中获取信息并将其放入另一张表中 仅当表 1 中的 信息字段 不为空时 我才需要将表 1 中的信息放入表 2 中 每当创建某些内容时 表 2 都有一个唯一的 ID 因此插入的任何内容都需要获取
  • 使用单连接实例实现 Eclipse MQTT Android 客户端

    我在我的应用程序中使用 Eclipse Paho android mqtt 服务 我能够订阅消息并将消息发布到 mqtt 代理 我的应用程序中有几个活动 当任何活动启动时 它都会使用以下方式连接到代理mqttAndroidClient co