我正在构建一个利用 Google Cloud Messaging 接收推送通知的操作。

这涉及几个值得注意的组件,即:

  • A WakefulBroadcastReceiver 接收来自 GCM 的消息。
  • 一个 IntentService 当收到 GCM 事件时收到通知。

我确信许多应用程序都是这种情况,因此当应用程序在前台和后台有活动时,我想采取不同的方法。当应用程序执行时 不是 在前台有一个应用程序。

如果应用程序未处于活动状态,我想向通知抽屉发布通知,如果应用程序处于活动状态,则只需将事件转发到前台活动。

有这方面的设计模式吗?我应该如何确定应用程序是在前台还是在前台?的背景?

有帮助吗?

解决方案

您可以遵循中概述的方法 这篇博文 你在哪里创建一个 BroadcastReceiver 在你的 Activity 具有正优先级(即高于默认值 0) 拦截特定操作然后调用 abortBroadcast - 这处理应用程序打开的情况。然后您还可以注册一个 BroadcastReceiver 在您的清单中,它处理相同的操作,但处于默认优先级 - 如果应用程序未打开并且它创建系统通知,则这是后备。

然后你使用 sendOrderedBroadcast() 按优先顺序将您的广播发送给所有注册的接收者。如果活动已打开,则第一个将处理它。否则,它将默认使用另一个并创建通知。

其他提示

我建议的方法如下。

在服务中拥有有关 GCM 的所有逻辑(我从未使用过 IntentService, ,所以我不知道它的本质,但我看到它继承自 Service).

在您的活动中,您可能有一种启动服务的方法(也许用户通过按钮激活),这里没有什么新内容。

有趣的部分来了。在你的活动中你处理 onPause()onResume(). 。在 onResume()绑定 到服务。通过绑定机制,您可以获得指向您的服务的指针并让它知道您在那里”嘿服务,我是一个活动,我在这里......请在某处存储一个指向我自己的指针”,并且该服务存储一个指向该活动的指针(我们称其为 mActivity)。在你的 onPause() 您通知服务您要离开,因此服务设置 mActivity = null, ,然后你 解绑 从服务。

通过这种机制,每次 Service 收到推送通知时,都会测试 mActivity 变量来查看是否有绑定的 Activity。通过指向您的 Activity 的指针,您可以调用它的任何方法、转发信息......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top