FirebaseMessagingService 无法转换为 android.app.Service

Posted

技术标签:

【中文标题】FirebaseMessagingService 无法转换为 android.app.Service【英文标题】:FirebaseMessagingService cannot be cast to android.app.Service 【发布时间】:2021-09-01 22:35:31 【问题描述】:

我的应用在通过 FCM 接收通知时崩溃,并显示错误“无法实例化服务 ...: java.lang.ClassCastException: ... 无法转换为 android.app.Service”

我正在按照manual 通过 Firebase 云消息传递实现 android 应用通知。我仔细检查了一切是否按照手册正确完成,并看到了一些相关的 *** 问题,但仍然无法解决问题:( 我的两个 build.gradle 文件都是按照手册最新的。

在调试之前,AndroidManifest 文件在 com.exa.myproject.unsorted.NotificationService 行突出显示错误:

        <service
        android:name="com.exa.myproject.unsorted.NotificationService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

说 com.exa.myproject.unsorted.NotificationService “必须扩展 android.app.Service”。

但是在服务文件中,它已经继承了:

class NotificationsService : FirebaseMessagingService() 

而 FirebaseMessagingService 应该从 Service 本身继承。 尽管如此,该应用程序编译并运行良好。 但是,当我从 FCM Firebase 控制台发送测试通知时,应用程序崩溃(显然收到的消息与后台 NotificationService 相关)并且不乐意被强制转换为 Android 服务:

D/AndroidRuntime:关闭虚拟机 E/AndroidRuntime: 致命异常: main 进程:com.exa.myproject,PID:30746 java.lang.RuntimeException: 无法实例化服务 com.exa.myproject.unsorted.NotificationService: java.lang.ClassCastException: com.exa.myproject.unsorted.NotificationService 无法转换为 android.app.Service 在 android.app.ActivityThread.handleCreateService(ActivityThread.java:4155) 在 android.app.ActivityThread.access$1600(ActivityThread.java:232) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:241) 在 android.app.ActivityThread.main(ActivityThread.java:7604) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941) 原因:java.lang.ClassCastException: com.exa.myproject.unsorted.NotificationService 无法转换为 android.app.Service 在 android.app.AppComponentFactory.instantiateService(AppComponentFactory.java:129) 在 androidx.core.app.CoreComponentFactory.instantiateService(CoreComponentFactory.java:75) 在 android.app.ActivityThread.handleCreateService(ActivityThread.java:4150) 在 android.app.ActivityThread.access$1600(ActivityThread.java:232) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:241) 在 android.app.ActivityThread.main(ActivityThread.java:7604) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941) I/Process:发送信号。 PID:30746 SIG:9

不幸的是,Kotlin 不允许类同时从 2 个类继承。否则,除了 FirebaseMessagingService,我还会从 Service 继承 NotificationService。

【问题讨论】:

您是否尝试过清理和重建项目? 【参考方案1】:

最后我找到了解决方案,所以这是一个虚拟的情况。 由于多次合并,创建了同一文件的 2 个副本。所以最终我在存储库中有 2 个服务(2 个 Kotlin 类):

通知服务 通知服务 AndroidManifest 文件中仅引用了其中一个。那是不恰当的。 所以最终我删除了不正确的文件,引用了正确的文件,现在它可以工作了。 对我来说,教训是在出现错误的情况下跟踪所有引用的所有链方式,尤其是那些在类之外,在文件之外的引用。编译器并不总是显示问题的直接根本原因...

【讨论】:

以上是关于FirebaseMessagingService 无法转换为 android.app.Service的主要内容,如果未能解决你的问题,请参考以下文章

FirebaseMessagingService 11.6.0 HandleIntent

安装应用程序时永远不会调用 FirebaseMessagingService

如何像 whatsapp 在 FirebaseMessagingService 中合并推送通知

如何从 FirebaseMessagingService 的 onNewToken() 访问我的布局?

自定义 Flutter Android FirebaseMessagingService

从 FirebaseMessagingService 类调用活动类方法