Зачем использовать Сервис, если он работает в том же потоке в Android
Я проходил через Bound Service на сайте разработчика Android. Я думал, что понял сервис достаточно, но я просто нашел другой способ подключения сервиса с помощью Messenger
класс специально для местного обслуживания. Там я запутался. Может быть, я неправильно понял концепцию.
Вот мое понимание Android Service
, Вы создаете сервис, когда
- Вы хотите сделать отдельные работы в фоновом режиме.
- Вы хотите сделать это отдельным процессом.
- Вы хотите, чтобы он работал в жизненном цикле, который не зависит от компонента, который его запустил.
Путаница - это первый элемент в списке, определение фона. Разве фон не является потоком или процессом? Я никогда не думал, что он может работать в главном потоке.
Вот предостережение обслуживания на страницах разработчиков о.
Внимание: служба запускается в главном потоке своего хост-процесса - служба не создает свой собственный поток и не запускается в отдельном процессе (если не указано иное). Это означает, что, если ваша служба будет выполнять какие-либо работы с ЦП или блокировать операции (такие как воспроизведение MP3 или работа в сети), вы должны создать новый поток внутри службы для выполнения этой работы. Используя отдельный поток, вы уменьшите риск ошибок приложения не отвечающего (ANR), а основной поток приложения может оставаться посвященным взаимодействию пользователя с вашими действиями.
Вопросы
- Почему выбирают использовать сервис, если сервисная функция все равно будет работать в главном потоке?
- Нужно ли нам писать сервис только для блокировки ANR, даже если трудоемкая работа выполняется в главном потоке? Предположим, услуга только для моего приложения.
- Существуют ли практические случаи или причины, по которым сервис используется как частный и работает в одном потоке?
2 ответа
Основной поток приложения не всегда является потоком пользовательского интерфейса. Например, когда Activity
остановлен, onStop()
вызывается, следовательно, поток пользовательского интерфейса отнимается от этого Activity
и перемещен в другое действие в том же или другом приложении. Однако это не означает, что приложение больше не активно, оно может продолжать работать в фоновом режиме, пока оно не будет закрыто ни ОС, ни пользователем. Тогда кто держит его в фоновом режиме? Это основной поток, а не поток пользовательского интерфейса.
Какие услуги
В Android служба - это компонент приложения, который может выполнять длительные операции в фоновом режиме в потоке пользовательского интерфейса. Под фоном это означает, что у него нет пользовательского интерфейса. Служба запускается в основном потоке процесса вызывающего компонента по умолчанию (и, следовательно, может ухудшить скорость отклика и привести к ANR), поэтому вы должны создать новый поток для выполнения длительных операций. Сервис также может быть запущен в совершенно ином процессе.
В отличие от компонентов Activity, Сервисы не имеют графических интерфейсов. Также приемники широковещания предназначены для приема широковещательных сообщений (широковещательная, многоадресная, одноадресная) и выполняют короткие задачи, тогда как службы предназначены для выполнения длительной обработки, такой как потоковая музыка, сетевые транзакции, файловый ввод-вывод, взаимодействие с базами данных и т. Д. При запуске службы компонентом приложения, таким как Activity, он запускается в фоновом режиме и продолжает работать, даже если пользователь переключается на другое приложение или сам исходный компонент уничтожается
Зачем использовать сервис
Сервисы имеют более высокий приоритет, чем другие фоновые процессы, и, следовательно, менее вероятно, что Android прекратит его. Хотя его можно настроить на перезапуск, когда снова будет достаточно ресурсов. Вы должны пройти через различные процессы и их приоритет / важный уровень в документации по процессам и потокам. Назначение им того же приоритета, что и на переднем плане, определенно возможно, и в этом случае необходимо активировать видимое уведомление (обычно используется для служб, воспроизводящих музыку).
использование IntentService
если вы не хотите возиться с управлением потоками самостоятельно. В противном случае используйте AsyncTasks
,
Пожалуйста, прочитайте эту прекрасную статью, чтобы понять более подробно, а также прочитать этот ответ.
Служба в основном работает в потоке пользовательского интерфейса или в основном потоке, но, если мы собираемся выполнять длительные операции в службе, нам нужно создать фоновый поток и выполнить эту задачу.
Но почему мы должны пользоваться услугами?
Теперь давайте подумаем о музыкальном приложении. Нам нужно, чтобы песни воспроизводились непрерывно, даже если мы выходим из музыкального приложения. Если мы используем действия, мы не сможем выполнить вышеуказанное требование. Итак, сервис помогает в таких сценариях.Даже если приложение не находится на переднем плане, сервис продолжает работать, и мы можем слушать песни. Вот почему мы используем сервис, даже если он работает в основном потоке.
Короче говоря, Службы работают на фоне потока пользовательского интерфейса. Вы можете выполнять такие задачи, как аутентификация клиент-сервер или записывать в базу данных, где задачи выполняются в фоновом режиме без графического интерфейса.
Но если вы выполняете очень длинные задачи обработки, которые могут заморозить интерфейс, вы используете службу в отдельном потоке.
например службы в отдельном потоке является IntentService