Android 9.0(APi 28):java.lang.IllegalStateException:不允许启动服务意图

时间:2019-07-12 04:52:47

标签: android android-service android-9.0-pie

我正在构建一个音乐应用程序,一切都很好,但是最近,该应用程序将崩溃。当在结构上看到我的崩溃列表时,请注意仅在OS 9上发生。

  

致命异常:java.lang.RuntimeException       无法启动活动ComponentInfo {android.store/android.store.MusicPlayerActivity}:java.lang.IllegalStateException:不允许启动服务意图{act = android.store.mediaservice.PLAY_PLAYLIST cmp = android.store / .mediaservice.MediaService( }:应用程序在后台uid UidRecord {1aba0fa u0a192 SVC bg:+ 5m42s914ms空闲更改:未处理的过程:1 seq(0,0,0)}

我无法重现该问题,因为它很少发生。 以下这些代码会导致崩溃:

if (intent.hasExtra(MediaService.EXTRAS_INDEX)) {
    Intent i = new Intent(getApplicationContext(), MediaService.class);
    i.setAction(MediaService.ACTION_PLAY_PLAYLIST);             i.putExtra(MediaService.EXTRAS_INDEX, intent.getIntExtra(MediaService.EXTRAS_INDEX, 0));
    i.putExtra(MediaService.EXTRAS_TRACK_IDLIST, intent.getStringArrayExtra(MediaService.EXTRAS_TRACK_IDLIST));     startService(i);
} else if (intent.hasExtra(EXTRAS_SHUFFLE)) {
    Intent i = new Intent(getApplicationContext(), MediaService.class);
    i.setAction(MediaService.ACTION_PLAY_SHUFFLE);
    i.putExtra(MediaService.EXTRAS_TRACK_IDLIST, intent.getStringArrayExtra(MediaService.EXTRAS_TRACK_IDLIST));
    startService(i);
}

那么导致崩溃的主要原因是什么?解决方案是什么?

1 个答案:

答案 0 :(得分:3)

对于Oreo之前的设备,您必须使用startService(),但是从Oreo开始的设备中,您必须使用startForgroundService()。检查下面的示例代码。

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        ContextCompat.startForegroundService(new Intent(context, MyService.class));
    } else {
        context.startService(new Intent(context, MyService.class));
    }

Background Execution Limits in Android Oreo

要在服务中使用以下代码向用户显示通知。

@Override
public void onCreate() {
    super.onCreate();
    startForeground(NOTIFICATION_ID,new Notification());
}