Порівняння локального, базового класу Сервіс ✱ з AsyncTask:
✱ (Ця відповідь не стосується експортованих послуг або будь-якої послуги, яка працює в процесі, відмінному від клієнта, оскільки очікувані випадки використання істотно відрізняються від випадків AsyncTask. Також, в інтересах стислості, характеру певних спеціалізованих Serviceпідкласи (наприклад, IntentService, JobService) будуть проігноровані тут.)
Тривалість процесу
A Serviceпредставляє для ОС "бажання програми виконувати більш тривалу операцію, не взаємодіючи з користувачем" [ ref ].
Хоча у вас Serviceпрацює, Android розуміє, що ви не хочете, щоб ваш процес був убитий. Це також справедливо щоразу, коли у вас є Activityекран, і це особливо вірно, коли ви виконуєте службу переднього плану . (Коли всі компоненти вашого додатка відійдуть, Android думає: "О, зараз саме час вбити цю програму, тому я можу звільнити ресурси".)
Крім того, залежно від останнього значення, що повертається Service.onCreate(), Android може спробувати "оживити" додатки / послуги, які були вбиті через тиск на ресурси [ ref ].
AsyncTasksне роби нічого з цього. Не має значення, скільки фонових потоків у вас запущено чи наскільки вони працюють: Android не буде підтримувати вашу програму в живих лише тому, що ваш додаток використовує процесор. Він повинен мати певний спосіб дізнатися, що у вашому додатку ще належить виконати роботу; тому Servicesзареєстровані в ОС, а AsyncTasksні.
Багатопотоковість
AsyncTasks усі про створення фонової нитки, над якою потрібно працювати, а потім представити результат цієї роботи в потоці користувальницького інтерфейсу безпечним способом.
Кожне нове AsyncTaskвиконання, як правило, призводить до більшої сумісності (більше ниток), за умови обмеження AsyncTasks'sпулу потоків [ ref ].
ServiceМетоди, з іншого боку, завжди викликаються у потоці інтерфейсу користувача [ ref ]. Це відноситься і до onCreate(), onStartCommand(), onDestroy(), onServiceConnected()і т.д. Таким чином, в певному сенсі, Servicesне "запустити" в фоновому режимі. Після запуску ( onCreate()) вони просто "сидять" там - поки не прийде час прибрати, виконати і onStartCommand()т.д.
Іншими словами, додавання додаткового Servicesне призводить до більшої сумісності. Методи сервісу не є хорошим місцем для виконання великих обсягів роботи, оскільки вони працюють на потоці інтерфейсу користувача .
Звичайно, ви можете розширити Service, додати свої власні методи та викликати їх з будь-якої потрібної вам теми. Але якщо ви це зробите, відповідальність за безпеку ниток лягає на вас - не на рамки.
Якщо ви хочете додати фонову нитку (або якусь іншу роботу) Service, ви можете це зробити. Ви можете почати фоновий потік / AsyncTaskв Service.onCreate(), наприклад. Але не всі випадки використання цього вимагають. Наприклад:
- Ви можете продовжувати
Serviceпрацювати, щоб ви могли продовжувати отримувати оновлення місця у "фоновому режимі" (мається на увазі, не маючи на Activitiesекрані жодного ).
- Або, можливо, ви хочете, щоб ваш додаток залишався в живих лише для того, щоб ви могли
BroadcastReceiverтривалий час зберігати "неявну" реєстрацію (після API 26 ви не завжди можете це зробити через маніфест, тому вам доведеться зареєструватися під час виконання [ ref ]).
Жоден із цих випадків використання не вимагає великої активності процесора; вони просто вимагають, щоб додаток не було вбито .
Як робітники
Servicesне орієнтовані на завдання Вони не створені для "виконання завдання" та "досягнення результату", як AsyncTasksє. Servicesне вирішуйте жодних проблем із безпекою потоку (незважаючи на те, що всі методи виконуються на одній нитці). AsyncTasksз іншого боку, вирішуйте цю складність для вас.
Зверніть увагу , що AsyncTaskце планується для старіння . Але це не означає , що вам слід замінити ваші AsyncTasksз Services! (Якщо ви дізналися що-небудь з цієї відповіді, то багато чого повинно бути зрозумілим.)
TL; DR
Servicesв основному існують там, щоб "існувати". Вони схожі на позаекранний екран Activity, що дає причину додатку залишатися живим, а інші компоненти дбають про "роботу". AsyncTasksробити "роботу", але вони самі по собі не підтримуватимуть процес.