我正在开发的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线程之外(例如在意图服务中)调用订阅和取消订阅。