Запускается служба Android от отдельной теме, а не интерфейса?



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

529   3  

3 ответов:

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

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

Обзор услуг

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

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

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

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

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

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

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

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

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

Можно определить больше, чем на процесс для приложения (Unix process fork) через определение в AndroidManifest.XML. Однако имейте в виду, что ресурсы, назначенные каждому процессу, будут различны, то есть каждый процесс будет иметь свою собственную виртуальную машину, следовательно, объекты, обслуживаемые в разных процессах, не смогут обмениваться информацией через одну и ту же кучу JVM.

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

Что такое услуга?

Большая путаница в отношении класса обслуживания на самом деле вращается вокруг того, чем он не является:

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

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

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

Comments

    Ничего не найдено.