2

В виде recent answer я прочиталУслуги, нити и процесс

Служба не запускается в отдельном потоке, он работает в потоке пользовательского интерфейса

Я читал подобные заявления в многие другие вопросы, связанные с обслуживанием.

Если я называю startService() из Activity, будет ли Service запустить на Activity «s UI Thread или это породит новый процесс с его собственным интерфейсом Thread?

Если он работает на пользовательском интерфейсе ActivityThread, не может ли это быть причиной того, что Activity не отвечает?

ответ

3

Да, службы работают в основном потоке. О ANR (приложение не отвечает), у вас будет больше шансов ANR, если ваша служба выполняет длительную обработку с использованием CPU, поэтому официальные документы также рекомендуют использовать эффективность Worker Threads. docs

Вы должны прочитать соответствующий параграф осторожности в документах, чтобы подтвердить

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

android: process: Использование этого для запуска службы в другом процессе вызовет использование большего объема памяти. Это приведет к созданию двух процессов для вашего приложения в отдельном пространстве памяти кучи, которое также потребует другого обслуживания. Так что это редко используется, и я бы не рекомендовал использовать его для выполнения обычной задачи обслуживания.

+0

Кто бы ни проголосовал за это, пожалуйста, оставьте комментарий по причине –

2

Если я называю startService() из Activity, будет ли работать на Service Activity «s UI Thread или это породит новый процесс с его собственный интерфейс Thread?

Если это Service (не IntentService), он будет работать на главных Thread процессе вашего приложения, до тех пор, пока вы не определили его как отдельный процесс, в явном виде (путем добавления android:process тега в Manifest).

Если он работает на Activity «s UI Thread, не что риск делает Activity отвечать на запросы?

Да, это так, если вы выполняете интенсивные/блокирующие операции ЦП.

Чтобы предотвратить это, вы можете начать новый Thread (s) из Service или использовать IntentService, который будет автоматически порождать новый рабочий Thread для своей работы.

1

Из Services Docs в нем четко объясняется ваш ответ.

Внимание: служба работает в основном потоке своего хостинг-процесса в службы не создает свой собственный поток и не запускается в отдельном процессе (если не указано иное). Это означает, что если ваша услуга будет выполнять любые активные или блокирующие операции процессора (например, воспроизведение MP3 или сетевое взаимодействие), вы должны создать новый поток в службе для выполнения этой работы. Используя отдельный поток, вы уменьшите риск ошибок приложения, не отвечающих (ANR), и основной поток приложения может оставаться посвященным взаимодействию пользователя с вашими действиями.

+0

, это уже в моем ответе с смелой осторожностью с документами документов. –

0

IntentService работает на фоновом потоке, поэтому, если вы хотите выполнять одноразовые задачи, используйте это.

+0

'IntentService' не работает на фоновом потоке. Методы жизненного цикла 'IntentService' работают в основном потоке (UI), точно так же, как и методы жизненного цикла всех служб. «IntentService» создает один (или более) рабочий поток, который используется для «выполнения работы» «IntentService», посредством вызова «onHandleIntent()» (который вызывается в рабочем потоке, а не на главном (UI). Однако «IntentService» не всегда является лучшим решением проблемы, поэтому предположить, что OP использует «IntentService», ничего не зная о его приложении, не помогает. –

1

В недавнем ответе я прочитал

A service does not run on its own thread, it runs on the UI thread 

Это просто неправильно. A Service - это объект (экземпляр класса). Он не работает ни на одном потоке, он не запускается вообще. Это просто «есть». Методы Service могут работать на любом потоке, в зависимости ...

В частности, методы жизненного цикла Service (onCreate(), onStartCommand() и т.д.), которые вызываются непосредственно из Android рамочным запуска на главном (UI) который может быть или не быть тем же самым потоком, который называется startService(). Тем не менее, Service может (и обычно делает) запускать другие фоновые потоки, сколько им нужно, для выполнения необходимой работы.

Если я называю StartService() от деятельности, будет служба запускаемые на Activity в UI Thread или это породит новый процесс с его собственным UI тему?

См. Выше. Если вы хотите, чтобы ваш Service работал в отдельном процессе, вы можете сделать это, указав в манифесте android:process=":service" в декларации <service>. По умолчанию службы выполняются в том же процессе, что и другие компоненты (Activity, BroadcastReceiver и т. Д.) Вашего приложения.

Если это работает в потоке пользовательского интерфейса, это не значит, что риск Действия не реагируют?

Это зависит от того, что делает ваш Service! Очевидно, что если ваш Service выполняет большую вычислительную обработку в потоке пользовательского интерфейса, это сделает ваше приложение неприемлемым. Если ваш Service делает ввод-вывод в потоке пользовательского интерфейса, Android обычно бросает исключения (в более поздних версиях Android). Именно по этой причине службы обычно запускают фоновые потоки для работы. Однако, если ваш Service является легким, тогда нет причин, по которым методы вашего Service не могут работать в потоке пользовательского интерфейса. Как я уже сказал, это зависит ...

+0

«Это просто неправильно». Я думаю, вы здесь немного педантичны. Слово «сервис» может иметь несколько значений в зависимости от контекста и капитализации. «Сервис» - это класс, конечно, и мы можем создавать экземпляры этого класса. Тем не менее, я думаю, что «служба» может действительно ссылаться на исполняемый код в памяти, который по сути является методами методов жизненного цикла и методов, которые они называют. –

+0

@ Code-Apprentice Извините, но я должен не согласиться. В Android «Сервис» - очень конкретная и важная концепция/компонент. Мои комментарии могут звучать педантично для вас, но есть буквально тысячи разработчиков Android, у которых нет даже базового понимания того, что эти компоненты и как они на самом деле работают. Единственный способ «очистить воздух» и вернуть здравый смысл в развитие Android - это бороться с этой дезинформацией во всех случаях. –

+0

Кроме того, если вы посмотрите на вопрос/ответ, с которым вы связались, очень ясно, что человек ссылается на Android «Сервис» (компонент), а не на общую вычислительную концепцию. –

Смежные вопросы