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

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

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

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

【问题讨论】:

    标签: android android-intent push-notification google-cloud-messaging server-push


    【解决方案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() 的调用?
    • 总结:确保您从 onDestroy() 处理程序调用 GCMRegistrar.onDestroy()。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多