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' 我遵循了教程,问题是,当应用程序打开时,它可以正常工作,但当它从最近的应用程序中被刷走时,它会停止工作,并且我无法再接收推送通知 感谢您的帮助 我

在具有以下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'
我遵循了教程,问题是,当应用程序打开时,它可以正常工作,但当它从最近的应用程序中被刷走时,它会停止工作,并且我无法再接收推送通知 感谢您的帮助

我尝试过的解决方案:

第一个解决方案:创建了一个服务,并在其中简单地创建了一个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();
        }
    }
}