我们是不是应该在 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) 中注销接收器的主要内容,如果未能解决你的问题,请参考以下文章
AWS SNS Android GCM - InvalidPlatformToken