gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:50:45 28 4
gpt4 key购买 nike

我在我的应用程序中使用 Eclipse Paho android mqtt 服务。我能够订阅消息并将其发布到 mqtt 代理。我在应用程序中有几个 Activity ,当任何 Activity 开始时,它使用 mqttAndroidClient.connect(null, new IMqttActionListener() {} 连接到代理并在 mqttAndroidClient.setCallback(new MqttCallback() {} 中获取响应。

我的问题:

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

最佳答案

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

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

此解决方案的主要特点:

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

示例代码:

MqttConnectionManagerService

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));
}
}

In your Activity's onResume()

startService(new Intent(this, MqttConnectionManagerService.class));

关于java - 使用单一连接实例实现 Eclipse MQTT Android 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40926546/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com