根据此处的设置指南,在示例应用中,A)我创建了一个extends
Firebase服务类的类。 B)我把这些类放在AndroidManifest.xml
A) 爪哇类
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) 安卓清单.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/force stop
时调用我的onMessageReceive()
?相关行为是否记录在任何地方?
编辑:
- 我更关心以下情况。让我们谈谈
data message
.(与notification message
相比。 我的客户端应用收到了 FCM 消息并显示默认通知,因为 google Play 服务正在运行并将其发送到系统托盘。但是我的onMessageReceive()
没有被调用,因为MyFirebaseMessagingService
被系统杀死并且没有重新启动。可能吗?
1.谁启动了 FirebaseMessagingService 通知服务?一定有某个地方在调用startService(),不是吗?
SDK 会自动为您执行此操作。
2. 我的理解是,无论我的应用处于何种状态,下游通知都会传递到我的移动设备的 google Play 服务。那么,我可以在多大程度上确保在
swipe closed/killed/force stop
app
或service
时调用我的onMessageReceive()
?相关行为是否记录在任何地方?
接收安卓消息的官方文档在这里。它讨论了消息的行为(取决于您使用的消息有效负载的类型(即notification
或data
)) 表示应用位于前台和后台时。
为了能够自己处理消息(onMessageReceived()
),您必须发送仅data
消息有效负载。
对于关于滑动关闭/杀死/强制停止的话题,这个话题已经讨论了很长时间,似乎没有明确的答案。在我的一次测试中,如果我滑动关闭我的应用程序,我仍然能够收到一条消息(使用仅限data
的消息有效负载进行测试)。但是当我从"设置"菜单中强制关闭它时,我无法收到任何消息。请注意,这并不总是行为。
有些设备的设计是,当您滑动关闭应用程序时,它与强制停止它们相同(请参阅我的答案 这里).
还有一些设备,即使应用程序仍然只是简单地滑动,即使它没有强制关闭,设备本身也会阻止它接收消息。其他人说情况不可能,因为像WhatsApp这样的应用程序能够做到这一点。到目前为止,我了解到的原因是因为设备制造商已将大多数知名应用程序列入白名单,以便成为可能。
所以只是为了回答你的问题,没有。这在任何地方都没有记录,因为(IMO)这是一个也取决于设备的主题,并且FCM无法完全控制。
3.我比较关心以下情况。让我们谈谈数据消息。(与通知消息相比。我的客户端应用收到了 FCM 消息并显示默认通知,因为 google Play 服务正在运行并将其发送到系统托盘。但是我的onMessageReceive()没有被调用,因为MyFirebaseMessagingService被系统杀死并且没有重新启动。可能吗?
AFAIK,FirebaseMessagingService与Google Play服务绑定,只要Google Play服务处于活动状态,Firebase服务也会激活。我在这里回答的一部分:
但是,我已经看到之前提到过
FirebaseMessagingService
(请参阅这篇文章,@ArthurThompson的评论):这些服务将由始终在设备上运行的 Google Play 服务启动。您不必也不应该自己启动/停止这些服务。
我测试了不同品牌的手机,得到了一些基本的结论。
让我们先关注Pixel手机,因为它保留了几乎相同的框架源代码。如果您在没有前台服务的情况下构建应用程序,则滑动以终止该应用程序,则它无法获得任何 fcm 推送。但是,如果您使用前台服务构建应用程序,则滑动以终止该应用程序,然后它能够接收 fcm 推送。
这是因为滑动以杀死应用程序不会杀死前台服务,即使所有活动都在后台堆栈之外。只要您的应用程序保持活动状态,它就能够接收 fcm 推送。
但是,如果您在"设置"中强制停止应用程序或卸载该应用程序,则应用程序和前台服务将完全关闭。在此情况下,应用无法接收任何 fcm 推送。
我还测试了小米和三星手机。我们需要授权自启动权限或关闭电池优化。然后,他们的应用程序的前台服务无法通过滑动来终止应用程序。因此,他们的应用程序可以接收 fcm 推送。