Устройства Xiaomi прекращают работу служб переднего плана

У нас есть приложение, которое работает почти вечно с службой переднего плана, но при этом использует уведомление на панели задач, что является нормальной инициализацией. Приложение просто зависит от этой службы. На каждом протестированном нами устройстве служба продолжает работать, даже если задача удалена, но на устройствах Xiaomi после прокрутки из последних она внезапно останавливается, а затем запускается снова, в зависимости от о том, как ActivityManager решает повторно открыть службу. Мы получаем журналы с устройств Xiaomi (в данном случае Xiaomi MI9), например:

Scheduling the restart of the crashed service: com.example.myapp/.MyService in 1000ms

Этого не должно происходить, но случается. И каждый раз, когда мы открываем приложение и закрываем его из последних, часть 1000ms продолжает увеличиваться до 4000ms, 16000ms, 64000ms и так далее. Я не думаю, что у него есть предел, а 64 секунды - это уже слишком долго для перезапуска службы переднего плана, что имеет решающее значение для приложения. Итак, я ищу способы добавить наше приложение в качестве исключения или чего-то в этом роде, но я нашел только следующее: https://dontkillmyapp.com/xiaomi

Если приложение завершается нажатием кнопки X на экране недавних событий, это еще хуже, поскольку я заметил, что устройство завершает работу всех служб и планирует их перезапуск с интервалом в 10 секунд. Я думаю, что наши должны были начаться через 3 часа, что разрушает цель приложения.

Текущее решение, которое мы используем, - это предупредить пользователя об этой проблеме и перенаправить на эту ссылку, чтобы добавить наше приложение в исключения, включить автозапуск и так далее. Но мы знаем, что почти никто этого не сделает, поэтому мы ищем решение, которое может быть реализовано программно.

Небольшой код, демонстрирующий, как мы регистрируем сервис в манифесте и как мы его запускаем. (Демонстрация проще оригинала, но описывает основную логику.)

Часть манифеста:

<service android:name=".MyService"
    android:stopWithTask="false" />

Запуск сервисной части:

// Starts the service as foreground.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
    context.startForegroundService(new Intent(context, MyService.class));
else
    context.startService(new Intent(context, MyService.class));

Публикация части уведомления:

// Post the notification on both onCreate and
// onStartCommand so we can only hope that 
// the app won't throw the unavoidable exception
// which occurs 5 seconds after calling
// Context.startForegroundService().

@Override
public void onCreate()
{
     super.onCreate();

     // Handles how the notification
     // is shown, content is not important.
     // Calls startForeground inside.
     showNotification();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    showNotification();

    // Some other service code that is irrelevant

    // Return START_STICKY so we can ensure that if the
    // service dies for some reason, it should start back.
    return START_STICKY;
}

Я думаю, что все сделано правильно, так как это происходит только на устройствах Xiaomi, но мы не смогли найти решения, как поддерживать эту услугу в рабочем состоянии. Кто-нибудь еще испытывает то же самое? Как нам действовать, чтобы наша служба не умерла? Спасибо за помощь.


person Furkan Yurdakul    schedule 17.09.2019    source источник
comment
Кто-нибудь еще испытывает то же самое? да, все. Виноват xiaomi. Вы действительно не можете делать ничего, кроме того, что вы уже делаете. Проверьте dontkillmyapp.com.   -  person Tim    schedule 17.09.2019
comment
@Tim Castelijns: Да, я знаю, там написано, что со стороны разработки делать нечего, но все же нам нужно понять это так или иначе.   -  person Furkan Yurdakul    schedule 17.09.2019
comment
не у всех проблем есть решения. Насколько я знаю, вы зря теряете время. Может быть, кто-то еще знает обходной путь. Но не надейся   -  person Tim    schedule 17.09.2019
comment
Я была такая же проблема. Вы можете получить такие разрешения, как this   -  person Behrad Ranjbar    schedule 31.12.2019
comment
@BehradRanjbar Вау, спасибо!   -  person Furkan Yurdakul    schedule 31.12.2019


Ответы (1)


Перейдите в Настройки-> Разрешения-> Автозапуск и выберите свое приложение.

person Muhammad Ali    schedule 19.11.2019
comment
Это не удаляет сообщение, которое печатается как Планирование перезапуска отказавшей службы: com.example.myapp / .MyService через 1000 мс, поэтому он только перезапускает службу, но не сохраняет ее. Мне нужно, чтобы служба оставалась на переднем плане, без сбоев системы, как это делают другие устройства. - person Furkan Yurdakul; 19.11.2019
comment
Только после включения Настройки- ›Разрешения-› Автозапуск служба продолжала работать даже после того, как приложение было убито. - person iCantC; 06.05.2021