Android 使用mqtt发送推送通知,从最近的应用程序刷卡时不工作
在具有以下libs的android中使用mqtt进行推送通知:Android 使用mqtt发送推送通知,从最近的应用程序刷卡时不工作,android,push-notification,notifications,android-service,mqtt,Android,Push Notification,Notifications,Android Service,Mqtt,在具有以下libs的android中使用mqtt进行推送通知: implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' 我遵循了教程,问题是,当应用程序打开时,它可以正常工作,但当它从最近的应用程序中被刷走时,它会停止工作,并且我无法再接收推送通知 感谢您的帮助 我
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
我遵循了教程,问题是,当应用程序打开时,它可以正常工作,但当它从最近的应用程序中被刷走时,它会停止工作,并且我无法再接收推送通知
感谢您的帮助
我尝试过的解决方案:
第一个解决方案:创建了一个服务,并在其中简单地创建了一个mqttclient,但从最近的应用程序中刷卡后,该服务不再工作
public class MqttService extends Service {
public MqttService(Context context) {
super();
}
public MqttService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
PahoDemo paho = new Paho(getApplicationContext(), "myTopic");
return START_STICKY;
}
@Override
public void onTaskRemoved(Intent rootIntent) {
Intent intent = new Intent("com.example.restart");
sendBroadcast(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
Intent intent = new Intent("com.example.restart");
sendBroadcast(intent);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
帕霍德莫:
public class Paho implements MqttCallback {
String topic;
MqttClient client;
Context context;
public Paho(Context context, String topic) {
this.context = context;
this.topic = topic;
try {
client = new MqttClient(StaticValue.getBROKER(), MqttClient.generateClientId(), persistence);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
client.connect(connOpts);
client.setCallback(this);
if (topic != null) {
client.subscribe(topic);
}
} catch (MqttException e) {
System.out.println("error: " + e);
e.printStackTrace();
}
}
@Override
public void connectionLost(Throwable cause) {
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.i("mqtt", "messageArrived ");
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Log.i("mqtt", token + "");
}
}
第二种解决方案:
在清单中添加了以下行:
<service android:name="org.eclipse.paho.android.service.MqttService" />
两天前我就这么做了。如果有人有任何想法,请提及。在调用messageArrived时,您不应该使用您无法访问的内容。例如,如果您想检查应用程序是否在前台,您可能会使用上下文,这样您的逻辑可能无法正常工作,因此请确保在MessageArrized中执行您可以执行的操作,如果您不确定您使用的对象是否可用,请以另一种方式执行操作(还要注意ConnectionLost)在哪里实现您的客户端?如果你想在应用程序关闭时订阅一个主题,你必须创建一个服务,但要使它活跃起来,你必须不断显示有关该主题的通知。起初我编写了自己的服务,但当应用程序从最近的应用程序中刷过时,它不工作,第二个使用了org.eclipse.paho.android.service.MqttService,但得到了相同的答案,请更明确地解释您的解决方案。检查此项,如果您在服务实施方面仍然存在问题,请更新您的问题,我将尝试帮助您解决问题。我知道,如果您有解决方案,请发布。提前感谢。您需要向我们展示您的尝试,我们将帮助您解决问题,我们不仅仅提供批发解决方案
public class MqttHelper {
public MqttAndroidClient mqttAndroidClient;
final String serverUri = "myBrokerUri";
final String clientId = MqttClient.generateClientId();
final String subscriptionTopic = "myTopic";
public MqttHelper(Context context){
mqttAndroidClient = new MqttAndroidClient(context, serverUri, clientId);
mqttAndroidClient.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean b, String s) {
Log.w("mqtt", s);
}
@Override
public void connectionLost(Throwable throwable) {
}
@Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
Log.w("Mqtt", mqttMessage.toString());
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
connect();
}
public void setCallback(MqttCallbackExtended callback) {
mqttAndroidClient.setCallback(callback);
}
private void connect(){
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setAutomaticReconnect(true);
mqttConnectOptions.setCleanSession(true);
try {
mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
subscribeToTopic();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.w("Mqtt", "Failed to connect to: " + serverUri + exception.toString());
}
});
} catch (MqttException ex){
ex.printStackTrace();
}
}
private void subscribeToTopic() {
try {
mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.w("Mqtt","Subscribed!");
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.w("Mqtt", "Subscribed fail!");
}
});
} catch (MqttException ex) {
System.err.println("Exceptionst subscribing");
ex.printStackTrace();
}
}
}