Служба Android: процесс против не

Каковы практические различия между размещением услуги в отдельном процессе или ее сохранением в основном процессе приложения? Для чего будет использоваться каждый сценарий?

Когда служба запускается в основном процессе, она будет остановлена ​​в случае сбоя приложения по какой-либо причине. Поместить сервис в свой собственный процесс разумно для некоторых сервисов, которые могут использоваться из разных приложений или служб, которые должны запускаться независимо от основного приложения.

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

  1. Приложение является ресурсом тяжелым и, скорее всего, будет быстро уничтожено ОС. Помещение услуги в отдельный процесс будет распределять ресурсы, и если ваше приложение будет умирать, ваш сервис не будет.
  2. Просто, если ваше приложение имеет ошибки и умирает, ваш сервис будет продолжаться.

Однако, если вы создадите хорошее приложение и используете хорошее программирование, вы не должны сталкиваться ни с одной из этих проблем. Имея свою службу в отдельном процессе, она вызывает проблемы с такими вещами, как SharedPreferences и одновременный доступ к БД … Я бы рекомендовал не делать этого.

Не говоря уже … другой процесс означает другой DVM. Это потребует больше ресурсов, чем работа в одном DVM и замедляет работу.

Кроме того, включение службы в другой процесс делает ваши изменения статических переменных невидимыми для основного процесса. Вы можете получить ситуацию, когда вы назначаете переменную с некоторым значением, и она не изменяется! Я потратил целый день на этот вопрос!

Ниже приведена цитата с веб-сайта разработчика Android .

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

Джейк указывает, что вы можете, через манифест, управлять именем выполняемого процесса. Но следующие результаты Documentatioin:

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

  • Служба не является отдельным процессом. Сам объект службы не подразумевает, что он работает в своем собственном процессе; Если не указано иное, он работает в том же процессе, что и приложение, в котором оно входит.

Это интересно, что сказано:

Имя процесса, в котором должна выполняться служба. Обычно все компоненты приложения запускаются в процессе по умолчанию, созданном для приложения. Он имеет то же имя, что и пакет приложений. Атрибут процесса элемента может устанавливать разные значения по умолчанию для всех компонентов. Но компонент может переопределить значение по умолчанию с собственным атрибутом процесса, что позволяет распространять ваше приложение на нескольких процессах.

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

Использование атрибута процесса службы отклоняется парсером манифеста, поэтому оно довольно вводит в заблуждение!