使用mqtt发送推送通知,从最近使用的应用程序刷卡后无法正常工作

时间:2018-08-08 11:02:43

标签: android push-notification notifications android-service mqtt

使用mqtt在具有以下库的android中进行推送通知:

implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'

我遵循了this教程,问题是当应用打开时它可以正常工作,但是当从最近的应用中刷掉它时,它停止工作并且我不再能收到推送通知 >   感谢您的帮助

我尝试过的解决方案:

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

}

PahoDemo:

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" />

从mainactivty的Oncreate调用了此帮助器类:

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

那是我两天前以来所做的一切。如果有人有任何想法,请提及。

1 个答案:

答案 0 :(得分:0)

在调用messageArrived时,您不应使用您无法访问的内容。例如,如果您想检查应用程序是否位于前台,则可以使用上下文,这样您的逻辑可能无法正常工作,因此请确保您执行在messageArrived中可以执行的操作,并且不确定是否使用的对象是可用另一种方式(也请注意connectinLost)