适用于Android的GCM-无法取消订阅某个主题

时间:2015-11-06 13:02:30

标签: android google-cloud-messaging

我正在开发的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导致问题。但无论如何,按下按钮,它都会进入捕获区。 一旦点击取消订阅按钮,确保注册意图不起作用,所以我无法看到它如何重新注册。它似乎没有成功取消订阅。

谢谢!

2 个答案:

答案 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();

消息停止了。