2015-11-06 21 views
0

我正在開發的Android應用中使用基於GCM的主題消息。 它工作正常,但我想給用戶停止接收推送消息的選項。 當然,從應用程序設置禁用通知將工作,但我想讓用戶禁用/啓用應用程序的推送消息。適用於Android的GCM - 無法退訂主題

所以我使用了以下嘗試從主題的訂閱(上按一下按鈕):

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

,還要確保訂閱了該主題的後臺服務將無法取消訂閱的同時運行。然而,它似乎沒有工作,因爲我仍然在取消訂閱上述代碼後收到推送消息。我是否做錯了什麼或缺少什麼?

我找到了一個解決方法(只是不顯示通知,而不退訂),但想實際取消訂閱,以便服務器停止發送推送消息到設備。

任何幫助將不勝感激!

編輯:

使用8.3.0現在,沒有任何difference.Let我張貼了我的全部代碼訂閱&退訂,如果這會幫助你一些啓發: 使用意向的服務訂閱如下:

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(); 
} 

在BU tton也退出該活動。我甚至嘗試保存註冊令牌(在共享首選項中),同時註冊並使用它來取消訂閱,以防產生新的實例ID導致問題。但是不管怎麼樣,只要按一下按鈕,它就會進入catch塊。 點擊退訂按鈕後,確保註冊意向不起作用,因此我無法看到它是如何重新註冊的。它似乎並未成功取消訂閱。

謝謝!

回答

1

當您訂閱一個主題中,您指定主題爲「/主題/ TOPIC_NAME」,你應該退訂所以當使用相同的格式嘗試:

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

兩個訂閱和退訂應該被取消的UI線程,例如在意向服務中。

+0

那怎麼Iv'e做到了: – CoolCommando

+0

嘗試{pubSub.unsubscribe(MyRegistrationToken,「/主題/ MyTopic」);} – CoolCommando

+0

對不起,我無法重現這個,要麼你重新訂閱該主題的地方或取消訂閱在您的設備/仿真器上無法正常工作。我只能建議您確保使用最新版本的Google Play Services play-services-gcm:8.3.0 –

0

從一個新的線程刪除實例id似乎做的伎倆:

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

以及消息停止。