使用单连接实例实现 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 客户端 的相关文章

  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 如何在 Eclipse 中使用其他外部 jar 依赖项创建不可运行/不可执行的 jar

    我无法通过 Eclipse 导出向导创建普通的 jar 不可运行 不可执行 它仅创建 jar 文件 但不会导出依赖的 jar 从而在从其他类调用导出的 jar 的方法时出现错误 请帮助 非常感谢 kurellajunior的建议 它是通过使
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • Android 中的列表视图分页

    我有一个列表视图 其中显示了 50 个元素 我决定对视图进行分页 以便视图的每个部分都有 10 个元素 然后单击 下一个 按钮以获取下一个 10 个元素 如何设置10个数据 我关注这篇文章http rakhi577 wordpress co
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 从 @JsonProperty 值获取枚举常量

    我有一个标有 JsonProperty 的枚举 用于使用 Jackson 进行 JSON 序列化 反序列化 并且希望获取给定字符串 JsonProperty 的枚举值 public enum TimeBucket JsonProperty
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 在 Java 中将弯音发送到 MIDI 音序器

    我了解启动和运行 MIDI 音序器的基础知识 并且希望能够在播放过程中增加 减小序列的音高 但弯音是发送到合成器而不是音序器的消息 我尝试将音序器的接收器设置为合成器的发射器 当我发送弯音短消息时 音序器保持相同的音调 但随后合成器以新的弯
  • Java:java.util.ConcurrentModificationException

    我正在制作 2D 目前正在研究用子弹射击 子弹是一个单独的类 所有项目符号都存储在称为项目符号的数组列表中 当它超出屏幕一侧 Exception in thread main java util ConcurrentModification
  • SDK >=26 仍需要 mipmap/ic_launcher.png?

    在 Android 中 有两种指定启动器图标 可以说是应用程序图标 的方法 老 方式 在 mipmap 文件夹中指定不同的 png 文件 通常命名为 ic launcher png 但可以通过以下方式设置名称android icon mip
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • Activity 类型中的方法 showDialog(int) 在 Android 中已被弃用?

    方法showDialog int 从类型Activity is 已弃用 什么原因 以及如何解决 什么原因 http developer android com reference android app Activity html show
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • Flash 对象未显示在phonegap android 中

    我已经在 android 手机间隙创建了一个应用程序 我有一个屏幕 我想显示一个静态 flash obj 所以我在屏幕 HTML 页面中放入了以下代码
  • 春季 CORS。在允许的来源中添加模式

    查看CORS的弹簧指南 以下代码启用所有允许的来源 public class MyWebMVCConfigurer extends WebMvcConfigurerAdapter Override public void addCorsMa
  • 如何在布局编辑器中模拟沉浸式模式

    我想在布局编辑器中全屏查看我的布局 我正在使用 eclipse 插件 我已经通过选择隐藏了 ActionBar NoActionBar组合中的主题 但导航栏是一个不同的故事 AFAIK 它只能使用代码中的标志来隐藏 我需要在活动 xml 文

随机推荐

  • 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