Сравнение локальной внутрипроцессной службы базового класса ✱ с 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, вы можете это сделать. Например, вы можете запустить фоновый поток / AsyncTaskin Service.onCreate(). Но не для всех случаев использования это требуется. Например:
- Возможно, вы захотите продолжить
Serviceработу, чтобы продолжать получать обновления местоположения в «фоновом режиме» (то есть, не обязательно на Activitiesэкране).
- Или вы можете захотеть сохранить свое приложение в рабочем состоянии, чтобы вы могли поддерживать «неявную»
BroadcastReceiverрегистрацию на долгосрочной основе (после API 26 вы не всегда можете делать это через манифест, поэтому вам нужно зарегистрироваться во время выполнения). [ ref ]).
Ни один из этих вариантов использования не требует большой загрузки процессора; они просто требуют, чтобы приложение не было убито .
Как рабочие
Servicesне ориентированы на задачу. Они не настроены «выполнять задачу» и «приносить результат», как AsyncTasksони. Servicesне решают никаких проблем безопасности потоков (несмотря на то, что все методы выполняются в одном потоке). AsyncTasks, с другой стороны, справитесь с этой сложностью за вас.
Обратите внимание, что AsyncTaskэта функция устарела . Но это не означает , что вам следует заменить ваши AsyncTasksс Services! (Если вы что-то узнали из этого ответа, это должно быть ясно.)
TL; DR
Servicesв основном существуют, чтобы «существовать». Они похожи на заклинание Activity, заставляя приложение оставаться в живых, в то время как другие компоненты делают «работу». AsyncTasks«работают», но сами по себе они не будут поддерживать процесс.