15

我有一个GCM注册用户及其在数据库表中的相应注册ID的列表,实际上我想要在用户从表中删除时取消注册用户。我在Stackoverflow中发现了很多示例,但其中大部分都是基于现在已弃用的旧GCMRegistrar API。我使用Google云端通讯API,并通过以下方法注册用户:使用Android中的注册标识从GCM注销设备

private void registerUser(){ 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext()); 
     String regId = ""; 
     try { 
      regId = gcm.register(getString(R.string.project_number)); 
      Log.i("registrationId", regId); 
     } 
     catch (IOException e) { 
      Log.i("Registration Error", e.getMessage()); 
     } 
} 

我有一个管理员应用程序,它作为一个第三方的应用程序服务器,因为它推通知给所有用户。我想从这个管理员应用程序注销特定用户用下面的方法:

private void unRegister(String regId) { 

     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext()); 
     try { 
      gcm.unregister(); 
     } 
     catch (IOException e) {  
     System.out.println("Error Message: " + e.getMessage()); 
     } 

    } 

但是它混淆了我,注销()方法并不需要注册ID作为参数,这使得它无法注销特定的设备。有什么方法可以通过注册ID从GCM注销特定设备?

+1

笑,但你特定设备上运行此代码** **所以注销此特定设备... – Selvin 2015-01-21 00:03:50

+0

我在特定的用户设备上运行“注册”方法,但我必须从管理员设备取消注册用户。 – 2015-01-21 00:04:59

+1

管理员设备? GCM中没有这种东西 – Selvin 2015-01-21 00:05:47

回答

21

这种方法做的伎俩:

gcm.unregister(); 

然而,gcm.unregister()现在已经过时,因此,您必须使用其中的一个:

InstanceID.deleteToken()或实例id .deleteInstanceID()。

这些方法采取以下参数:

public void deleteToken (String authorizedEntity, String scope) 

得到授权的实体,您要删除的实体...

//下面的解释仅适用于“取消注册”

因此,根据您的意见:

但它让我感到困惑,注销()方法不会将注册 ID作为参数,因此无法注销特定的 设备。

这是因为您期待它以某种方式工作。好像你希望能够做一个HTTP请求将参数传递给uregister(如“http://www.gcmserver.com?unregisterid=xxxx”),这不是它的工作方式,这是它的工作原理基于谷歌文档的方式:

如何取消注册工作

应用程序可以在从设备上卸载 之后自动取消注册。但是,这个过程不会立即发生,因为Android不提供卸载回调。 发生在这种情况下如下:

最终用户卸载应用程序。

第三方服务器向GCM服务器发送消息。

GCM服务器将消息发送到设备。

的GCM客户端接收消息和查询包管理器被配置为接收它,这 返回false约 是否有广播接收器。

GCM客户端通知GCM服务器已卸载 应用程序。

GCM服务器标记要删除的注册ID。

第三方服务器向GCM发送消息。

GCM向第三方服务器返回NotRegistered错误消息。

第三方删除注册ID。

因此,基于的是,什么样的方法gcm.unregister()实际上做的是标记为删除(认为它作为迫使过程的第一步,而无需实际卸载该应用)该设备,让服务器知道它不再需要接收通知,也不需要将“Id”作为参数,这意味着它正在引用该特定设备。

商祺!

+0

GCM需要注销ID多少时间?我试图卸载应用程序并通过GCM发送消息。然后,我安装了应用程序,但我可以使用旧的gcm ID发送消息。 另一个问题;如果用户重新安装应用程序会怎么样?在这种情况下,设备会重复收到一条消息两次。因为在重新安装应用程序期间,如果GCM不尝试发送消息,则不会注意到该应用程序已卸载。 在将设备注册到GCM之前,我是否可以处理这种情况,如果我总是调用gcm.unregister()? – eren130 2015-12-24 07:57:56

+1

如果我想在用户注销应用程序时从GCM注销,该怎么办?是否应该创建一个新的IntentService以取消注册? – JGPhilip 2016-09-27 10:48:51