2013-04-17 2 views
1

В принципе, мне нужно, чтобы код был простым, но поскольку я новичок, я все еще запутался в Service, IntentService, создав новый поток отдельно от основного потока Activity/UI и т. д. Сначала я объясню задачу, а затем, как я думаю, что это может быть достигнуто наилучшим образом.Android Java Service и Timer/Thread Sleep

Задача

Главная деятельность/UI имеет две кнопки Start и Stop. Приложение должно выполнить цикл из двух задач TaskA и TaskB. Когда нажимается Start, цикл выполняется. Цикл имеет следующие шаги

внутренних сторонка
  1. обновления статуса в интерфейсе основного вида деятельности по: «исполнению Таски за 60 секунд»
  2. Подождите 60 секунд
  3. Обновления статуса ...: «Таска Выполнения»
  4. Выполнить Таску
  5. Update Status ...: "TaskB исполнения в 120 второй"
  6. подождите 120 секунд
  7. Update Status ...: "TaskB выполнения"
  8. Выполнение задачиB

По завершении цикл повторяется. Этот цикл должен продолжаться до тех пор, пока пользователь не нажмет Stop. Этот цикл не должен останавливаться, прерываться или разрушаться, если основная активность/пользовательский интерфейс находится в режиме паузы, onStop или onDestroy. Основная деятельность/пользовательский интерфейс должны быть полностью отделены от цикла.

Кнопка остановки: останавливает выполнение всех шагов внутри цикла независимо от того, на каком этапе он находится. Отмените все запланированные задачи и остановите службу. Состояние, в котором приложение должно быть сейчас, должно быть таким, как если бы приложение запускалось в первый раз (такое же состояние было до нажатия кнопки «Старт»).

Проблема

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

Потенциальное решение

Мой цикл выше должен выполнить эти 8 шагов в таком порядке, так IntentService будет идеальным решением.

Но мой вопрос: могу ли я создать IntentService, который полностью не зависит от потока Main Activity/UI, чтобы он не полагался на жизненный цикл или активность Main Activity?

Если нет, то какой будет идеальная альтернатива для достижения этого?

Благодаря

ответ

3

Мой цикл выше должен выполнить эти 8 шагов в таком порядке, так IntentService будет идеальным решением.

Не совсем. IntentService предназначен для транзакционных видов работы: выполните несколько секунд или, может быть, минут работы, затем уйдите. Ваша потребность в том, что будет работать на неопределенный срок.

Могу ли я создать IntentService, который полностью не зависит от основного потока активности/пользовательского интерфейса, чтобы он не зависел от жизненного цикла или потока основной деятельности?

IntentService обычно имеет очень мало общего с основной технологической нитью вашего процесса.

Лучшим решением будет обычный Service. Используйте стандартный Java ScheduledExecutorService для обработки сроков событий и запуска их работы в фоновом потоке. Начните эту работу в службе onStartCommand(), вызванной вызовом startService() от вашей деятельности. Прекратите эту работу в onDestroy() вашей службы, вызванную вызовом stopService() от вашей активности. В промежутке между startService() и stopService() ваш сервис будет работать ... по крайней мере.

Еще лучше, если бы ваш период опроса был длиннее, было бы использовать AlarmManager и дать ему контроль над этими точками события во времени. Таким образом, ваш Service не будет засорять память все время. В соответствии с этим пользователи будут склонны к тому, чтобы убить приложение, если они не ценят вашу службу.

+0

Время варьируется от 60 секунд до 24 часов, поэтому, я думаю, я буду использовать Сервис для запуска AlarmManager и освобождения памяти. Мой второй вопрос заключается в том, когда нажата кнопка «Главная», получает ли активность только onPause() или onPause() + onStop() или onPause() + onStop() + onDestroy()? Поскольку я хочу убедиться, что действие не будет уничтожено, если это произойдет, я не смогу остановить службу, поскольку идентификатор службы в переменной будет потерян? Правильно? – KickAss

+0

@GBA: «Поэтому я предполагаю, что я воспользуюсь Службой для запуска AlarmManager и освободит память» - более того, вы будете использовать «AlarmManager» для выполнения «Сервиса». Если вы ожидаете, что эти события произойдут во время сна, вам может понадобиться моя «WakefulIntentService» или ее эквивалент: https://github.com/commonsguy/cwac-wakeful «Потому что я хочу убедиться, что эта активность не получается уничтожены "- ваша деятельность не будет жить вечно. «Я не смогу остановить службу, поскольку идентификатор службы в переменной будет потерян?» - у служб нет идентификаторов. – CommonsWare

+0

Будет ли диспетчер тревоги выполнять службу после того, как основное действие было получено onPause или onStop? - то есть активность теперь находится в фоновом режиме, потому что пользователь нажал кнопку «Пуск» и минимизировал приложение, чтобы продолжить выполнение своих других задач или вернуться на главный экран, чтобы заблокировать телефон. – KickAss