java - oncreate 应用程序类中的 IllegalStateException
问题描述
我得到一个错误 java.lang.RuntimeException Caused by: java.lang.IllegalStateException in super.onCreate() in android version 8.0
public final class ClockApp extends Application {
@Override
public void onCreate() {
super.onCreate();
startService(new Intent(getApplicationContext(), MyService.class));
}
}
错误日志如下:
java.lang.RuntimeException:
at android.app.ActivityThread.handleBindApplication (ActivityThread.java:6065)
at android.app.ActivityThread.-wrap1 (Unknown Source)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1764)
at android.os.Handler.dispatchMessage (Handler.java:105)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6942)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
Caused by: java.lang.IllegalStateException:
at android.app.ContextImpl.startServiceCommon (ContextImpl.java:1538)
at android.app.ContextImpl.startService (ContextImpl.java:1484)
at android.content.ContextWrapper.startService (ContextWrapper.java:663)
at com.alarm.speakingclock.ClockApp.onCreate (ClockApp.java:14)
at android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1126)
at android.app.ActivityThread.handleBindApplication (ActivityThread.java:6062)
at android.app.ActivityThread.-wrap1 (Unknown Source)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1764)
at android.os.Handler.dispatchMessage (Handler.java:105)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6942)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
解决方案
从 API 26 开始,当应用程序不在前台时,您无法启动服务,并且在Application.onCreate()
调用期间它仍然不在前台。
参考:https ://developer.android.com/guide/components/services#StartingAService
所以有一些可能的方法来解决这个问题:
- (好的解决方案)延迟服务启动,直到应用程序进入前台。例如 - 启动器活动的
onCreate
方法。 - (很好的解决方案)使用
startForegroundService()
- (不确定是否可行,不好的解决方案)将 targetSDK 降级到 26 以下
推荐阅读
- gnuplot - 首先绘制指定点,然后使用 gnuplot 从文件中绘制数据
- java - 在 CI/CD 管道部署期间如何在 DynamoDB 中进行数据库更改
- r - R 数据格式:yyyy-mm-dd hh mm ss 到 yyyy-mm-dd
- if-statement - 批处理文件中的多行 IF 语句内的变量值未递增
- c# - 使用 ViewModel 和 IsEnabled 数据绑定发出 WPF
- firebase - Flutter - 成功登录和注册后无法从 Firestore 检索数据
- python - 将彩色图像转换为灰度图像
- tailwind-css - 为什么在tailwindcss的自定义类中我不能定义2悬停:?
- javascript - 如何使值更长的数组(JavaScript)
- qr-code - 读取块中大二维码的标准