Подтвердить что ты не робот

Выполняется ли Android-сервис из отдельного потока вместо пользовательского интерфейса?

В настоящее время я использую alarmmanager для запуска службы для размещения местоположения на http. Проблема в том, когда менеджер запускает и запускает службы, похоже, что ui некоторое время останавливается. я бы спросил, отделен ли поток службы от потока ui?

4b9b3361

Ответ 1

Скопировано из Android Документов:

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

Обзор услуг

Используйте IntentService если вы не хотите возиться с управлением потоками самостоятельно. Или используйте AsyncTasks.

Ответ 2

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

Однако, это не означает, что это приложение больше не работает. Кроме того, если в фоновом режиме есть (запущенная) служба, она может продолжаться некоторое время, пока она не прекратится, или ОС Android не прекратит ее из-за нехватки ресурсов.

Кто запускает эту службу за это время? Кто запускает onStop() или onDestroy()? Это делает основной поток приложения.

Нить пользовательского интерфейса является своего рода Singleton. Он может использоваться только одной видимой активностью за раз. Либо основной поток приложения соединяется/присоединяется к потоку пользовательского интерфейса, либо другой получает его. Однако это не означает, что приложение не имеет основного потока.

Такое поведение происходит из базы Linux\Unix системы Android. То, что большинство разработчиков не знает: Приложение является "пользователем" в ОС Linux\Unix.

Всякий раз, когда приложение вызывается, оно похоже на вход пользователя в систему. В случае приложения идентификатор пользователя является уникальным идентификатором приложения, в то время как пароль не требуется. Новый зарегистрированный пользователь (т.е. Приложение для Android) получает процесс и ресурсы, такие как экземпляр виртуальной машины Java. Этот процесс предназначен для этого пользователя, а ресурсы, включая квоту файловой системы, дескрипторы файлов и обработчики, позволяют ему взаимодействовать с ОС.

Основной поток приложения для Android - это корневой поток, который создается из процесса, который ОС Android переносит на это приложение. Любые новые потоки, созданные в этом приложении, всегда возвращаются к основному потоку.

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

С помощью определения в AndroidManifest.xml можно определить больше, чем для процесса для приложения (процесс forex Unix). Однако имейте в виду, что ресурсы, назначенные каждому процессу, будут разными, т.е. Каждый процесс будет иметь свою собственную виртуальную машину, поэтому объекты, поддерживаемые в разных процессах, не смогут обмениваться информацией через ту же кучу JVM.

Ответ 3

От разработчика Android:

Что такое служба?

Большая путаница в отношении класса Service фактически вращается вокруг того, что это не так:

Служба не является отдельным процессом. Сам объект службы не подразумевает, что он работает в своем собственном процессе; если не указано иное, он работает в том же процессе, что и приложение, в котором оно входит. Служба не является нитью. Это не значит, что нужно выполнять работу основного потока (чтобы избежать ошибок, связанных с ошибками приложения). Таким образом, сама услуга на самом деле очень проста, обеспечивая две основные функции:

Учреждение приложения, чтобы сообщить системе о том, что она хочет делать в фоновом режиме (даже если пользователь не взаимодействует напрямую с приложением). Это соответствует вызовам Context.startService(), которые запрашивают у системы расписание работы службы, которая должна выполняться до тех пор, пока служба или кто-то еще явно не остановит ее. Учреждение приложения для раскрытия некоторых функций в других приложениях. Это соответствует вызовам Context.bindService(), что позволяет установить длительное соединение с сервисом для взаимодействия с ним. Когда компонент службы фактически создан, по любой из этих причин все, что фактически делает система, представляет собой экземпляр компонента и вызывает его onCreate() и любые другие соответствующие обратные вызовы в основном потоке. Это зависит от Сервиса, чтобы реализовать их с соответствующим поведением, например, создать дополнительный поток, в котором он выполняет свою работу.

Обратите внимание, что поскольку сама услуга настолько проста, вы можете сделать свое взаимодействие с ней простым или сложным, как вы хотите: от обработки его как локального объекта Java, на который вы вызываете прямые вызовы методов (как показано в примере с Local Service Sample), для обеспечения полного удаленного интерфейса с использованием AIDL.