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

Android 无法恢复活动:不允许启动服务意图,应用程序处于后台,android,android-activity,android-service,android-9.0-pie,Android,Android Activity,Android Service,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 a

我自己还没能重现这次崩溃,但我最近在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)}`
堆栈跟踪:

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)
我不明白这次坠机。为什么不能在onResume方法中启动服务?
当活动进入恢复状态时,不应该在前台吗?

这是一个bug!在Android 9+中,应用程序和正在恢复的活动之间存在竞争

这是谷歌的一个解决方案:

这个问题已经在未来的Android版本中得到了解决

有一种解决方法可以避免应用程序崩溃。应用程序可以通过调用 ActivityManager.GetRunningAppProcess并避免在以下情况下启动服务 重要性级别低于 ActivityManager.RunningAppProcessInfo.IMPORTANCE\u前台。如果 设备尚未完全唤醒,活动将立即暂停并停止 在它完全清醒后,最终会再次恢复

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

new Handler().postDelayed(() -> startService(...), 100);

这是一只虫子!在Android 9+中,应用程序和正在恢复的活动之间存在竞争

这是谷歌的一个解决方案:

这个问题已经在未来的Android版本中得到了解决

有一种解决方法可以避免应用程序崩溃。应用程序可以通过调用 ActivityManager.GetRunningAppProcess并避免在以下情况下启动服务 重要性级别低于 ActivityManager.RunningAppProcessInfo.IMPORTANCE\u前台。如果 设备尚未完全唤醒,活动将立即暂停并停止 在它完全清醒后,最终会再次恢复

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

new Handler().postDelayed(() -> startService(...), 100);

@Frogato在代码中解释了什么:

        //temporary bug fix for https://issuetracker.google.com/issues/110237673
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
        if (runningAppProcesses != null) {
            int importance = runningAppProcesses.get(0).importance;

            if (importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
                //startService(...);
        }

@Frogato在代码中解释了什么:

        //temporary bug fix for https://issuetracker.google.com/issues/110237673
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
        if (runningAppProcesses != null) {
            int importance = runningAppProcesses.get(0).importance;

            if (importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
                //startService(...);
        }

我在播放前调用super。我在播放前调用super。我猜延迟启动服务100毫秒并不保证应用程序完全打开foreground@ricardopereira您可以安排一个重复任务并检查流程状态,重复该任务,直到获得重要性。是否有人知道此问题是否已解决,以及是否可供使用。否则,是否有人对此有一致的解决方法?我想延迟启动服务100毫秒并不保证应用程序完全启动foreground@ricardopereira您可以安排一个重复任务并检查流程状态,重复该任务,直到获得重要性。是否有人知道此问题是否已解决,以及是否可供使用。否则,是否有人对此有一致的解决方法?