У меня есть задача запустить несколько разных заданий в приложении для Android. Каждое задание длительное время, и многие из них используют сеть, базу данных и файловую систему. Каждое задание может запускаться вручную пользователем или планироваться с помощью AlarmManager. Очень важно, чтобы каждое задание выполнялось до конца, поэтому его нужно продолжать работать после того, как пользователь покидает приложение или даже когда пользователь вообще не открывает приложение. Работа есть некоторые ID атрибута, как это:Менеджер вакансий в Android
class Job {
int id;
}
мне нужен этот гипотетический JobManager получить работу и сортировать их по ID. Если работа с id = 1 уже запущена, JobManager должен пропустить все последующие задания с id = 1, пока это задание не будет завершено. Но если задание отправляется с id = 2, оно принимается и может выполняться параллельно с первым заданием.
Работы также должны содержать блокировку бодрствования до завершения, как это делается в режиме WakefulIntentService CommonsWare.
У меня есть несколько идей, как это реализовать, но все они имеют свои недостатки:
- Подкласс класса обслуживания, который работает всегда в фоновом режиме и автоматически перезапускается, когда убили по какой-то причине. Недостатки: он потребляет ресурсы, даже если ничего не работает, он работает в потоке пользовательского интерфейса, поэтому нам нужно управлять некоторыми потоками, которые могут быть убиты системой как обычно, каждый клиент должен запустить службу, и никто не знает, когда ее остановить.
- WakefulIntentService от CommonsWare. Недостатки: поскольку это IntentService, он выполняется только последовательно, поэтому он не может проверить существующее текущее задание.
- Булево значение «работает» в базе данных для каждой работы. Проверяйте это каждый раз, когда мы хотим запустить задание. Недостатки: слишком много запросов к db, их сложно реализовать должным образом, иногда два равных задания все равно могут выполняться параллельно, не уверен, что флаги остаются «истинными» в случае какой-либо неожиданной ошибки.
Существующие библиотеки, предназначенные для этой цели. На данный момент, кроме CWAC-бодрствующего я нашел:
- Robospice: https://github.com/stephanenicolas/robospice
- Android Очередь заданий: https://github.com/path/android-priority-jobqueue
, но до сих пор я не знаю, как использовать эти библиотеки для запуска точно один централизованный сервис, который будет принимать задания из любой другой Activity, Service, BroadcastReceiver, AlarmManager и т. д., сортировать их по идентификатору и запускать параллельно.
Пожалуйста, сообщите мне, какое решение может быть использовано в этом случае.
ОБНОВЛЕНИЕ: См. Ниже мое собственное решение. Я не уверен, если он работает во всех возможных случаях. Если вам известны какие-либо проблемы, которые могут возникнуть с этим, прокомментируйте.