Как стать автором
Обновить

Работа с фоновыми задачами в Android 12: переезжаем с foreground service на expedited jobs

Время на прочтение4 мин
Количество просмотров11K
Всего голосов 60: ↑60 и ↓0+60
Комментарии19

Комментарии 19

Мне очень интересно, возможно ли сейчас для Android написать надёжный, но при этом не-системный будильник?

Как я смотрю, все текущие API планирования не гарантируют запуск задачи, а только дают некоторую вероятность, что она будет запущена.

Нет ли какого-нибудь API будильников? Могли бы уж сделать, пусть даже с дополнительным запросом прав или обязательством показать какую-то Activity как результат работы задачи.

Да, реально точный и надёжный будильник в Android сделать практически нельзя. К сожалению, даже setExactAndAllowWhileIdle() не даёт 100% гарантии — его нельзя запускать часто. А начиная с Android 12, он еще и дополнительный пермишн будет требовать.

Подозреваю, сервис - это то, что запущено продолжительное время и зависит от user input (запись файла на диктофон), чтобы закончиться, а job - это то, что уже пользователь запустил, но оно завершится само (загрузка файла типичный пример).

Показывает уведомление на несколько секунд, что отвлекает

В общем случае это всё часть политики Google по заботе о батарейке устройства. Ну и уведомление в статус-баре действительно многих раздражало.
у джобы будет около минуты на выполнение своих функций
У меня в foreground services создаётся окно (по типу плавающей кнопки), которое висит «вечно», пока сам не остановлю сервис. Теперь всем таким приложениям хана?

Сам ForegroundService никто не запрещает, пока что. Запрещают запускать его из бекграунда

Да, поэтому хана всем приложениям, которым надо запускаться надолго по расписанию, например. Типа фитнес-трекеров.

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

Мне как пользователю, все нравится так же: одни приложения нельзя заставить надежно работать в фоне, а другие нельзя заставить надежно не работать в фоне пока я их не запущу. Лучей щастья гуглу. Причем никто и не думает решать это альтернативной прошивкой, они в большинстве случаев только UI меняют и список неудаляемых программ.

Хм, много раз слышал, что в сторонних прошивках регулируется автозапуск приложения, даже видел это в оболочках мелких производителей. Если запретить автозапуск и "смахнуть" приложение, оно не будет работать в фоне.

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

Возможно. Все не пробовал. Спасибо, посмотрю что доступно.

Добавить в исключения энергосбережения недостаточно. Даже взял телефон специально с 6Gb оперативки. Как не посмотрю свободно больше половины, но приложения все равно иногда выгружаются. Раз в неделю где-то, но это будильник. LineageOS. Есть отдельный телефон которым не пользуюсь Unihertz Pro, можно было бы туда поставить, но нет, он выгружает просто все и всегда, правда понятно почему так сделали для этого телефона. Но зачем тогда эта настройка исключений — не понятно.

Так вроде же в доке написано что можно:

https://developer.android.com/about/versions/12/foreground-services#cases-fgs-background-starts-allowed

Your app uses the Companion Device Manager and declares the REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND permission or the REQUEST_COMPANION_RUN_IN_BACKGROUND permission. Whenever possible, use REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND.

Для приложения, которое пишет трек передвижения юзера в фоне, WorkManager не подходит, тут нужен именно сервис, в котором разворачивается LocationManager и обрабатываются обновления локации. И вот у меня есть кейс, когда нужно запустить на смартфоне запись трека командой с приложения-компаньена с Wear OS девайса. Получается теперь Foreground Service не получится запустить, если приложение на смартфоне в бекграунде?

Точно такая же ситуация. Пожалуйста, дайте знать если найдете ответ.

Хорошо. И вы тоже дайте знать, если первым найдете).

Увлекательно. Благодарю.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий