Я хочу, чтобы мое приложение сохраняло события (запускаемые 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().
Наконец, я не уверен, что Служба подходит для моего случая использования.
У меня два вопроса:
onCreate() приложения?это может быть полезно для вас. medium.com/@nivedithagemini/…
@DroiDev Да, но разве планировщик заданий не будет полезен, если я что-то активно инициирую? В моем случае я слушаю события и сохраняю их пассивно, т.е. когда событие запускается. Разве JobScheduler не запустит задание и не завершит его, если оно подошло к концу?
Вы можете использовать workmanager в вашем конкретном случае.
Он может удовлетворить все ваши требования и имеет гарантированное выполнение, даже если приложение в фоновом режиме или устройство перезагружается.
Проверьте это (ссылка на пример кода для WorkManager) для получения дополнительной информации о WorkManager Api.
Я нашел ответ на свой второй вопрос:
Я запускаю свою службу с помощью Service.START_STICKY. Если приложение убито, убивается и служба. Прикрепленный Сервис воссоздает сам себя, если его убивают. И поскольку в моем случае класс Application запускает службу, приложение также создается заново. Но все же приложение находится в фоновом режиме, а затем я сталкиваюсь с onCreate() приложения, и приложение вылетает, потому что Oreo не позволяет запускать какие-либо службы, пока приложение находится в фоновом режиме.
Редактировать:
Ответ на мой первый вопрос: прочитав дополнительную информацию в официальной документации Android, я пришел к следующему выводу: действительно кажется, что служба переднего плана - неправильный выбор, потому что пользователю не нужно знать о событиях, хранящихся в БД. JobScheduler (или более новый Workmanager) больше подходит для разовых или периодических заданий. Таким образом, смешанная запущенная / связанная служба кажется здесь правильным выбором.
Вы все еще можете выполнять фоновые службы в Oreo. использовать планировщик заданий