我尝试通过新的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
为什么会这样?即使应用程序关闭,我该怎么办才能运行我的代码?
答案 0 :(得分:24)
根据我使用Firebase推送的经验:
问题:通过“Firebase控制台”发送推送通知时,仅在应用程序位于前台时才会收到通知。如果应用程序被终止或在后台运行,则通知仅在版本&gt; = lollipop中显示,其中包含不正确的通知图标和/或在应用程序中打开默认启动器活动,即使您已在PendingIntent中定义了不同的活动。
根据Firebase文档,推送消息分为2个部分,他们称之为: Docs Link here
发送“推送”消息有两种方法。
<强> 1。 Firebase控制台
<强> 2。消息传递API - 显示使用高级REST客户端的请求的图像
在onMessageReceived(...)
方法中收到推送消息。只有当消息通过Firebase控制台发送时,Firebase onMessageReceived(...)
方法才会 >> >>
如果您通过API发送消息,它可以正常工作。无论app是在后台,前台还是已杀死,都会以onMessageReceived(...)
方式传递消息。 (注意:这在>=Lollipop
中运行正常 - Android 4.4或更低版本的行为仍然无法预测。
更新:
您可以从API发送推送消息(firebase将其称为下游消息),如下所示:https://firebase.google.com/docs/cloud-messaging/downstream
要解决或“定位”下游消息,应用服务器将使用接收客户端应用的注册令牌设置为。您可以使用预定义字段或自定义数据消息发送通知消息;有关有效负载支持的详细信息,请参阅消息有效内容中的通知和数据此页面中的示例显示如何使用HTTP和XMPP协议发送数据消息。
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中有通知有效负载,那么问题是:
另外,要在通知时启用此点击功能,通知有效内容应包含名为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()