От Google существует обходное решение:
проблема была решена в будущем выпуске Android.
существует обходное решение для предотвращения сбоя приложения. Приложения могут получить состояние процесса в Activity.onResume () путем вызова ActivityManager.getRunningAppProcesses () и избежать стартового Сервиса, если уровень важности ниже, чем ActivityManager. RunningAppProcessInfo. IMPORTANCE_FOREGROUND. Если бы устройство hasn’t полностью не спящий, операции были бы приостановлены сразу и в конечном счете возобновлены снова после полностью не спящего.
, Таким образом, я думаю, что это хотело бы это:
// 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);
наша команда, сталкивающаяся с той же проблемой. Мои календарные шоу 5 апреля 2019, но проблема все еще воспроизводят на моем Samsung Galaxy S9 +, андроид 9.0 (Один UI)
, Мы запускаем сервис в onResume и развязываем onPause.
, Как воспроизвести
Просто, блокируют Ваше устройство, когда действие с этой логикой находится на экране, и не касайтесь 10-15 минут. После разблокировали экран, приложение откажет.
, Как зафиксировать
, Мы нашли решение, это на самом деле работает. Начиная с андроида 8 +, запустите свой сервис в android.os. Handler.post (...)
Пример (Kotlin):
override fun onResume() {
super.onResume()
Handler().post {
val serviceIntent = Intent(activity, SomeService::class.java)
activity?.startService(serviceIntent)
activity?.bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE)
}
}
Удачи!
Это было отмечено, как 'зафиксировано' в Системе отслеживания ошибок Android:
, По-видимому, фиксация будет выпущена в одном из выпусков Android Q.
По словам Сотрудника Google, который закрыл проблему,
, существует обходное решение для предотвращения сбоя приложения. Приложения могут получить состояние процесса в
Activity.onResume()
путем вызоваActivityManager.getRunningAppProcesses()
и избежать стартового Сервиса, если уровень важности ниже, чемActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
. Если бы устройство hasn’t полностью не спящий, операции были бы приостановлены сразу и в конечном счете возобновлены снова после полностью не спящего.
Они зафиксировали катастрофический отказ (в некотором будущем выпуске, не уверенном, который точно), и обеспечил обходное решение на данный момент: https://issuetracker.google.com/issues/110237673#comment9