Хранение событий в базе данных, пока приложение работает в фоновом режиме - PullRequest
0 голосов
/ 05 сентября 2018

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

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

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

Причина: java.lang.IllegalStateException: запуск запрещен Service Intent { cmp = my.package.name.debug / my.package.name.service.MyService}: приложение в фоновом режиме uid UidRecord {94b2e4a u0a204 SVC простаивает change: idle | uncached procs: 1 сек (0,0,0)}

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я нашел ответ, связанный с моим вторым вопросом:

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

Edit:

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

0 голосов
/ 05 сентября 2018

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

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

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

...