Невозможно возобновить активность: не разрешено запускать сервис. Намерение, приложение в фоновом режиме - PullRequest
0 голосов
/ 03 февраля 2020

Я не смог сам воспроизвести этот кра sh, но в последнее время я вижу много сбоев в Crashlytics. Cra sh происходит только на 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)

Я не понимаю этого cra sh. Почему невозможно запустить службу методом onResume()? Разве не должно быть на переднем плане, когда активность переходит в состояние Возобновлено?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Это ошибка! В Android 9+ существует гонка между UID приложения, поворачивающим передний план, и возобновляемым действием.

Это обходной путь от Google:

Проблема устранена в будущий Android релиз.

Существует обходной путь, позволяющий избежать применения cra sh. Приложения могут получить состояние процесса в Activity.onResume(), вызвав ActivityManager.getRunningAppProcesses() и избежать запуска службы, если уровень важности ниже ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND. Если устройство не полностью проснулось, действия будут немедленно приостановлены и, в конце концов, возобновлены после его полного пробуждения.

Однако существует более простой обходной путь, который задерживает запуск службы до тех пор, пока приложение полностью не переключится на передний план. :

new Handler().postDelayed(() -> startService(...), 100);
0 голосов
/ 20 апреля 2020

Что @frogatto объяснил в коде:

        //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(...);
        }
...