android - 我从谷歌开发者仪表板得到这个崩溃,但我不明白是什么原因造成的
问题描述
这是我在 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)
解决方案
从您的堆栈跟踪中,我发现您的接收器是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>
推荐阅读
- php - 突然间,我开始在我的 SugarCRM 实例上收到此错误。“出现错误”以下是第一个错误之前的页面呈现。
- parse-platform - 条件对象 ACL
- c# - 从数据表传递到控制器时,参数字符串为空
- c++ - zlib 压缩似乎通过 gunzip 解压缩,但不是 curl
- c# - 实施跨度
在统一 - jenkins - Jenkins 报告的 PNG 图像链接未在 IE11 浏览器中打开
- javascript - 如何将变量从模板 {{data}} 传递给 php 以进行分解
- python-3.x - 如何根据纪元时间获得前半部分和后半部分('attempt_updated_at' 列)
- android - 如何修复“BUILD FAILED” android react native 说错误:包 android.support.annotation 不存在
- video - ffmpeg concat demuxer 在加入视频时冻结我的视频帧