Android FCM 通知 - 谁启动了 FirebaseMessagingService?

Android Notification with FCM - Who started the FirebaseMessagingService?

根据设置指南 here,在一个示例应用程序中,A) 我创建了一个 class extends firebase 服务 class。 B) 我把这些 classes 放在 AndroidManifest.xml

A) Java Class

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //a) What's the life cycle of the service? How can I ensure this method is getting called?
        //b) If the service is killed at some point, will system restart it on receiving new messages?
        Log.d(TAG, "From: " + remoteMessage.getFrom());
    }
}

B) AndroidManifest.xml

<service
    android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

然后,应用程序可以接收来自 FCM 的通知!

这是我的问题:

  1. 谁启动了 FirebaseMessagingService 通知服务? 一定有某个地方调用了 startService(),不是吗?

  2. 我的理解是,下游通知将传送到我的移动设备的 google 播放服务,无论我的应用程序处于什么状态。 那么,当appserviceswipe closed/killed/force stop时,我能在多大程度上确保调用我的onMessageReceive()?是否在任何地方记录了相关行为?

编辑:

  1. 我比较关心下面这个案例。让我们谈谈data message。 (与 notification message 相比。) 我的客户端应用程序收到 FCM 消息并显示默认通知,因为 google 播放服务是 运行 并将其发送到系统托盘。但是我的onMessageReceive()没有调用,因为MyFirebaseMessagingService被系统杀掉了,没有重启。可能吗?

1. Who started the FirebaseMessagingService notification service? There must be some place calling startService(), isn't it?

SDK 会自动为您执行此操作。

2. My understanding is that, the downstream notification will deliver to my mobile device's google play service, regardless of the state of my app. Then, to what extent can I ensure that my onMessageReceive() is called when the app or service is swipe closed/killed/force stop? Is the relevant behavior documented anywhere?

Receiving Message for Android is here 的官方文档。它讨论了当您的应用程序处于前台和后台时消息的行为(取决于您使用的消息负载类型(即 notificationdata))。

为了能够自己处理消息(在 onMessageReceived() 中),您必须发送 data- 消息负载。

关于滑动closed/killed/force停止的话题,这个话题已经讨论了好久了,似乎没有一个确定的答案。在我的一项测试中,如果我 仍能收到一条消息 (使用 data- 消息负载进行测试) 滑动关闭 我的应用程序。但是当我从“设置”菜单强制关闭它时,我无法收到任何消息。请注意,并非 始终如此。

有些设备被设计为当您滑动关闭应用程序时,它与强制停止它们相同(看我的回答).

还有一些设备,即使应用程序仍然只是简单地滑动,即使它没有强制关闭,设备本身正在阻止它接收消息。其他人说这不可能是因为像 WhatsApp 这样的应用程序能够做到这一点。到目前为止我了解到的原因是因为设备制造商已经将大多数知名应用列入白名单使其成为可能。

所以只是回答你的问题,不。这在任何地方都没有记录,因为(IMO)这是一个也取决于设备的主题,并且 FCM 没有完全控制

3. I am more concerned about the following case. Let's talk about the data message. (compared to the notification message.) My client app received the FCM message and shows the default notification, because google play service is running and send it to the system tray. But my onMessageReceive() is not called, because MyFirebaseMessagingService is killed by system and not restarted. Is it possible?

AFAIK,只要 Google 播放服务处于活动状态,FirebaseMessagingService 就与 Google 播放服务 绑定 ,Firebase 服务也将如此。我的一部分 answer here:

However, I've seen that it was previously mentioned before for FirebaseMessagingService (see this , comment by @ArthurThompson):

These services will be started by Google Play services, which is always running on the device. You don't have to and should not start/stop these services yourself.

我测试了phone个不同的品牌,得到了一些初步的结论。

让我们首先关注 Pixel phone,因为它保留了几乎相同的框架源代码。如果你构建一个没有前台服务的应用程序,你滑动杀死应用程序,那么它就无法获得任何 fcm 推送。但是如果你构建了一个有前台服务的应用程序,你滑动杀死应用程序,那么它就有能力接收fcm推送。

这是因为滑动杀死应用程序不会杀死前台服务,即使所有活动都在后台。只要您的应用程序保持活动状态,它就有能力接收 fcm 推送。

但是如果你在设置中强行停止应用程序或者卸载应用程序,那么应用程序和前台服务将被彻底关闭。在这种情况下,应用程序无法接收任何 fcm 推送。

我还测试了小米和三星phones。我们需要授权自启动权限或者关闭电池优化。然后他们的应用程序的前台服务不能通过滑动杀死应用程序来关闭。因此,他们的应用程序可以接收 fcm 推送。