如果设备收到来自 fcm 的推送通知,如何向处于终止状态的 android 应用程序显示/通信/广播消息

Posted

技术标签:

【中文标题】如果设备收到来自 fcm 的推送通知,如何向处于终止状态的 android 应用程序显示/通信/广播消息【英文标题】:how to show/communicate/broadcast messages to android app that is in killed state if device receives push notification from fcm 【发布时间】:2016-10-25 09:35:35 【问题描述】:

如果设备收到来自 fcm 的推送通知并且应用程序处于终止状态,我想更新应用程序图标上传入的未读消息标记计数。 如果应用程序在后台,我可以这样做,但如果应用程序处于终止状态,我就不能这样做。 如果我收到 fcm 推送通知,则它仅显示在通知托盘中,但我想如何传递或与被杀死的应用程序通信。 那么是否有任何解决方案以及如何实现这一点。 谢谢, 肉山

【问题讨论】:

【参考方案1】:

是的,请参考 https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

请注意,通知消息(应用程序处于终止状态)由 android 系统处理

但是,如果收到的通知是数据负载通知,那么它会被移交给应用程序的 FCMlistener 的 onMessageRecieved 方法,因此将您发送到设备的通知类型从通知消息更改为数据消息,一旦您从数据消息中提取您的消息,然后您可以在那里构建一个通知以显示或运行任何进程或方法,即使应用程序处于终止状态

public class MyFcmListenerService extends FirebaseMessagingService 
String TAG = "FCM";
@Override
public void onMessageReceived(RemoteMessage message)
    String from = message.getFrom();
    Map data = message.getData();

    Log.e(TAG, "From: " + from);
    Log.e(TAG, data+"Notification Message To : " + data.get("name") +"\n body:"+data.get("body")+"\n time to live:"+data.get("time_to_live"));
    sendNotification( data);


在您的应用程序中创建此类,在 MyFcmListenerService.java 中 并使用数据消息作为您的 fcm 通知,它会根据您的需要工作

【讨论】:

我认为您从 background 状态误解了 killed 状态。您提供的文档中没有提到处理处于 killed 状态的通知。 它在文档的第二段中说关于 FCM 消息 消息类型 使用 FCM,您可以向客户端发送两种类型的消息: 通知消息,有时被认为是“显示消息”。数据消息,由客户端应用处理。 "handeld by the client app" 表示无论处于何种状态,android 都不会干预,只会将消息发送给 app。 是的。这就是它在背景上时的行为。不是在它被杀死时。这个documentation 显示了它。 我同意你的看法@AL,由于 android 是一个开放平台,各种 OEM 提供可能会阻碍 FCM 工作的自定义设置和限制,我想说对于大多数 OEM 来说,我的 FCM 通知正在发送对于我的应用程序的客户,如果您在某处找到更好的解决方案或更令人信服的文档,如果您在此处分享,那就太好了,我的应用程序完全依赖于 FCM。

以上是关于如果设备收到来自 fcm 的推送通知,如何向处于终止状态的 android 应用程序显示/通信/广播消息的主要内容,如果未能解决你的问题,请参考以下文章

如果 Android 设备长时间处于空闲状态,则不会收到推送通知

如何使用 google api 向多个设备发送 FCM 推送通知?

当应用程序处于后台状态时,FCM多次推送通知无法正常工作

iOS 模拟器或物理设备未收到 FCM 数据消息

如何通过 GCM 向 iOS 设备发送推送通知?

如果应用程序终止,则未收到 iOS FCM 推送通知