У нас есть приложение, которое работает почти вечно с службой переднего плана, но при этом использует уведомление на панели задач, что является нормальной инициализацией. Приложение просто зависит от этой службы. На каждом протестированном нами устройстве служба продолжает работать, даже если задача удалена, но на устройствах 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, но мы не смогли найти решения, как поддерживать эту услугу в рабочем состоянии. Кто-нибудь еще испытывает то же самое? Как нам действовать, чтобы наша служба не умерла? Спасибо за помощь.