Android 9.0(API 28):java.lang.IllegalStateException:不允许启动服务Intent。

5
我正在开发一个音乐应用,一切都很顺利,但最近程序会崩溃。当我在 Fabric 上查看崩溃列表时,发现这只会在 iOS 9 上发生。下面是引发崩溃的代码:

Fatal Exception: java.lang.RuntimeException Unable to start activity ComponentInfo{android.store/android.store.MusicPlayerActivity}: java.lang.IllegalStateException: Not allowed to start service Intent { act=android.store.mediaservice.PLAY_PLAYLIST cmp=android.store/.mediaservice.MediaService (has extras) }: app is in background uid UidRecord{1aba0fa u0a192 SVC bg:+5m42s914ms idle change:uncached procs: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);
}

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


2
https://dev59.com/j1YO5IYBdhLWcg3wDNXI - ADM
2
@Le Minh,Android O及以上版本不允许在后台运行服务。 您需要使用startForegroundService(i)而不是StartService(i),并将通知附加到前台服务。 - Ashish singh
那么为什么这个问题会在Android Pie上出现而不是Android O上呢? - Le Minh
1个回答

6

对于 Android Oreo 及以上版本的设备,您需要使用 startForgroundService(),而对于 Oreo 之前的版本,您需要使用 startService()。请查看以下示例代码。

   ContextCompat.startForegroundService(new Intent(context, MyService.class));

Android Oreo中的后台执行限制。ContextCompat在内部进行Build.Version检查并调用正确的方法。

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

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

2
context.startForegroundService 不是解决方案。我不知道为什么会得到投票? - A Farmanbar
ForegroundService 用于需要长时间运行且用户需要知道的进程,例如音乐播放器或下载管理器等。 - A Farmanbar
@Mr.AF 我认为,在 Android O 及以上设备中,IllegalStateException 是由于在应用程序处于后台时尝试启动服务所致。如果我错了,请纠正我。 - Ashish singh
@Mr.AF 如果 context.startForegroundService 不是解决方案,那么您能解释一下这个异常的最佳解决方案是什么吗? - sm_
解决方案是 IntentService,@Ashishsingh 和 @sm_。 - A Farmanbar
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接