我正在从MainActivity:onCreate启动IntentService,并且从仅在以上Android Oreo上的崩溃报告中注意到了此崩溃:
java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.company.mobile/com.company.mobile.gcm.RegistrationIntentService }: app is in background uid UidRecord{c96fbae u0a184 TPSL idle procs:1 seq(0,0,0)}
at android.app.ContextImpl.startServiceCommon()(ContextImpl.java:1577)
at android.app.ContextImpl.startService()(ContextImpl.java:1532)
at android.content.ContextWrapper.startService()(ContextWrapper.java:664)
at cs.a()(FirebaseUtility.java:42)
at com.company.mobile.MainActivity.onCreate()(MainActivity.java:81)
at android.app.Activity.performCreate()(Activity.java:7136)
at android.app.Activity.performCreate()(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate()(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity()(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity()(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute()(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks()(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute()(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage()(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage()(Handler.java:106)
at android.os.Looper.loop()(Looper.java:193)
at android.app.ActivityThread.main()(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke()(Method.java:-2)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run()(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main()(ZygoteInit.java:858)
有些人可能会说这是this,this和this的重复问题。我不是在寻找一个如何回答,而是在寻找一个解释为什么会这样。我知道这个问题是由于Android O上的Background Execution Limits造成的,我已经知道如何使用JobIntentService修复此问题。我只想知道为什么在MainActivity:onCreate()中发生此崩溃。
据我了解,仅当应用程序在后台启动服务时(例如在调用onStop()之后),才应发生此问题。调用MainActivity onCreate时,我的应用程序怎么可能甚至在后台?是否存在调用onCreate但应用程序仍在后台的情况?
答案 0 :(得分:2)
仅在调用Activity
后,您的onResume()
才被视为前台。这就是为什么不允许从IntentService
开始onCreate()
引用Processes and Application Lifecycle
前台流程是用户所需的流程 正在做。各种应用程序组件可能导致其 包含过程以不同方式被视为前台。一种 如果出现以下任何情况,则认为该过程处于前台 条件成立:
- 它正在与用户进行交互的屏幕顶部运行一个Activity(已调用其onResume()方法)。[...]
答案 1 :(得分:0)
从以上评论中扩展卡门的答案。 (我现在没有代表要发布。)
在应用程序仍处于后台且受startService安全性约束的情况下调用onResume的一种方法如下:
NotificationCompat.Builder builder =...;
builder.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_ALARM);
Intent fullScreenIntent = new Intent(this, UrgentMessageActivity.class);
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setFullScreenIntent(fullScreenPendingIntent, true);
希望这只是操作系统中的错误。