Сервис Android: процесс против нет - PullRequest
17 голосов
/ 03 ноября 2010

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

Ответы [ 5 ]

11 голосов
/ 08 июня 2011

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

7 голосов
/ 16 марта 2012

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

  1. Приложение требует значительных ресурсов и, вероятно, будет быстро уничтожено операционной системой. Помещение службы в отдельный процесс распределяет ресурсы, и если ваше приложение умирает, ваше обслуживание не будет.
  2. ТОЛЬКО в случае, если в вашем приложении появятся ошибки и он умрет, ваш сервис продолжит работу.

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

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

2 голосов
/ 23 февраля 2013

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

1 голос
/ 03 ноября 2010

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

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

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

Наибольшее заблуждение относительно класса Service на самом деле связано с тем, чем он не является:

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

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

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

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

0 голосов
/ 01 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...