我正在开发的Android应用程序中使用基于GCM主题的消息传递。
它工作正常,但我想让用户选择停止接收推送消息。
当然,从应用程序设置禁用通知也可以,但是我想让用户禁用/启用来自应用程序的推送消息。

因此,我正在使用以下内容尝试取消订阅该主题(单击按钮):

GcmPubSub pubSub =  GcmPubSub.getInstance(this);
try{pubSub.unsubscribe(MyRegistrationToken,"MyTopic");}
catch(Exception e){e.printStackTrace();}


还确保订阅主题的后台服务在取消订阅时不会运行。但是,它似乎不起作用,因为取消订阅上述代码后我仍然收到推送消息。我是在做错什么还是错过了什么?

我找到了一种解决方法(只是在取消订阅时不显示通知),但实际上希望取消订阅,以便服务器停止将推送消息发送到设备。

任何帮助将不胜感激!

编辑:

现在使用8.3.0,没有任何区别。让我发布订阅和取消订阅的完整代码,如果这样做可以帮助您了解一下:
使用意向服务进行预订,如下所示:

try {
    InstanceID instanceID = InstanceID.getInstance(this);
    String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
    GcmPubSub pubSub = GcmPubSub.getInstance(this);
    pubSub.subscribe(token, "/topics/MyTopic", null);
} catch (Exception e) {
    e.printStackTrace();
}


单击按钮取消订阅活动,如下所示:

try {
    InstanceID instanceID = InstanceID.getInstance(this);
    String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

    GcmPubSub pubSub = GcmPubSub.getInstance(this);
    pubSub.unsubscribe(token, "/topics/MyTopic");
    Toast.makeText(this, "Successfully unsubscribed.", Toast.LENGTH_SHORT).show();
    finish();
} catch(Exception e) {
    e.printStackTrace();
    Toast.makeText(this, "Unable to unsubscribe..", Toast.LENGTH_SHORT).show();
    finish();
}


该按钮还退出活动。我什至尝试在注册时保存注册令牌(以共享首选项),并使用它取消订阅,以防生成新的instanceID导致问题。但是无论如何,单击按钮时,它将转到catch块。
单击取消订阅按钮后,请确保重新注册意图不起作用,这样我就看不到如何重新注册。似乎并未成功取消订阅。

谢谢!

最佳答案

订阅主题时,将主题指定为“ / topics / TOPIC_NAME”,退订时应使用相同的格式,因此请尝试:

GcmPubSub pubSub =  GcmPubSub.getInstance(this);
try{pubSub.unsubscribe(MyRegistrationToken,"/topics/MyTopic");}
catch(Exception e){e.printStackTrace();}


应该在UI线程之外(例如在意图服务中)调用订阅和取消订阅。

09-10 08:53
查看更多