关闭应用程序时如何避免处理来自 GCM 的推送通知

Posted

技术标签:

【中文标题】关闭应用程序时如何避免处理来自 GCM 的推送通知【英文标题】:How to avoid processing push notifications from GCM when the app is closed 【发布时间】:2016-03-10 11:01:37 【问题描述】:

我正在将推送通知集成到具有这种特殊行为的应用上:

只有在通知处于打开状态(前台或后台)时,应用才会处理通知

当用户使用最近的应用程序堆栈(或类似的东西)关闭应用程序时,我的问题出现了,因为并不总是调用 onDestroy() 方法并且应用程序无法从 GCM 中删除令牌。如果我此时发送推送通知,应用程序会处理它。

我一直在找这个问题,好像大家都有相反的问题,应用关闭时收不到通知。

是否有配置广播接收器在关闭时不唤醒我的应用程序?或者有什么方法可以做到这一点?

谢谢

【问题讨论】:

这将对您有所帮助:***.com/questions/23558986/… 【参考方案1】:

有两种方法可以实现,

第一种方法:当您从堆栈中清除应用程序时调用此方法,我的意思是在您的应用程序任务中,OnDestroy 或 OnTerminate。这将清除您的设备令牌,因此您将不会再收到通知。

但是您必须确保当您返回应用程序时,您需要重新注册并将您的设备令牌发送到服务器,以便您可以正常接收通知。

GCMRegistrar.unregister(context);

第二种方法: 您可以使用 sharedpreferences,您可以使用布尔值创建它。您必须在启动应用程序时将值设置为 true,在清除它时设置为 false。

然后在您的 GCMIntentService 类中,您可以在 onMessage 方法中使用此首选项。您可以在那里设置条件,如果值为 true,则将触发通知,否则不会显示任何内容。

在这种情况下,服务器会触发通知,但您的通知不会显示在通知栏中。

希望这些信息对您有所帮助。

【讨论】:

如果用户遵循应用程序的常规流程,则他在开始时注册并在结束时取消注册。问题是 onDestroy() 方法并不总是被调用(例如,当您按下主页按钮然后从最近的应用程序堆栈中关闭应用程序时),因此您的任何方法在这种情况下都是有效的 您的意思是当您从堆栈中清除应用程序时要获取事件? 要获得该事件,您可以创建一个应用程序类(扩展应用程序),然后您必须在该类中调用 onTerminate 方法并在那里调用您的取消注册方法。它会为您工作。【参考方案2】:

使用广播接收器。在 onStart 中注册并在 Activity 的 onStop 中取消注册。

如果您有多个活动并在 GCM IntentService 中执行某项操作,如果您的应用未运行,您希望阻止这些活动,则在共享首选项中保持计数,并在所有活动中增加 OnStart 并减少 onStop。当您收到 GCM 时,请检查计数是否为正,以确保您的应用处于前台。

【讨论】:

应用程序必须在应用程序处于后台时处理通知(并且始终为此状态调用 onStop() 方法)

以上是关于关闭应用程序时如何避免处理来自 GCM 的推送通知的主要内容,如果未能解决你的问题,请参考以下文章

如何在锁定屏幕上显示 gcm 推送通知?

如何接收应用程序停止或设备关闭时发送的 GCM 推送通知?

避免在 Android 中使用通知推送从 GCM 显示自动通知

使用 GCM 关闭应用程序时在 iOS 中接收推送通知

如何通过 GCM 向 iOS 设备发送推送通知?

应用程序完全关闭时不出现 Android 推送通知(使用 node-gcm)