我正在开发的Android应用中使用基于GCM主题的消息传递。 它工作正常,但我想让用户选择停止接收推送消息。 当然,从应用程序设置中禁用通知也可以,但我想让用户禁用/启用来自应用程序的推送消息。
所以我使用以下内容尝试取消订阅主题(点击按钮):
GcmPubSub pubSub = GcmPubSub.getInstance(this);
try{pubSub.unsubscribe(MyRegistrationToken,"MyTopic");}
catch(Exception e){e.printStackTrace();}
同时确保订阅该主题的后台服务在取消订阅时不会运行。但是,它似乎没有工作,因为我在取消订阅上述代码后仍然收到推送消息。我做错了什么或遗失了什么?
我找到了一个解决方法(只是在取消订阅时没有显示通知),但是想要实际取消订阅,以便服务器停止向设备发送推送消息。
非常感谢任何帮助!
编辑:
现在使用8.3.0,没有任何区别。让我发布我订阅的完整代码&取消订阅,如果这样可以帮助你解决问题: 使用intent-service进行订阅,如下所示:
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导致问题。但无论如何,按下按钮,它都会进入捕获区。 一旦点击取消订阅按钮,确保注册意图不起作用,所以我无法看到它如何重新注册。它似乎没有成功取消订阅。
谢谢!
答案 0 :(得分:1)
当您订阅主题时,您将主题指定为" / topics / TOPIC_NAME",取消订阅时应使用相同的格式,请尝试:
GcmPubSub pubSub = GcmPubSub.getInstance(this);
try{pubSub.unsubscribe(MyRegistrationToken,"/topics/MyTopic");}
catch(Exception e){e.printStackTrace();}
应该从UI线程调用subscribe和unsubscribe,例如在意向服务中。
答案 1 :(得分:0)
从新线程中删除InstanceID似乎已经成功了:
final InstanceID instanceID = InstanceID.getInstance(this);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
instanceID.deleteInstanceID(); }
catch (Exception e) {
e.printStackTrace(); } } });
thread.start();
消息停止了。