Android 如果应用程序位于前台,则为备用操作设计模式?

Android 如果应用程序位于前台,则为备用操作设计模式?,android,intentservice,Android,Intentservice,我正在构建一个action,它利用Google云消息来接收推送通知 这涉及到几个值得注意的组成部分,即: 从GCM接收消息的接收器 当收到GCM事件时通知的IntentService 正如我确信的那样,对于许多应用程序,当应用程序在前台有活动时,与应用程序在前台没有应用程序时,我希望采用不同的方法 如果应用程序未处于活动状态,我想向通知抽屉发送通知,如果应用程序处于活动状态,只需将事件转发到前台活动 这个有设计模式吗?我应该如何确定应用程序是在前台还是在后台?我建议这样做的方式如下 在服务中

我正在构建一个action,它利用Google云消息来接收推送通知

这涉及到几个值得注意的组成部分,即:

  • 从GCM接收消息的
    接收器
  • 当收到GCM事件时通知的
    IntentService
正如我确信的那样,对于许多应用程序,当应用程序在前台有活动时,与应用程序在前台没有应用程序时,我希望采用不同的方法

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


这个有设计模式吗?我应该如何确定应用程序是在前台还是在后台?

我建议这样做的方式如下

在服务中具有与GCM相关的所有逻辑(我从未使用过
IntentService
,因此我不知道它的勇气,但我看到它继承自
服务

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

有趣的部分来了。在活动中,您处理
onPause()
onResume()
。在
onResume()
中,您将绑定到服务。使用绑定机制,您可以获取指向服务的指针,并让它知道您在“嘿,服务,我是一个活动,我在这里……请将指向我自己的指针存储在某个地方”,服务将存储指向活动的指针(我们称之为
mActivity
)。在您的
onPause()
中,您通知服务您要离开,因此服务设置
mActivity=null
,然后您从服务中解除绑定


使用此机制,每次服务收到推送通知时,它都会测试
mActivity
变量,以查看是否存在绑定活动。通过指向活动的指针,您可以调用它的任何方法、转发信息

您可以遵循中所述的方法,在
活动中创建一个具有正优先级(即高于默认值
0
)的
广播接收器,该接收器拦截特定操作,然后调用
中止广播
——这将处理应用程序打开的情况。然后,您还可以在清单中注册一个
BroadcastReceiver
,该清单处理相同的操作,但优先级为默认优先级-如果应用程序未打开并创建系统通知,则这是回退


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

根据Android提供的功能,这是一个非常好的解决方案,似乎是最简单的方法。