【问题标题】:Does FirebaseMessagingService run in the background by default?FirebaseMessagingService 默认在后台运行吗?
【发布时间】:2017-04-25 07:48:41
【问题描述】:

FirebaseMessagingService 在后台运行是否类似于IntentService 的运行方式?

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

谢谢

回答:

FirebaseMessagingService 的方法onMessageReceived(RemoteMessage message) 在主线程上调用 - 所以所有工作都应该同步进行。

【问题讨论】:

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


    【解决方案1】:

    FirebaseMessagingService 的方法onMessageReceived(RemoteMessage message) 被称为“在后台”(不在 UI/主线程上)。如果您尝试在 onMessageReceived(RemoteMessage message) 内进行异步工作,您将收到一条错误消息:

    方法execute必须从主线程调用,当前推断线程为worker。

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

    【讨论】:

    • 不过有一个附注:对于所有提供 onMessageReceived 的消息,您的服务应在收到后 10 秒内处理任何消息。如果您的应用需要更多时间来处理消息,请使用 Firebase Job Dispatcher。
    • @AlécioCarvalho - 当然,尤其是在较新版本的 Android 上存在后台限制。
    【解决方案2】:

    Service 不会“在后台运行”。 Service 只是一个类的实例(即:一个对象)。 Service 的方法可以在主 (UI) 线程或后台(工作)线程上运行。这完全取决于它们的名称。

    服务onCreate()onStartCommand()onDestroy()的生命周期方法都在主(UI)线程上调用。但是在您的Service 中,您可以启动其他线程并在这些线程上执行其他操作。

    【讨论】:

    • 是的,Android Service 确实如此,但我认为FirebaseMessagingService 并非如此。有关详细信息,请参阅我的答案。
    • 大卫的好答案。你今天教会了我一些关于服务的知识。
    • @FrankvanPuffelen,我不知道......这对充满 sn 答案的帮助不大。有点只是对Service 的平庸解释。甚至没有解决被问到的问题,只是围绕Service 类进行讨论。不知道他为什么还要费心发布答案。
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多