java.lang.IllegalStateException:不允许启动服务意图(来自Activity onCreate)

时间:2018-08-15 17:30:13

标签: android illegalstateexception android-8.0-oreo android-intentservice

我正在从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)

有些人可能会说这是thisthisthis的重复问题。我不是在寻找一个如何回答,而是在寻找一个解释为什么会这样。我知道这个问题是由于Android O上的Background Execution Limits造成的,我已经知道如何使用JobIntentService修复此问题。我只想知道为什么在MainActivity:onCreate()中发生此崩溃。

据我了解,仅当应用程序在后台启动服务时(例如在调用onStop()之后),才应发生此问题。调用MainActivity onCreate时,我的应用程序怎么可能甚至在后台?是否存在调用onCreate但应用程序仍在后台的情况?

2 个答案:

答案 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);

希望这只是操作系统中的错误。