根据设置指南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 的通知!
这是我的问题:
谁启动了 FirebaseMessagingService 通知服务? 一定有某个地方调用了 startService(),不是吗?
我的理解是,无论我的应用处于何种状态,下游通知都会传送到我的移动设备的 google play 服务。 然后,当
app
或service
swipe closed/killed/时,我能在多大程度上确保调用我的
?是否在任何地方记录了相关行为?onMessageReceive()
强行停止
编辑:
- 我比较关心下面这个案例。让我们谈谈
数据消息
。 (与通知消息
相比。) 我的客户端应用收到 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 theapp
orservice
isswipe closed/killed/force stop
? Is the relevant behavior documented anywhere?
Receiving Message for Android is here 的官方文档.它讨论了当您的应用处于前台和后台时消息的行为(取决于您使用的消息负载类型(即 notification
或 data
))。
为了能够自己处理消息(在 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/