Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android版GCM-无法取消订阅主题_Android_Google Cloud Messaging - Fatal编程技术网

Android版GCM-无法取消订阅主题

Android版GCM-无法取消订阅主题,android,google-cloud-messaging,Android,Google Cloud Messaging,我正在开发的Android应用程序中使用基于GCM主题的消息传递。 它工作正常,但我想让用户选择停止接收推送消息。 当然,从应用程序设置中禁用通知会起作用,但我想让用户禁用/启用应用程序中的推送消息 因此,我使用以下方法尝试取消订阅该主题(单击按钮): 还要确保订阅主题的后台服务在取消订阅时不会运行。但是,它似乎不起作用,因为在使用上述代码取消订阅后,我仍然收到推送消息。我是做错了什么还是遗漏了什么 我已经找到了一个解决办法(只是在取消订阅时不显示通知),但我希望实际取消订阅,以便服务器停止向设

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

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

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

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

任何帮助都将不胜感激

编辑:

现在使用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();
}
按以下方式单击按钮取消订阅活动:

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导致问题。但不管怎样,只要按一下按钮,它就会进入捕捉区。 单击“取消订阅”按钮后,确保“注册”功能不起作用,因此我看不出如何重新注册。它似乎没有成功取消订阅


谢谢

订阅某个主题时,请将该主题指定为“/topics/topic\u NAME”,取消订阅时应使用相同的格式,因此请尝试:

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

订阅和取消订阅都应该从UI线程中取消,例如在intent服务中。

从新线程中删除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();

消息已停止。

请尝试{pubSub.unsubscribe(MyRegistrationToken,“/topics/MyTopic”);}很抱歉,我无法复制此消息,可能是您正在某个位置重新订阅主题,或者取消订阅在您的设备/模拟器上无法按预期工作。我只能建议您一定要使用最新版本的Google Play Services Play Services gcm:8.3.0编辑的文章,并提供更多详细信息。谢谢