Android通知与FCM - 谁启动了FirebaseMessagingService?

27
根据设置指南此处,在示例应用程序中, A) 我创建了一个扩展 Firebase 服务类的类。 B) 我将这些类放在AndroidManifest.xml中。
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 Play服务,无论我的应用程序处于什么状态。 那么,在我的appserviceswipe closed/killed/force stop时,我能保证onMessageReceive()被调用的程度有多大?相关的行为有没有文件记录?

编辑:

  1. 我更关心以下情况。我们来谈论一下data message。(相比于notification message。) 我的客户端应用程序收到了FCM消息并显示默认通知,因为Google Play服务正在运行并将其发送到系统托盘。但是我的onMessageReceive()没有被调用,因为MyFirebaseMessagingService被系统杀死并且未重新启动。这可能吗?
2个回答

26

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

SDK会自动为您完成此操作。

2. 我的理解是,无论应用程序处于什么状态,下行通知都将传递到我的移动设备的Google Play服务。那么,我在app或service被swipe close/killed/force stop时如何确保我的onMessageReceive()被调用?这个相关的行为是否有文件记录?

官方文档中关于Android接收消息的部分在这里。它讨论了消息的行为(取决于您使用的消息负载类型(即notificationdata)),以及当您的应用程序在前台和后台运行时的情况。

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

对于与swipe close/killed/force stopped相关的主题,这个主题已经讨论了一段时间,似乎没有明确的答案。在我的一个测试中,如果我 swipe close 我的应用程序,我仍然可以< strong>接收到消息(使用data - only消息负载进行测试)。但是当我从设置菜单中强制关闭它时,我< strong>无法接收任何消息。请注意,这种行为并非总是如此。

有一些设备设计了这样的功能,即当您滑动关闭应用程序时,它将与强制停止它们相同(请参见我的答案这里)。

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

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

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

据我所知,FirebaseMessagingService与Google Play服务是关联的,只要Google Play服务处于活动状态,Firebase服务也会保持活动。来自我的答案中的部分内容:

然而,我之前曾看到过关于FirebaseMessagingService的提及(请参见此帖子,ArthurThompson的评论):

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


谢谢!您能详细说明一下第一个问题吗?“SDK会自动为您完成这个操作。”指的是哪个SDK?是Android/FCM SDK吗?它是如何实现的?我只需要在清单文件中注册自己的服务类并期望它自动启动吗? - Weishi Z
请参见问题编辑。谢谢。 - Weishi Z
1
嗨。据我所知,服务会在您的应用程序启动时(由 FCM SDK)自动启动(我认为这对于服务来说是预期的行为)。关于这个问题没有太多的参考资料,因为据我回忆,SDK 的目的是不再考虑这些事情,只需专注于根据需要处理回调。"我应该只是在清单中注册自己的服务类,并期望它也自动启动吗?" -- 取决于你。我以前没有尝试过,但我认为它应该可以(如果您扩展 FirebaseMessagingService)。 - AL.
我应该只是在清单中注册自己的服务类并期望它自动启动吗?但我不得不注册它,并通过广播接收器明确地处理引导调用,否则它在引导时无法工作。我遵循了这个(https://dev59.com/W2sz5IYBdhLWcg3wv6ju#7690600)帖子来处理引导。 - Jcorretjer
即使注册并处理广播,有时仍然无法正常工作。 - Jcorretjer

1

我测试了不同品牌的手机,并得出了一些基本结论。

让我们先关注Pixel手机,因为它几乎保持了相同的框架源代码。如果您构建一个没有前台服务的应用程序,您可以滑动以关闭该应用程序,那么它将无法获得任何fcm推送。但是,如果您构建一个具有前台服务的应用程序,您可以滑动以关闭该应用程序,那么它就有能力接收fcm推送。

这是因为滑动以关闭应用程序不会关闭前台服务,即使所有活动都已退出后堆栈。只要您的应用程序保持活动状态,那么它就有能力接收fcm推送。

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

我还测试了小米和三星手机。我们需要授权自启动权限或关闭电池优化。然后,它们的应用程序的前台服务就无法通过滑动以关闭应用程序而关闭。因此,它们的应用程序可以接收fcm推送。


如果你有新的问题,请点击 Ask Question 按钮进行提问。如果它可以帮助提供上下文,请包含这个问题的链接。- 来自审核 - Marco Aurelio Fernandez Reyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接