Накладные расходы на службы в Android (сколько я должен создать)

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

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

Теперь я создал сервис для управления этими базами данных по двум основным причинам:

  • Я хочу иметь возможность «сохранять при закрытии» (настройки), что возможно с помощью onDestroy
  • Загрузка данных занимает некоторое время, поэтому быстрое закрытие приложения сохраняет данные в памяти.

С точки зрения дизайна я мог бы:

  • Создайте один сервис, обрабатывающий обе БД
  • Создайте две службы, каждая из которых обрабатывает одну БД

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

С другой стороны, я не хочу начинать идти по этому пути, а потом, когда я привыкну делать такие вещи в «сервисах», обнаружив, что существует ограничение в 3 или 5 сервисов.

Итак, каковы накладные расходы, например. 5 запущенных сервисов или один сервис с 5 различными функциями? Любые идеи?


person Christian Ruppert    schedule 10.11.2011    source источник


Ответы (3)


Количество сервисов, эффективно поддерживаемых Android, не должно вызывать беспокойства в вашей ситуации. Увидев списки запущенных служб в некоторых диспетчерах задач, я склонен говорить, что до ~ 100 «запущенных» служб не должно быть проблемой на большинстве устройств.

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

Я хочу иметь возможность «сохранять при закрытии» (настройки), что возможно с помощью onDestroy

Разве вы не можете сделать это в своих обычных обратных вызовах жизненного цикла Activity?

Загрузка данных занимает некоторое время, поэтому быстрое закрытие приложения сохраняет данные в памяти.

Что вы подразумеваете под "быстрым закрытием"? Вы пытаетесь создать какой-то кеш для данных БД?

person JimmyB    schedule 10.11.2011
comment
Спасибо за ваш отзыв. По поводу А - нет, не хочу экономить на каждом переключении активности. Только на applicationExit, а в ApplicationClass ничего подобного нет (onTerminate применяется только к эмулятору). - person Christian Ruppert; 11.11.2011
comment
Что касается B, это приятный побочный эффект использования сервиса. Даже если приложение будет убито, служба может удерживать объекты немного дольше (и завершать работу, например, через 30 минут неиспользования) - но не волнуйтесь, моя главная мотивация - это А - сохранение при выходе, а не переключение страницы. - person Christian Ruppert; 11.11.2011
comment
Хорошо, в таком случае мне кажется, что служба, вероятно, является единственным жизнеспособным способом надежного уведомления о смерти приложения. (Я не понимаю, почему Android не предоставляет соответствующий обратный вызов, однако не удосужился продолжить расследование.) Вероятно, вы хотите связать со службой, чтобы служба была неявно уничтожена один раз. (последний) связывающий клиент уходит. - Я только что нашел это о onDestroy() службы... Кажется, не так уж просто делать то, что вы хотите. - person JimmyB; 11.11.2011
comment
WTF .... Черт, а я думал, что у меня это есть. Почему, черт возьми, они не предоставляют простой обратный вызов onDestroy. Я не хочу экономить на каждом переключении страниц! Черт, черт, черт... Ну, я могу сделать это сейчас (все равно есть инфраструктура, но все же)... Ну, оффтоп. Спасибо за ответ и ссылку! - person Christian Ruppert; 15.11.2011
comment
Добро пожаловать. И не позволяйте им слишком расстраивать вас :) - person JimmyB; 15.11.2011

Из документации Android dev...

Пользуйтесь услугами экономно

http://developer.android.com/training/articles/memory.html#Services

person user3829751    schedule 19.11.2015

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

Попробуйте использовать один сервис для обоих сценариев.

person Rajdeep Dua    schedule 10.11.2011