onStart()调用startService()有时会导致Android O中的异常

Leo*_*hen 9 android android-service

我们的应用针对的是Android O.

阅读后台服务限制后,我注意到前台应用程序启动服务是安全的.因此,在我们的应用程序中,我们调用startService()了Fragment的onStart()方法.我们认为这是可以的,因为在本文档中它说当调用onStart时,片段对用户可见,并且当它可见时,它意味着此应用程序是前台应用程序.

但有时,我必须承认这种情况非常罕见,我们仍然会收到以下异常

java.lang.IllegalStateException:不允许启动服务Intent {act = ACTION_DEACTIVATE cmp = com.adyxe.sync/.ClientService}:app在后台uidReidRedord {db2a697 u0a19最后bg:+ 7m30s540ms空闲更改:缓存过程:1 seq (0,0,0)}

为什么会这样?onResume()为了更加确定应用程序现在是一个前台应用程序,调用startService()更安全吗?

Hed*_*deH 0

首先,您可能发现了 Android 中的一个错误:)

\n\n

无论如何,您应该使用 aJobIntentService并将其排队。

\n\n

这样,当应用程序被视为在前台时,系统将运行您的服务,并且您将不会看到错误。在 Oreo 之前的版本中,无论应用程序前台状态如何,服务都应立即运行。

\n\n

这是一个例子:

\n\n
public class ExampleJobIntentService extends JobIntentService {\n  static final int JOB_ID = 1000;\n\n  static void enqueueWork(Context context, Intent work) {\n    enqueueWork(context, ExampleJobIntentService.class, JOB_ID, work);\n  }\n\n  @Override\n  public void onCreate() {\n    super.onCreate();\n    // Some initializations...\n  }\n\n  @Override\n  protected void onHandleWork(Intent work) {\n    // Do your stuff...\n  }\n\n  @Override\n  public boolean onStopCurrentWork() {\n    // return true to reschedule this service if your work failed.\n    return false;\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你像这样将其排队:

\n\n
// The intent is the one that will be received here: onHandleWork(Intent work)\nExampleJobIntentService.enqueueWork(context, intent); \n
Run Code Online (Sandbox Code Playgroud)\n\n

像这样注册它Manifest:

\n\n
<service\n     android:name=".ExampleJobIntentService"\n     android:permission="android.permission.BIND_JOB_SERVICE" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您计划在后台运行该服务,您应该WAKE_LOCK在Oreo 之前的Manifest版本中添加权限:

\n\n
<uses-permission android:name=\xe2\x80\x9dandroid.permission.WAKE_LOCK\xe2\x80\x9d />\n
Run Code Online (Sandbox Code Playgroud)\n