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

时间:2017-03-30 21:04:11

标签: android firebase notifications android-service firebase-cloud-messaging

根据设置指南here,在示例应用程序中,A)我创建了一个extends firebase服务类的类。 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());
    }
}

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服务。 那么,当onMessageReceive()appservice时,我能在多大程度上确保调用swipe closed/killed/force stop?相关行为是否记录在任何地方?

  3. 编辑:

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

1 个答案:

答案 0 :(得分:11)

  

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

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

  

2。我的理解是,无论我的应用状态如何,下游通知都会传送到我的移动设备的Google Play服务。那么,当onMessageReceive()appservice时,我能在多大程度上确保调用swipe closed/killed/force stop?相关行为是否记录在任何地方?

Receiving Message for Android is here的官方文档。它讨论了消息的行为(取决于您使用的消息有效负载的类型(即notificationdata)),以确定您的应用在前台和后台的时间。

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

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

有些设备是在滑动关闭应用时设计的,它与强制停止它们相同(请参阅我的回答here )。

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

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

  

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

AFAIK,FirebaseMessagingService与Google Play服务绑定,只要Google Play服务处于有效状态,Firebase服务也是如此。我answer here的一部分:

  

但是,我已经看到之前曾提到的FirebaseMessagingService(请参阅此post,@ ArthurThompson的评论):

     
    

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