Firebase推送通知更新数据库

时间:2016-06-14 10:50:03

标签: android firebase firebase-notifications

我尝试通过新的Firebase推送通知服务向用户发送一些数据。

我添加了一些"键值"带有'消息文字的自定义数据项' - " dbupdate"检测它是否是我要向用户显示的更新消息或正常推送通知。

在我的接收器中,我检查我是否有自定义数据并运行更新,如果为真。 如果不是这种情况,我会使用短信显示正常通知。

仅在我的应用程序打开时才有效。如果应用程序已关闭,则无论如何都会显示通知,而我的if检查甚至无法运行,

一些代码:

public class PushMessageService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Map<String,String> data = remoteMessage.getData();
        String link = data.get("link");
        String name = data.get("name");
        if (link!=null) {
            Log.d("link",link);
            Log.d("name",name);
            UpdateHelper.Go(this, link, name);
        }
        else {
            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_shop_white_24dp)
                            .setAutoCancel(true)
                    .setContentTitle(remoteMessage.getNotification().getTitle())
                   .setContentText(remoteMessage.getNotification().getBody());
            NotificationManager mNotificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.notify(5, mBuilder.build());
        }
    }
}

示例notficiation here

为什么会这样?即使应用程序关闭,我该怎么办才能运行我的代码?

3 个答案:

答案 0 :(得分:24)

根据我使用Firebase推送的经验:

问题:通过“Firebase控制台”发送推送通知时,仅在应用程序位于前台时才会收到通知。如果应用程序被终止或在后台运行,则通知仅在版本&gt; = lollipop中显示,其中包含不正确的通知图标和/或在应用程序中打开默认启动器活动,即使您已在PendingIntent中定义了不同的活动。

根据Firebase文档,推送消息分为2个部分,他们称之为: Docs Link here

  1. 通知
  2. 数据有效负载
  3. enter image description here

    解决方案:

    发送“推送”消息有两种方法。

    <强> 1。 Firebase控制台

    Console

    <强> 2。消息传递API - 显示使用高级REST客户端的请求的图像

    Curl Request

    onMessageReceived(...)方法中收到推送消息。只有当消息通过Firebase控制台发送时,Firebase onMessageReceived(...)方法才会 > >

    如果您通过API发送消息,它可以正常工作。无论app是在后台,前台还是已杀死,都会以onMessageReceived(...)方式传递消息。 (注意:这在>=Lollipop中运行正常 - Android 4.4或更低版本的行为仍然无法预测。

    更新:

    您可以从API发送推送消息(firebase将其称为下游消息),如下所示:https://firebase.google.com/docs/cloud-messaging/downstream

    从服务器发送下游消息

    要解决或“定位”下游消息,应用服务器将使用接收客户端应用的注册令牌设置为。您可以使用预定义字段或自定义数据消息发送通知消息;有关有效负载支持的详细信息,请参阅消息有效内容中的通知和数据此页面中的示例显示如何使用HTTP和XMPP协议发送数据消息。

    HTTP POST请求

    https://fcm.googleapis.com/fcm/send
    Content-Type:application/json
    Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
    
    { "data": {
        "score": "5x1",
        "time": "15:10"
      },
      "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
    }
    

答案 1 :(得分:2)

当您的应用程序位于前台时,通知将传递给FirebaseMessagingService.onMessageReceived()。当应用程序不在前台时,通知将由默认通知中心处理。

另见:

答案 2 :(得分:1)

在Android 中,如果您想在应用中更新某些应用是否处于forground / background / terminated状态,那么最好的方法是删除通知有效负载并仅发送数据有效负载

{ 
 "to" : "ee8....DYarin",
    "data" : {
         "key" : "value"
    }   
}

在这种情况下,onMessageReceived()将被执行。 (在某些Android设备中,例如xiomi,您需要为应用程序启用自动启动以处理已终止状态的推送)

在这种情况下,您将如何向用户显示通知?您可以将标题和正文作为自定义标记传递到数据有效负载中,并以编程方式生成通知。 所以在Android中一切顺利,没有通知负载。

如果您在Android中有通知有效负载,那么问题是:

  • 如果app处于forground状态顺利,则会显示通知 和onMessageReceived()执行
  • 如果应用处于后台/已终止状态,则会在您的设备上显示通知 onMessageReceived()仅在您单击通知时才有效。 用户倾向于经常清除它们和我们的代码 onMessageReceived()不会被执行。

另外,要在通知时启用此点击功能,通知有效内容应包含名为click_action的密钥:

"notification":{
        "title":"Prime",
        "body" : "test",
         "click_action": "my_click_action_name"
}

您需要在活动中将操作注册为 intent_filter

 <intent-filter>
                <action android:name="my_click_action_name" />
                <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

当用户点击通知时,会调用有效活动的onNewIntent()方法,并且数据有效负载在相应的intent.getExtras()

中可用