FirebaseMessagingService默认在后台运行吗?

11

FirebaseMessagingService是否像IntentService一样在后台运行?

我看到FirebaseMessagingService扩展了Service,而Service并不在后台运行,但我想确定我是否应该在FirebaseMessagingService内部异步或同步地执行任何工作。

2个回答

18
FirebaseMessagingService 的方法 onMessageReceived(RemoteMessage message) 是在"后台"(而不是在UI/Main线程)调用的。如果你尝试在 onMessageReceived(RemoteMessage message) 方法内部进行异步工作,你会收到以下错误提示:

Method execute must be called from the main thread, currently inferred thread is worker.

所以,应该在 onMessageReceived(RemoteMessage message) 中完成所有同步工作,因为它在自己的后台工作线程中运行。


6
有一个小提示:对于所有提供onMessageReceived的消息,您的服务应在接收到消息后的10秒内处理任何消息。如果您的应用程序需要更多时间来处理消息,请使用Firebase作业调度器。 - Alécio Carvalho
@AlécioCarvalho - 尤其是在新版Android上面的背景约束条件生效之后,这点尤为重要。 - Sakiboy

3
一个“服务”不是“在后台运行”。一个“服务”只是一个类的实例(即:一个对象)。一个“服务”的方法可以在主线程(UI线程)或后台线程上运行。这完全取决于它们被如何调用。
服务的生命周期方法onCreate()、onStartCommand()、onDestroy()都在主线程(UI线程)上调用。但在你的服务中,你可以启动其他线程并在这些线程上做其他事情。

是的,关于Android Service,这是非常正确的,但我认为当涉及到FirebaseMessagingService时情况并非如此。请查看我的答案以获取更多详细信息。 - Sakiboy
5
太棒了,David。你今天教会我一些关于服务的东西。 - Frank van Puffelen
3
@FrankvanPuffelen,我不知道......这并没有太大的帮助。有点像对“Service”进行了一般性的解释,没有回答提问者的问题,只是围绕“Service”类循环地说。不确定他为什么要发表回答。 - Sakiboy

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