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

标签 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 服务。 然后,当 appservice swipe closed/killed/时,我能在多大程度上确保调用我的 onMessageReceive()强行停止?是否在任何地方记录了相关行为?

编辑:

  1. 我比较关心下面这个案例。让我们谈谈数据消息。 (与 通知消息 相比。) 我的客户端应用收到 FCM 消息并显示默认通知,因为 google play 服务正在运行并将其发送到系统托盘。但是我的 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- 消息负载.

关于swipe closed/killed/force stopped的话题,这个话题已经讨论了很长时间了,似乎没有一个确定的答案。在我的一项测试中,如果我 我能够仍然收到一条消息(使用数据测试-消息负载)轻扫关闭我的应用程序。但是当我从“设置”菜单强制关闭它时,我无法接收任何消息。请注意,这总是这种行为。

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

还有一些设备,即使应用程序仍然只是滑动,即使它没有强制关闭,设备本身也会阻止它接收消息。其他人说这不可能是因为像 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 Play 服务处于 Activity 状态,FirebaseMessagingService 就与 Google Play 服务绑定(bind),Firebase 服务也将如此。我的一部分 answer here :

However, I've seen that it was previously mentioned before for FirebaseMessagingService (see this post, 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.

关于使用 FCM 的 Android 通知 - 谁启动了 FirebaseMessagingService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128290/

相关文章:

java - 如何创建json解析的模型类?

reactjs - 如何将 firebase 的 firestore/admin sdk 与 next.js 一起使用

Android 预定通知

android - 获取通知 Intent 附加功能

android - 如何在 Android 中设置音频均衡器

android - Android 上的 SQLite 是否使用为 FTS 启用的 ICU 分词器构建?

javascript - 是否有用于 javascript 的 firebase admin sdk?

swift - Firestore 数据库不存储数据

ios - 发布推送通知应用程序

java - 有没有办法让 SharedPreferences 在我的整个 Android 应用程序中全局化?