Запросить IntentService для получения информации о своей очереди

У меня есть IntentService, который ставит в очередь вызовы веб-сервисов, которые должны быть сделаны на моем веб-сервере. Таким образом, каждое намерение – это вызов веб-службы.

Я хотел бы задать что-то, где мое приложение может запросить этот IntentService, если у него есть какие-либо намерения, содержащие конкретную часть данных (IE: «Вы уже ждали, чтобы спросить облако о данных x? Или мне нужно сказать вам сделай это?").

Есть ли какие-либо предложения о том, как я могу расширить IntentService, чтобы сделать это? Может ли пройти очередь IntentService Intent? Или мне нужно взять код IntentService и изменить его?

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

Есть ли какие-либо предложения о том, как я могу расширить IntentService, чтобы сделать это? Может ли пройти очередь IntentService Intent? Или мне нужно взять код IntentService и изменить его?

Вероятно, последнее, если вы действительно хотите проверить фактическую очередь. IntentService превращает Intents в сообщения, появляющиеся в очереди сообщений Looper через HandlerThread . Тем не менее, ничто из этого не раскрывается через SDK. К счастью, IntentService довольно короткий – даже не 150 строк. Вы можете клонировать его в свой собственный пакет и вносить изменения по мере необходимости. Просто запустите diff для источника, когда в репозитории AOSP будут выпущены новые исходные обновления, поэтому вы знаете, выполнил ли Google какую-либо крупную операцию на самом IntentService , которую вы, возможно, захотите использовать.

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

Это даже не должно было быть таким постоянным, поскольку собственная очередь IntentService не является постоянной. Просто сохраните свою собственную очередь FIFO в onStartCommand() , привязав к суперклассу и вытащите свой Intent из очереди в конце onHandleIntent() . У этого есть шанс выйти из синхронизации с главной очередью (например, вы захотите использовать, finally чтобы убедиться, что вы вышли из своей очереди), но вам не нужно клонировать класс.

Другим решением может быть его решение путем переопределения onStartCommand.

Вот гладкое решение, в котором я нашел вдохновение для подобной проблемы 🙂