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

Android - Как решить, запускать ли службу в отдельном Процессе?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Сокращение использования ОЗУ

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

От Управление памятью приложения: используйте несколько процессов:

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

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

Снижение производительности

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

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

Снижение вероятности быть убитым

От Управление памятью приложения: освободите память, когда память станет жесткой:

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Эли