2017-02-10 17 views
0

У меня есть IntentService, и я хочу, чтобы startCommand был вызван, только если он еще не запущен.запустить IntentService не чаще

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

Возможно ли это? Может быть, с PendingIntent и FLAG_NO_CREATE?

Я мог бы создать это с помощью Service и отдельной нитью вместо IntentService, но у IntentService уже есть реализованная нить.

ответ

1

Возможно, с PendingIntent и FLAG_NO_CREATE?

Этот флаг относится к созданию PendingIntent, а не к сервису.

Возможно ли это?

экспромтом:

Шаг # 1: В вашей службе, добавьте AtomicBoolean поле (здесь под названием isRunning), первоначально установлен в false.

Этап № 2: Переопределение onStartCommand(). Если isRunning - false, установите его на true и цепь на super.onStartCommand(), чтобы наследовать нормальное поведение IntentService. Если isRunning - true, не привязывайте к super.onStartCommand().

Шаг № 3: В onHandleIntent(), обернуть всю свою работу в try/finally блок, где вы установили isRunning в false в finally.

Net: a startService() вызов будет выполняться только через обычную обработку IntentService, если onHandleIntent() еще не работает.

+0

Спасибо! Ох, хорошо! Trick заключается в выборочном вызове реализации базового класса 'IntentService' ... –

+0

Так что мне не нужен' PendingIntent' Мне просто нужно вызвать 'startService (намерение)'? –

+1

@DonBox: Если вы хотите запустить сервис самостоятельно, вызовите 'startService()'. Вы используете «PendingIntent», если хотите * что-то еще *, чтобы начать свою службу (например, «AlarmManager», «Уведомление»). – CommonsWare

 Смежные вопросы

  • Нет связанных вопросов^_^