我们是不是应该在 gcm (Android) 中注销接收器

Posted

技术标签:

【中文标题】我们是不是应该在 gcm (Android) 中注销接收器【英文标题】:Should we unregister the receiver in gcm (Android)我们是否应该在 gcm (Android) 中注销接收器 【发布时间】:2013-03-27 07:32:51 【问题描述】:

注册成功后,我从 GCM 收到了deviceId。我将我的deviceId 存储在SharedPreferences 中。在主要活动中,我在 onDestroy() 方法中取消注册接收器。 如果我不取消注册接收者,那么我会收到内存泄漏错误。 这些错误会影响应用程序吗? 如果是这样,那么我应该什么时候取消注册接收器? 我的应用程序中没有注销按钮。

我什至怀疑如果我们取消注册接收器,我们是否能够接收推送通知?

请帮帮我。我完全糊涂了。

【问题讨论】:

【参考方案1】:

我认为从 GCM 服务注销与在活动中声明的广播接收器注销之间存在误解。

您发布的错误类型:

MainActivity 泄露了最初在这里注册的 IntentReceiver MainActivity$1@416321f0。您是否错过了对 unregisterReceiver() 的调用

当您在onMessage() 收到消息时,看起来就像当您使用广播接收器从 GCMIntentService 接收 Intents 时一样。

private final BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() 
   @Override
   public void onReceive(Context context, Intent intent) 
   ....
   

在这种情况下,是的,您必须调用 unregisterReceiver(myBroadcastReceiver) 来避免内存泄漏错误。

此操作不会取消推送通知,它只会阻止广播接收器侦听这些意图。 GCMIntentService 仍会收到消息。

【讨论】:

没错。当我在 onMessage() 收到消息时,我使用广播接收器从 GCMIntentService 接收意图。非常感谢。【参考方案2】:

如果您从 GCM 服务中注销,您将不再收到推送通知。

【讨论】:

但是如果我不取消注册,那么我会遇到内存泄漏错误。这些错误会影响我的应用程序吗? 您将不得不详细说明您所说的“内存泄漏错误”。你在logcat中看到这个吗?如果是的话,你会发布它吗? MainActivity 泄露了最初在这里注册的 IntentReceiver MainActivity$1@416321f0。您是否错过了对 unregisterReceiver() 的调用? 看起来像这样:***.com/questions/11278464/… 总结:确保您从 onDestroy() 处理程序调用 GCMRegistrar.onDestroy()。【参考方案3】:

您可能不想取消注册。一旦您卸载应用程序(最终),它将自行取消注册。在此之前,您只想保持开启状态,以便接收通知。

【讨论】:

以上是关于我们是不是应该在 gcm (Android) 中注销接收器的主要内容,如果未能解决你的问题,请参考以下文章

使用 GCM 的 Android 聊天应用

AWS SNS Android GCM - InvalidPlatformToken

如何在phonegap上使用GCM处理android中的多个推送通知

回滚/取消 android-gcm 通知

APNS 或 GCM 设备令牌验证

Android GCM 中的通知生成问题