2013-04-12 32 views
3

我想在用户单击按钮后取消注册GCM。我尝试了以下代码来取消注册,但即使在所有这些初始化后,我仍然设法将通知推送到设备。如果我在这里遗漏任何东西,请告诉我。取消注册后GCM仍然收到通知

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
     case R.id.options_logout: 
      ServerUtilities.unregister(getApplicationContext(), ServerUtilities.registrationID); 
      unRegisterGCM(); 
      return true; 
     case R.id.options_exit: 
      finish(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
protected void onDestroy() { 
    Log.i(TAG,"onDestroy........."); 
    helper.close(); 
    if (mRegisterTask != null) { 
     mRegisterTask.cancel(true); 
    } 
    unregisterReceiver(mHandleMessageReceiver); 
    super.onDestroy(); 
} 

public void unRegisterGCM(){ 
    Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER"); 
    unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
    startService(unregIntent); 

    Intent intent = new Intent(MessageList.this, LoginScreen.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
    finish(); 
} 

登录

04-12 16:20:23.039: I/MessageList(1912): onDestroy......... 
04-12 16:20:26.523: V/GCMBroadcastReceiver(1912): onReceive: com.google.android.c2dm.intent.REGISTRATION 
04-12 16:20:26.523: V/GCMBroadcastReceiver(1912): GCM IntentService class: com.mon.GCMIntentService 
04-12 16:20:26.523: V/GCMBaseIntentService(1912): Acquiring wakelock 
04-12 16:20:26.531: V/GCMBaseIntentService(1912): Intent service name: GCMIntentService-0987654321-2 
04-12 16:20:26.531: E/GCMRegistrar(1912): internal error: retry receiver class not set yet 
04-12 16:20:26.531: V/GCMRegistrar(1912): Registering receiver 
04-12 16:20:26.535: D/GCMBaseIntentService(1912): handleRegistration: registrationId = null, error = null, unregistered = com.mon 
04-12 16:20:26.535: D/GCMRegistrar(1912): resetting backoff for com.fl.monitor 
04-12 16:20:26.535: V/GCMRegistrar(1912): Saving regId on app version 1 
04-12 16:20:26.621: I/GCMIntentService(1912): Device unregistered 
04-12 16:20:26.621: V/GCMRegistrar(1912): Is registered on server: false 
04-12 16:20:26.621: I/GCMIntentService(1912): Ignoring unregister callback 
04-12 16:20:26.621: V/GCMBaseIntentService(1912): Releasing wakelock 
04-12 16:20:58.156: V/GCMBroadcastReceiver(1912): onReceive: com.google.android.c2dm.intent.RECEIVE 
04-12 16:20:58.156: V/GCMBroadcastReceiver(1912): GCM IntentService class: com.mon.GCMIntentService 
04-12 16:20:58.156: V/GCMBaseIntentService(1912): Acquiring wakelock 
04-12 16:20:58.160: V/GCMBaseIntentService(1912): Intent service name: GCMIntentService-1234567890-3 
04-12 16:20:58.164: I/GCMIntentService(1912): Received message 
04-12 16:20:58.167: I/GCMIntentService(1912): project:GHI 

回答

1

首先,注销您应使用此代码:

注销从GCM

从GCM注销,做如下:

Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER"); 
unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
startService(unregIntent); 

在您的代码中,您将SENDER_ID替换为“app”。

其次,我不确定GCMRegistrar.unregister(this)会做什么(我不使用它),但我认为这是一种捷径,与上面的3行代码一样,所以调用没有意义都。第三,假设您使用的IntentService类似代码(我有一个扩展Google的C2DMBaseReceiver的类),当注册完成时应该调用onUnregistered。如果没有被叫,你的设备仍然被注册。我建议你使用调试器运行应用程序,看看哪些方法被调用。

+0

'unregIntent.putExtra( “应用程序”,PendingIntent.getBroadcast(此,0,新的意向(),0));'我只需要我分配到SENDER_ID “应用程序”?我将它更改为“app”,并删除了GCMRegistrar.unregister(this)。但我仍然设法收到消息。我在问题中添加了我的日志。 –

0

放在2行以下注销您的GCM。

GCMRegistrar.unregister(NotificationsActivity.this); 
GCMRegistrar.onDestroy(NotificationsActivity.this); 
相关问题