当我从gcm函数收到消息时,我有一个扩展GCMBaseIntentService的类:
@覆盖
protected void onMessage (Context context, Intent intent)
{
String message = intent.getExtras().GetString("alien");
generateNotification (context, message);
}
我希望当新消息到达时,应用程序会识别应用程序是否已打开且用户正在使用,或者是简单的后台服务,因此我会看到通知。 我需要知道它是在后台还是前台,有什么建议??
答案 0 :(得分:4)
当新消息到达时,应用程序会识别应用程序是否已打开且用户正在使用,或者是简单的后台服务,因此我看到了通知
为此,您可以使用进程内事件总线。让服务将事件发布到总线。当UI在前台时,让UI为这些事件订阅总线(例如,在onResume()
中注册,在onPause()
中取消注册)。让UI在UI获取事件时处理事件。如果UI未响应该事件,则该服务可以引发Notification
。
我有一些示例应用程序可以证明这适用于Android的三种流行事件总线实现:
LocalBroadcastManager
:https://github.com/commonsguy/cw-omnibus/tree/master/EventBus/LocalBroadcastManager
greenrobot的EventBus:https://github.com/commonsguy/cw-omnibus/tree/master/EventBus/GreenRobot
Square's Otto:https://github.com/commonsguy/cw-omnibus/tree/master/EventBus/Otto
答案 1 :(得分:1)
解决此问题的一种常见方法是使用事件总线将消息发布到应用程序的其余部分,以查看是否有人注册处理它。
Android的一个好的事件总线是greenrobot EventBus https://github.com/greenrobot/EventBus
如何操作的代码示例:
为您的消息创建一个类
public class MessageEvent {
public message;
public MessageEvent(String message) {
this.message = message;
}
}
将EventBus
添加到BroadcastReceiver
protected void onMessage (Context context, Intent intent) {
String message = intent.getExtras().getString("alien");
MessageEvent event = new MessageEvent(message);
EventBus.register(this);
EventBus.getDefault().post(event)
}
public void onEvent(NoSubscriberEvent event) {
if (event.originalEvent instanceOf MessageEvent) {
generateNotification(((MessageEvent) event.originalEvent).message));
}
}
然后,在您的活动中:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
// This method will be called on the main thread when a MessageEvent is posted
public void onEventMainThread(MessageEvent event){
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
这样,如果您的活动处于活动状态,则可以处理MessageEvent
,如果它未处于活动状态,您可以照常显示通知。
答案 2 :(得分:0)
GCM完全在后台运行,而不是在前台运行。
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
您将使用这两个权限来接收背景信息。
请阅读此内容。