首页 > 解决方案 > 我从谷歌开发者仪表板得到这个崩溃,但我不明白是什么原因造成的

问题描述

这是我在 google play 开发者仪表板中遇到的崩溃。Rebootreceiver 扩展了广播接收器类,其中 onReceive() 我调用另一个扩展服务的类,在该类中我调用一个函数来启动警报。是否会因为用户为我的应用禁用谷歌警报或类似原因而导致崩溃?有什么想法吗?

java.lang.RuntimeException: 
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:4238)
  at android.app.ActivityThread.access$1700 (ActivityThread.java:274)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2113)
  at android.os.Handler.dispatchMessage (Handler.java:107)
  at android.os.Looper.loop (Looper.java:237)
  at android.app.ActivityThread.main (ActivityThread.java:8167)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:496)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1100)
Caused by: java.lang.IllegalStateException: 
  at android.app.ContextImpl.startServiceCommon (ContextImpl.java:1688)
  at android.app.ContextImpl.startService (ContextImpl.java:1633)
  at android.content.ContextWrapper.startService (ContextWrapper.java:683)
  at android.content.ContextWrapper.startService (ContextWrapper.java:683)
  at com.example.myapp.RebootReceiver.onReceive (RebootReceiver.java:31)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:4229)
  at android.app.ActivityThread.access$1700 (ActivityThread.java:274)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2113)
  at android.os.Handler.dispatchMessage (Handler.java:107)
  at android.os.Looper.loop (Looper.java:237)
  at android.app.ActivityThread.main (ActivityThread.java:8167)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:496)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1100)

标签: android

解决方案


从您的堆栈跟踪中,我发现您的接收器是RebootReceiver设备启动时您的应用程序在后台。如果您的应用程序目标 API 为 26 (Android 8) 或更高版本,并且它在后台尝试启动服务,则会崩溃,IllegalStateException因此如果 Android 为 8 或更高版本,您需要调用startForgroundService而不是startService

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(new Intent(context, ServedService.class));
} else {
    context.startService(new Intent(context, ServedService.class));
}

onHandleIntent服务期间,您需要致电,startForeground否则您会IllegalStateException再次获得。

如果您已设置targetSdkVersion = 28(Android 9 / Pie)或以上版本启动前台服务,您需要声明FOREGROUND_SERVICE权限的使用:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>

推荐阅读