无法恢复活动:不允许启动服务 Intent,应用程序处于后台

ric*_*ira 4 android android-service android-activity android-9.0-pie

我自己无法重现此崩溃,但我最近在 Crashlytics 中看到了很多崩溃。崩溃仅发生在 Android 9 及更高版本上:

Fatal Exception: java.lang.RuntimeException
    Unable to resume activity {co.whitesmith.flicks/co.whitesmith.flicks.media.audio.AudioPlayerActivity}: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.devbrackets.android.playlistcore.start_service cmp=co.whitesmith.flicks/.media.service.MediaService (has extras) }: app is in background uid UidRecord{63e190 u0a221 TPSL bg:+3h19m42s918ms idle change:idle procs:1 seq(2385,2385,2385)}`
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

android.app.ContextImpl.startServiceCommon (ContextImpl.java:1616)
android.app.ContextImpl.startService (ContextImpl.java:1571)
android.content.ContextWrapper.startService (ContextWrapper.java:669)
arrow_right
com.devbrackets.android.playlistcore.manager.BasePlaylistManager.play (BasePlaylistManager.kt:298)
co.whitesmith.flicks.media.audio.AudioPlayerFragment.startPlayback (AudioPlayerFragment.kt:231)
co.whitesmith.flicks.media.audio.AudioPlayerFragment.restartAudio (AudioPlayerFragment.kt:201)
co.whitesmith.flicks.media.audio.AudioPlayerFragment.updateCurrenPlaybackInformation (AudioPlayerFragment.kt:401)
co.whitesmith.flicks.media.audio.AudioPlayerFragment.onResume (AudioPlayerFragment.kt:118)
androidx.fragment.app.Fragment.performResume (Fragment.java:2649)
Run Code Online (Sandbox Code Playgroud)

我不明白这次崩溃。为什么无法在该onResume()方法中启动服务?当活动进入“已恢复”状态时,不应该处于前台吗?

fro*_*tto 9

这是一个错误!在 Android 9+ 中,应用程序 UID 转向前台与正在恢复的 Activity 之间存在竞争。

\n\n

这是 Google 的解决方法:

\n\n
\n

该问题已在未来的 Android 版本中得到解决。

\n\n

有一种解决方法可以避免应用程序崩溃。Activity.onResume()应用程序可以通过调用 获取进程状态ActivityManager.getRunningAppProcesses(),并在重要性级别低于\n 时避免启动服务 ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND。如果设备尚未完全唤醒,则活动将立即暂停,并最终在完全唤醒后再次恢复。

\n
\n\n

但是,有一个更简单的解决方法,可以延迟服务的启动,直到应用程序完全转到前台:

\n\n
new Handler().postDelayed(() -> startService(...), 100);\n
Run Code Online (Sandbox Code Playgroud)\n