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

onStart()调用startService()有时会导致Android O中出现异常,android,android-service,Android,Android Service,我们的应用程序针对的是Android O 阅读后,我注意到,前台应用程序启动服务是安全的。因此,在我们的应用程序中,我们在片段的onStart()方法中调用了startService()。我们认为这是可以的,因为它说当调用onStart时,片段对用户可见,当它可见时,意味着这个应用程序是一个前台应用程序 但有时,我必须承认这种情况非常罕见,我们仍然会收到以下例外情况 java.lang.IllegalStateException:不允许启动服务意图{ act=ACTION\u DEACTIVAT

我们的应用程序针对的是Android O

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

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

java.lang.IllegalStateException:不允许启动服务意图{ act=ACTION\u DEACTIVATE cmp=com.adyxe.sync/.ClientService}:应用程序正在运行 在后台uid UidRecord{db2a697 u0a19 LAST bg:+7m30s540ms idle 更改:缓存的进程:1 seq(0,0,0)}


为什么会这样?在
onResume()
中调用startService()是否更安全,以确保该应用程序现在是前台应用程序?

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

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

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

以下是一个例子:

public class ExampleJobIntentService extends JobIntentService {
  static final int JOB_ID = 1000;

  static void enqueueWork(Context context, Intent work) {
    enqueueWork(context, ExampleJobIntentService.class, JOB_ID, work);
  }

  @Override
  public void onCreate() {
    super.onCreate();
    // Some initializations...
  }

  @Override
  protected void onHandleWork(Intent work) {
    // Do your stuff...
  }

  @Override
  public boolean onStopCurrentWork() {
    // return true to reschedule this service if your work failed.
    return false;
  }
}
然后将其按如下方式排队:

// The intent is the one that will be received here: onHandleWork(Intent work)
ExampleJobIntentService.enqueueWork(context, intent); 
<service
     android:name=".ExampleJobIntentService"
     android:permission="android.permission.BIND_JOB_SERVICE" />
清单中注册它,如下所示:

// The intent is the one that will be received here: onHandleWork(Intent work)
ExampleJobIntentService.enqueueWork(context, intent); 
<service
     android:name=".ExampleJobIntentService"
     android:permission="android.permission.BIND_JOB_SERVICE" />

您的服务扩展了service/IntentService或JobIntentService?JobIntentService不能用于替换前台服务,例如显示正在进行的通知的服务。音乐播放器服务