Android - Как решить, следует ли запускать Сервис в отдельном процессе? - PullRequest
45 голосов
/ 11 января 2011

Я работаю над приложением Android, которое собирает данные датчиков в течение нескольких часов. Для этого у нас есть Служба, которая собирает данные датчика (например, Ускорение, GPS, ...), выполняет некоторую обработку и сохраняет их на сервере удаленно.

В настоящее время эта служба работает в отдельном процессе (используя android: service = ": background" в манифесте). Это усложняет связь между деятельностью и службой, но мои предшественники создали приложение таким образом, потому что они думали , что отделение службы от деятельности сделает ее более стабильной.

Я хотел бы привести несколько фактических причин для запуска отдельного процесса. Каковы преимущества? Это действительно работает более стабильно? Вероятность того, что служба будет уничтожена ОС (для освобождения ресурсов), если она находится в отдельном процессе?

Наше приложение использует startForeground () и друзей, чтобы минимизировать вероятность быть убитым ОС.

Документы Android не очень конкретны в этом отношении, в основном утверждают, что это зависит от цели приложения; -)

TL; DR Каковы объективные причины для помещения длительно работающей Службы в отдельный процесс (в Android)?

Ответы [ 4 ]

20 голосов
/ 03 июня 2015

Снижение использования оперативной памяти

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

С Управление памятью вашего приложения: использовать несколько процессов :

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

Таким образом, запуск службы в отдельном процессе может, следовательно, снизить влияние приложения на производительность, а также снизить вероятность того, что служба будет убита, когда в системе недостаточно ОЗУ.

Пониженное влияние на производительность

С Управление памятью вашего приложения: переключение приложений :

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

Уменьшенная вероятность быть убитым

С Управление памятью вашего приложения: освобождайте память по мере заполнения памяти :

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

Таким образом, ваш сервис с меньшей вероятностью будет убит, если он находится в отдельном процессе, поскольку использование оперативной памяти процесса будет меньше, поскольку сервис не использует ресурсы пользовательского интерфейса.

Когда это сделать

Если ваша служба не использует startForeground(), я обнаружил, что Android просто убьет ее, когда потребуется освободить ОЗУ, поэтому потребление ОЗУ службы не так уж важно. Так что, если вы просто рассматриваете влияние на производительность ОС и других приложений, я не думаю, что стоит запускать службу в отдельном процессе.

Однако, если вы делаете , используете startForeground(), Android будет стараться поддерживать ваш сервис в максимально возможной степени, поэтому любая ОЗУ, используемая процессом , будет влиять на ОС и Другие приложения. Поэтому в этом случае я рекомендую использовать отдельный процесс, который может сэкономить не менее 10 МБ ОЗУ, чтобы не замедлять работу устройств пользователей.

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

20 голосов
/ 11 января 2011

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

Однако, похоже, что Service является правильнымВыбор функциональности, которую вы описываете.Это потому, что вы делаете некоторые операции, которые не предназначены для пользователя.Возвращаясь к описанию жизненного цикла, каждый раз, когда действие не находится на переднем плане, оно, по сути, является кандидатом на убийство.

То, что вы должны рассмотреть, это использовать AlarmManager до периодически запускать ваш Service.Возможно, вы захотите взглянуть на использование библиотеки WakefulIntent , созданной @CommonsWare.

В блоге Android есть хорошая статья, описывающая многозадачность и процессы, под названием Многозадачность Android Way, который может дать некоторые более подробные сведения о процессах, которые вас интересуют. Например:

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

14 голосов
/ 19 августа 2013

Запуск службы в своем собственном процессе имеет небольшие преимущества, заключающиеся в том, что сборщик мусора для службы не влияет на ваше приложение и что объем памяти, занимаемый службой, немного меньше, если он запускается один.

Если использование услуги другими приложениями не является обязательным для вас, предпочтите местную услугу. В качестве альтернативы вы все равно можете запустить службу в своем собственном процессе и использовать другое взаимодействие с вашим приложением, например, через приемник вещания. Подробнее см. Руководство по обслуживанию Android .

9 голосов
/ 27 сентября 2011

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

Eli

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