Firebase推送通知更新数据库

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

我添加了“消息文本” – “dbupdate”的一些“键值”自定义数据项,以检测是否是要显示我的用户的更新消息或正常的推送通知。

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

它只有在我的应用程序打开时才有效 如果应用程序closures,通知显示无论如何,我如果检查甚至没有运行,

一些代码:

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 在这里

为什么? 即使应用程序closures,我还能做些什么来运行我的代码?

根据我对Firebase推送的经验:

问题:通过“Firebase控制台”发送推送通知时,仅当应用程序处于前台时才会收到通知。 如果应用程序被终止或在后台,即使您已经在PendingIntent中定义了不同的Activity,通知也仅在版本> =棒棒糖中显示,并且具有不正确的通知图标和/或在应用程序中打开默认的启动器活动。

根据Firebase文档,推送消息分为2个子文件夹,他们将其称为: 文档链接

  1. 通知
  2. 数据负载

在这里输入图像描述

解:

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

1. Firebase控制台

安慰

2.消息API – 显示使用高级REST客户端的请求的图像

卷曲请求

Push消息在onMessageReceived(...)方法中被接收。 如果应用程序处于后台, Firebase onMessageReceived(...)方法将不会被调用, 或者仅在通过Firebase控制台发送消息时才会调用Firebase onMessageReceived(...)方法。

如果你通过API发送消息,它工作正常。 消息是在onMessageReceived(...)方法中传递的,无论应用程序是在后台还是在前台或是被终止。 (小心:这是工作正常>=Lollipop – Android 4.4或以下的行为仍然是不可预知的。

更新:

您可以从API(firebase称为下游msg)发送推送消息,如下所示: 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..." } 

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

另请参阅:

  • 仅当CheckBoxPreference被选中时才能推送Firebase通知?

  • 在收到的Firebase通知(FCM)上打开应用程序

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

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

在这种情况下, onMessageReceived()将被执行。 (在一些像xiomi这样的android设备中,你需要为你的应用程序启动autostart来处理终止状态的推送)

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


如果你在Android中有通知载荷,那么问题是:

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

此外,要启用此通知上的点击function,通知有效内容应包含名为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()可用。