android - Android 9.0:不允许启动服务:应用程序在后台.. onResume() 之后
问题描述
我有一个音乐播放器,它试图启动一个Service
. 为了清楚起见,我删除了几行,但代码实际上是:onResume()
Activity
@Override
protected void onResume() {
super.onResume();
startService(new Intent(this, MusicService.class));
}
根据崩溃日志,这会在某些运行 Android P 的设备上引发异常:
Caused by java.lang.IllegalStateException: Not allowed to start service Intent { cmp=another.music.player/com.simplecity.amp_library.playback.MusicService }: app is in background uid UidRecord{6a4a9c6 u0a143 TPSL bg:+3m25s199ms idle change:cached procs:1 seq(1283,1283,1283)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1577)
at android.app.ContextImpl.startService(ContextImpl.java:1532)
at android.content.ContextWrapper.startService(ContextWrapper.java:664)
at android.content.ContextWrapper.startService(ContextWrapper.java:664)
at com.simplecity.amp_library.utils.MusicServiceConnectionUtils.bindToService(SourceFile:36)
at com.simplecity.amp_library.ui.activities.BaseActivity.bindService(SourceFile:129)
at com.simplecity.amp_library.ui.activities.BaseActivity.onResume(SourceFile:96)
我的应用程序怎么可能在调用onResume()
(and ) 之后立即在后台运行?super.onResume()
这对我来说没有任何意义。这可能是平台错误吗?受此崩溃影响的所有 3500 多名用户都使用 Android P。
解决方案
谷歌有一个解决方法:
该问题已在未来的 Android 版本中得到解决。
有一种解决方法可以避免应用程序崩溃。应用程序可以通过调用 ActivityManager.getRunningAppProcesses() 获取 Activity.onResume() 中的进程状态,如果重要性级别低于 ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND,则可以避免启动 Service。如果设备尚未完全唤醒,则活动将立即暂停,并最终在其完全唤醒后再次恢复。
所以我认为它应该是这样的:
// hack for https://issuetracker.google.com/issues/113122354
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
if (runningAppProcesses != null) {
int importance = runningAppProcesses.get(0).importance;
// higher importance has lower number (?)
if (importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
URLPlayerService.startActionBroadcastServiceData(PlayerActivity.this);
}
我使用处理程序作为解决方法,它工作得很好但不是 100%:
// hack for https://issuetracker.google.com/issues/113122354
handler.postDelayed(() -> URLPlayerService.startService(PlayerActivity.this),200);
推荐阅读
- javascript - 关闭/关闭时嵌套的 NgbModal 问题
- matlab - 将图像放在matlab 3D散点图的XY平面中
- django - 如何计算订阅者数量
- c# - IdentityServer4 响应格式
- configuration - 是否有基于我的服务器的自动 gem5 配置生成器?
- python - 在类属性和今天的日期之后对字典进行排序
- python - 如何刷新页面直到正确加载(由于错误 502 等服务器错误)
- c - Bison - 符号表 - malloc 的免费匹配
- sql - 使用分组集 - 识别级别名称并消除某些集
- asp.net - 如何将 RadTextBox 名称属性设置为静态以在 Javascript 中使用