Разница между инертным приложением приложения Android или службой?

У меня есть приложение для Android, которое должно выполнять работу в фоновом режиме и в отдельном потоке. Для моего первого доказательства концепции я подклассифицировал класс Application и внутри onCreate() я создаю Thread, который выполняет фоновое действие. Это отлично работает. Тем не менее, я просто понял, что в прошлом я использовал услугу для подобных ситуаций.

Вопрос в том, есть ли причина для работы над потоком, созданным из Сервиса вместо Thread, созданного Application.onCreate()? Предполагается, что служба выполняет "фоновую" работу (она использует поток пользовательского интерфейса, если не используется Thread, я знаю), который не зависит от Activity и может работать, пока активность не видна. По-видимому, использование потока на основе приложений выполняет все это. Не используя службу, она фактически удаляет сложность, потому что Activity просто обращается к Singleton приложения. Насколько мне известно, мне не нужно связываться с Сервисом.

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

Ответ 1

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

Службы могут работать в фоновом режиме, даже если Activity больше недоступен. Они предназначены для использования, когда ваше приложение должно продолжать работать без участия пользователя в ближайшем будущем. Если вы запустите Thread в Service, поток будет продолжать работать, даже если пользователь покинет приложение. Это может быть полезно иногда, так как пользователь может захотеть, чтобы вы продолжали загружать действительно большой файл, но не хотите, чтобы приложение продолжало работать на переднем плане. Затем, через несколько часов (дни, месяцы, годы), пользователь может повторно войти в приложение, чтобы прочитать файл.

Если, однако, вы используете поток, который должен постоянно обновлять пользовательский интерфейс на основе результатов, может оказаться более полезным запустить его в рамках Activity, поскольку он не имеет реальной цели для запуска в службе. В вашей программе также может быть проще поговорить с пользовательским интерфейсом, если он находится в Управлении, а не в Сервисе. (Возможно, некоторые преимущества производительности, так как Android не должен обрабатывать еще одну услугу в этом списке, но это чисто спекуляция с моей стороны. У меня нет доказательств этого.)

ПРИМЕЧАНИЕ. Нити, созданные в действии, будут по-прежнему работать, даже когда действие завершается. Однако это просто потому, что приложение все еще находится в памяти. Активность и поток с более высоким приоритетом должны быть удалены из памяти, чем поток службы, когда активность больше не отображается.

Ответ 2

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

См. http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html