如果应用程序位于前台,替代操作的设计模式?
-
20-12-2019 - |
题
我正在构建一个利用 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 的指针,您可以调用它的任何方法、转发信息......