Само собой, но тогда приложение будет висеть в памяти всегда, а не только когда это необходимо. Сервис — самый разумный способ реализовать фоновую задачу, которая должна быть завершена даже в случае закрытия приложения.
Например, в моем проекте критично быть онлайн и получать обновления. Информация об обновлениях показывается в области уведомлений. Приложению при этом совсем не нужно быть запущенным.
Для всех сетевых взаимодействий запущен один отдельный поток с блокирующей очередью запросов. Такой подход себя зарекомендовал в нескольких проектах (Android и Java ME).
Возможно это дело вкуса, но я очень не люблю эти вложенные классы. В своей задаче у меня несколько сетевых потоков, вызывающих отдельные классы реализующие Runnable и получающих в качестве аргумента конструктора экземпляр Handler. Обмен с потоком осуществляется через Message. Если в общих чертах, это выглядит так:
Есть еще нюанс, я по такой схеме сделал приложение, которое поллит сервер и шлет данные в гуи. Но вот гуевый компонент передавал в сервис через статическое поле, что, вероятно приводило к проблемам. Таймер (да и экзекутор) отказывался второй раз выполнять асинк таск, без каких либо эксепшинов или записей в логах.
Помучавшись пару вечеров, я сдался и написал вопрос на stackoverflow и мне порекомендовали сделать по человечески. В смысле передавать данные от сервиса к клиенту через Intent и Listener'a.
Сделал, как написал вумный дядя и сразу все прекрасно заработало. Смотреть второй ответ, у которого меньше очков.
AlarmManager слишком тяжелый для простых случаев. Он больше подойдут стартовать приложение в указанное время + будить телефон из спячки + держать его не спящим.
Взгляните на WakefullIntentService — очень красивое решение бекграунд-вопросов. Не спит, выполняется в отдельном потоке, живет ровно столько, сколько нужно на выполнение поставленных в очередь задач.
А что если в приложении нужно реализовать например счетчик подсчета СМС например через BroadcastReceiver? Если запустить его в Main Activity то в какой то момент андроид может освободить апликацию.
Была мысль сделать его через Service: Main Activity запускает сервис который запускает BroadcastReceiver.
Но почитав тут уже не уверен…
Выполнение задач в бэкграунде