#android #android-service #scheduler #android-workmanager #fileobserver
#Android #android-сервис #планировщик #android-workmanager #файловый сервер
Вопрос:
Мне нужно реализовать файловый сервер в фоновом режиме, поэтому, если новый файл поступает в наблюдаемый каталог, должно быть запущено уведомление. Учитывая фоновое ограничение, реализованное в Oreo, самый простой вариант — просто запустить FileObserver в службе переднего плана (с уведомлением) и продолжать прослушивание. Однако это сохранит мое приложение в списке разрядников батареи, и я бы предпочел избегать постоянного добавления уведомлений. Другим решением является реализация планировщика в workmanager, но для этого мне потребуется очень часто читать весь каталог (каждую минуту или даже меньше времени), чтобы определить, прибыл ли какой-либо новый файл. Это означает, что я буду избегать использования FileObserver, но буду продолжать потреблять драгоценный ресурс без необходимости каждую минуту.
Я надеюсь, что кто-нибудь может предложить, есть ли какой-либо другой более эффективный способ реализации функциональности FileObserver, гарантирующий функциональность, но сохраняющий использование ресурсов как минимум.
Ответ №1:
Вы можете использовать WorkManager или JobScheduler с триггерами URI содержимого. Это лучший способ сделать это.
Комментарии:
1. Проблема с этим решением заключается в том, что при каждом запуске задания мне придется читать весь список имен файлов (и их метаданных), чтобы определить, какие файлы были созданы после последнего запуска. Это пустая трата ресурсов устройства, которой я пытаюсь избежать. Не могли бы вы пояснить, в каком смысле это «лучший способ?
2. Что вы имеете в виду. ListenableWorker уже предоставлена информация о том, какие URI были запущены. Разве это не скажет вам все, что вам нужно знать?
3. developer.android.com/reference/androidx/work/…
4. Как вы узнаете uri (с именем файла), когда вы не прослушиваете файловый сервер? Да, рабочий знает о каталоге, но мне нужно знать имя файла для моего действия, и это основная проблема, на которую я смотрю.
5. Когда вы просматриваете каталог (через ContentUriTrigger) WorkManager предоставит вам фактические uri (внутри каталога), которые отвечали за триггер как часть выполнения Worker. Итак, если бы вы пытались реализовать функцию синхронизации фотографий, например, вы бы просматривали медиа-URI и планировали рабочий, указав триггер для descendents = True .