Сохранение событий в базе данных во время работы приложения в фоновом режиме

Я хочу, чтобы мое приложение сохраняло события (запускаемые SDK) в базе данных (с использованием области), даже если приложение находится в фоновом режиме. Моя концепция заключалась в использовании службы, которая выполняет некоторую инициализацию SDK и прослушивает события. Запуская эту Службу в методе onCreate() моего пользовательского класса Application, я хотел убедиться, что Служба остается активной, пока приложение находится в фоновом режиме, чтобы я не пропустил ни одного события, которое будет сохранено в базе данных.

Но теперь, после появления Android 8, фоновые службы больше не разрешены. Но я не хочу использовать службу переднего плана, потому что мне нужно будет отображать уведомление. И я не хочу, чтобы пользователь знал, что события хранятся в базе данных в фоновом режиме. Я думаю, что эта информация носит технический характер для обычных пользователей.

Я осознал проблему, когда Application.onCreate() хотел запустить службу, но возникло исключение:

Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=my.package.name.debug/my.package.name.service.MyService }: app is in background uid UidRecord{94b2e4a u0a204 SVC idle change:idle|uncached procs:1 seq(0,0,0)}

Примечательно, что исключение выдается, если я убиваю задачу своего приложения. Итак, если я убью приложение, вызывается Application.onCreate().

Наконец, я не уверен, что Служба подходит для моего случая использования.

У меня два вопроса:

  1. Какой компонент использовать, если я хочу хранить события в базе данных, если мое приложение работает в фоновом режиме?
  2. Почему завершение работы приложения вызывает onCreate() приложения?

Вы все еще можете выполнять фоновые службы в Oreo. использовать планировщик заданий

letsCode 05.09.2018 17:35

это может быть полезно для вас. medium.com/@nivedithagemini/…

letsCode 05.09.2018 17:38

@DroiDev Да, но разве планировщик заданий не будет полезен, если я что-то активно инициирую? В моем случае я слушаю события и сохраняю их пассивно, т.е. когда событие запускается. Разве JobScheduler не запустит задание и не завершит его, если оно подошло к концу?

unlimited101 05.09.2018 17:51
0
3
290
2

Ответы 2

Вы можете использовать workmanager в вашем конкретном случае.

Он может удовлетворить все ваши требования и имеет гарантированное выполнение, даже если приложение в фоновом режиме или устройство перезагружается.

Проверьте это (ссылка на пример кода для WorkManager) для получения дополнительной информации о WorkManager Api.

Я нашел ответ на свой второй вопрос:

Я запускаю свою службу с помощью Service.START_STICKY. Если приложение убито, убивается и служба. Прикрепленный Сервис воссоздает сам себя, если его убивают. И поскольку в моем случае класс Application запускает службу, приложение также создается заново. Но все же приложение находится в фоновом режиме, а затем я сталкиваюсь с onCreate() приложения, и приложение вылетает, потому что Oreo не позволяет запускать какие-либо службы, пока приложение находится в фоновом режиме.

Редактировать:

Ответ на мой первый вопрос: прочитав дополнительную информацию в официальной документации Android, я пришел к следующему выводу: действительно кажется, что служба переднего плана - неправильный выбор, потому что пользователю не нужно знать о событиях, хранящихся в БД. JobScheduler (или более новый Workmanager) больше подходит для разовых или периодических заданий. Таким образом, смешанная запущенная / связанная служба кажется здесь правильным выбором.

Другие вопросы по теме