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