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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

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

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

Ответ 5

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