我正在构建一项利用Google Cloud Messaging接收推送通知的操作。
这涉及一些值得注意的组成部分,即:
WakefulBroadcastReceiver
以接收来自GCM的消息。IntentService
。正如我对许多应用程序的确定情况一样,我想采用不同的方法来确定应用程序在前台有活动时与应用程序不有活动时应用程序在前台。
如果应用程序未处于活动状态,我想向通知抽屉发布通知,如果应用程序处于活动状态,则只需将事件转发到前台活动。
这有设计模式吗?我应该如何确定应用程序是否处于前台与背景之间?
答案 0 :(得分:3)
您可以按照this blog post中概述的方法,在BroadcastReceiver
中以Activity
创建具有正优先级的0
(即,高于abortBroadcast
的默认值)拦截特定的操作,然后调用BroadcastReceiver
- 这将处理应用程序打开的情况。然后,您还可以在Manifest中注册一个sendOrderedBroadcast()
来处理相同的操作但是默认优先级 - 如果应用程序未打开并且它创建了系统通知,则这是后备。
然后使用{{1}}按优先顺序将广播发送给所有已注册的接收者。如果活动是开放的,第一个将处理它。否则,它将默认为另一个并创建通知。
答案 1 :(得分:2)
我建议这样做的方式如下。
在服务中拥有关于GCM的所有逻辑(我从未使用过IntentService
,所以我不知道它的内容,但我发现它继承自Service
)。
在您的活动中,您可能有一种启动服务的方式(可能是用户通过按钮激活),这里没什么新内容。
这是有趣的部分。在您的活动中,您处理onPause()
和onResume()
。在onResume()
中绑定到服务。使用绑定机制,你可以得到一个指向你的服务的指针,让它知道你在那里“嘿服务,我是一个活动,我在这里......请在某个地方存储指针“,服务存储指向活动的指针(让我们称之为mActivity
)。在onPause()
,您通知服务您要离开,因此服务设置mActivity = null
,然后您取消绑定来自服务。
使用此机制,每次服务收到推送通知时,它都会测试mActivity
变量以查看是否存在绑定的活动。使用指向您的Activity的指针,您可以调用它的任何方法,转发信息......