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() 访问我的布局?