使用FCM进行Android通知 - 谁启动了FirebaseMessagingService?

Wei*_*eng 11 notifications android android-service firebase firebase-cloud-messaging

根据这里的设置指南,在示例应用程序中,A)我创建了一个extendsfirebase服务类的类.B)我把这些课程放在了AndroidManifest.xml

A)Java类

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

B)AndroidManifest.xml

<service
    android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)

然后,该应用程序可以从FCM接收通知!

这是我的问题:

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

  2. 我的理解是,无论我的应用程序状态如何,下游通知都会传送到我的移动设备的Google Play服务.然后,我可以保证什么程度,我onMessageReceive()被调用的时候,app或者serviceswipe closed/killed/force stop?相关行为是否记录在何处?

编辑:

  1. 我更关注以下案例.我们来谈谈data message.(与notification message.相比.)我的客户端应用程序收到FCM消息并显示默认通知,因为Google Play服务正在运行并将其发送到系统托盘.但我onMessageReceive()没有被调用,因为MyFirebaseMessagingService被系统杀死而没有重新启动.可能吗?

AL.*_*AL. 13

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

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

2.我的理解是,下游通知将传送到我的移动设备的谷歌播放服务,无论我的应用程序状态如何.然后,我可以保证什么程度,我onMessageReceive()被调用的时候,app或者serviceswipe closed/killed/force stop?相关行为是否记录在何处?

Android版接收消息的官方文档就在这里.它讨论了应用程序处于前台和后台时消息的行为(取决于您使用的消息有效负载的类型(即notificationdata)).

为了能够自己处理消息(in onMessageReceived()),您必须发送data- 消息有效负载.

关于刷卡关闭/杀死/强制停止的主题,这个主题已经讨论了很长一段时间,似乎没有明确的答案.在我的一次测试中,如果我轻扫关闭我的应用程序,我仍然能够收到一条消息(使用data- 测试消息有效负载进行测试).但是当我从"设置"菜单强制关闭它时,我无法接收任何消息.请注意,这并不总是行为.

有一些设计,当你的设备刷卡关闭的应用程序,这将是一样的止动力(请参阅我的答案在这里).

还有一些设备,即使应用程序仍然只是被轻扫一下,即使它没有强行关闭,设备本身也会阻止它接收消息.其他人则认为情况并非如此,因为像WhatsApp这样的应用程序能够做到这一点.到目前为止,我之所以学到这一点,是因为设备制造商已将大多数知名应用程序列入白名单.

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

我更关注以下案件.我们来谈谈数据信息.(与通知消息相比.)我的客户端应用程序收到FCM消息并显示默认通知,因为Google Play服务正在运行并将其发送到系统托盘.但是我的onMessageReceive()没有被调用,因为MyFirebaseMessagingService被系统杀死而没有重新启动.可能吗?

AFAIK,FirebaseMessagingService 与Google Play服务捆绑在一起,因此只要Google Play服务处于活动状态,Firebase服务也会启用.我回答的部分内容如下:

但是,我已经看到之前提到的FirebaseMessagingService(参见这篇文章,@ ArthurThompson的评论):

这些服务将由Google Play服务启动,该服务始终在设备上运行.您不必也不应该自己启动/停止这些服务.