GCM 推送消息以在前台更新 UI 并在后台发布通知。如何实施?

Posted

技术标签:

【中文标题】GCM 推送消息以在前台更新 UI 并在后台发布通知。如何实施?【英文标题】:GCM Push message to update UI when foreground and post notification when background. How to implement this? 【发布时间】:2015-01-14 06:58:53 【问题描述】:

我收到了 GCM 推送消息。

如何决定是否必须更新 UI 或发布通知。

如果我们的应用在前台,那么我们可以更新 UI。如果我们的应用程序没有运行,那么我需要发布通知。这是否是正确的方法。或者其他任何处理方式。以及如何发现我的应用程序处于前台或后台。

提前致谢。

【问题讨论】:

***.com/questions/2166961/…检查一次。它对你有帮助。 是***.com/questions/7191413/…的副本吗? 不一样。在 GCM 中,我们有不同的实现。我们将在 onHandleIntent() 中获得推送消息。当应用程序处于前台时,如何使用处理程序更新 UI。或在应用程序处于后台时发布通知。请参考我遵循的这个新的 GCM 参考文档 - developer.android.com/google/gcm/client.html 我认为没有什么不同。您需要清楚何时使用此类组件,以及它们是如何工作的。 从您的回答中得到了线索,并在下面定义了我的回答。谢谢 Pankaj Kumar。 【参考方案1】:

如果您遵循 Android Dev 中的指南(特别是 this section),您的应用应该会发布通知,无论它是否在前台。

但是,如果您想更改位于前台的 Activity 的 UI,请修改 sendNotification() 方法中的 PendingIntent 以启动您的 Activity。您可以在关联的Intent 中附加附加信息。如果您的Activity 在后台,它将被启动并且附加功能将通过getIntent()Activity 的生命周期方法中提供。如果它在前台,将调用ActivityonNewIntent() 方法,您可以从那里再次获取您的附加信息(您从通知中发送的)。

【讨论】:

感谢您的回答。【参考方案2】:

是的,我自己找到了答案。

您当前的活动状态有 3 种不同。

    已恢复 - 静态引用可用 已停止 - 静态引用可用 已销毁 - 静态引用被丢弃
//Define static variable of your activity instance
public static FleetLocActivity mFleetLocActivity = null;

并在您的 GCMIntentService 中编写以下代码。只要有新的推送消息,就会调用这个类。

if (FleetLocActivity.mFleetLocActivity != null) 
**//Activity is in Stopped or Resumed State**
        handlePushMessage(pushMessage);
        // Start Service and Update UI with the help of Handler
 else 
**//Activity is in Destroyed State**
       // Post notification of received message. And Add the action of opening your home activity. When the user clicks the notification it will open the home activity and start the respective service by using activity instance. 
       mAppUtilInstance.postGcmCommandNotification(
                 "Command Received : " + pushMessage, mContext);



//Class variable updated with the received push message
private String pushMessage = "";

private void handlePushMessage(String pushMsg)
   Message msgObj = gcmCommandHandler.obtainMessage();
   Bundle bundle = new Bundle();
   bundle.putString(Constants.getInstance().GCM_SERVER_MESSAGE,pushMessage);
   msgObj.setData(bundle);
   gcmCommandHandler.sendMessage(msgObj);



/**
 * to handle the GCM push message (or) commands using Handler
 */
private Handler gcmCommandHandler = new Handler() 
    // Create handleMessage function
    public void handleMessage(Message message) 
        String pushMessage = message.getData().getString(
                Constants.getInstance().GCM_SERVER_MESSAGE);
        if (pushMessage != null && pushMessage.length() > 0) 
            //Start Service and update UI HERE
        
    
;

【讨论】:

以上是关于GCM 推送消息以在前台更新 UI 并在后台发布通知。如何实施?的主要内容,如果未能解决你的问题,请参考以下文章

iOS应用后台主题推送通知

GCM 推送通知在 iOS 上不起作用

当应用程序一天不活动时,GCM 推送通知不会出现在 iPhone 上

Android GCM Java 服务器 - 没有消息数据的推送通知

WebSocket实现数据库更新前台实时显示

GCM webpush 在后台