Когда использовать и когда не использовать сервис в Android

Я разрабатываю для Android чуть менее 2 лет, и я все еще озадачен этим, казалось бы, простым вопросом. Когда следует реализовать службу? Из моего опыта есть несколько редких случаев, но я сомневаюсь в этом, потому что на каждом телефоне их довольно много, и я сомневаюсь, что это просто плохой дизайн приложения.

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

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

кроме этого, я никогда не видел требования к постоянно работающей службе, потому что:

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

B) если запланированное выполнение является обязательным, можно подписаться на события тревоги.

C) я знаю, что сервис в Android совсем другой, чем, например, в Windows, так как в Android-сервисах просто "пакет" для организации вашего кода и системы управления временем жизни объекта. Службы используют основной поток, но принято создавать новые нити в них.

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

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

таковы мои мысли об услуге, и я надеюсь, что кто-то с большим опытом сможет объяснить эти плюсы и минусы (наряду с другими, которые я, вероятно, пропустил).

3 ответов


когда следует реализовать сервис?

когда у вас есть работа-ценность для пользователя-это:

  • требуется некоторое время для завершения, возможно, дольше, чем у вас есть время в компоненте, желающем выполнить работу, или

  • предоставляет это значение под контролем пользователя (например, музыкальный плеер, управляемый кнопками воспроизведения / паузы в пользовательском интерфейсе) или

  • в редких случаи, должны быть запущены непрерывно, так как он обеспечивает значение непрерывно

их довольно много, и я сомневаюсь, что это просто плохой дизайн приложения

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

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

это разумное использование для службы, ИМХО.

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

я предполагаю, что под "намеренными слушателями" вы подразумеваете манифест-зарегистрированный BroadcastReceivers. В этом случае, если работы с BroadcastReceiver займет больше миллисекунды, эта работа должна быть делегирована IntentService для завершения. onReceive() вызывается в основном потоке приложения, и это небезопасно для зарегистрированного манифеста BroadcastReceiver для развилки голой нити, так как процесс может уйти вскоре после onReceive() возвращает. Однако в этих случаях служба обычно недолговечна (например, сделайте некоторый сетевой ввод-вывод и дисковый ввод-вывод, а затем уйдите).

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

An AsyncTask является прекрасным решением для фоновой работы это:

  • запрошено пользовательским интерфейсом (действие или фрагмент) и

  • займет меньше секунды или около того, и

  • не критично

например, если вы загружаете аватары, чтобы показать в ListView, AsyncTask, вероятно, прекрасный выбор, используете ли вы их напрямую или используете некоторую библиотеку извлечения изображений, которая использует их внутри.

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

обратите внимание, что если фоновая работа может занять 15 + секунд,WakefulBroadcastReceiver или мой WakefulIntentService вероятно, хорошая идея, поэтому устройство не засыпает, пока вы пытаетесь завернуть этот бит работы.


Я могу назвать некоторые из услуг, используемых из моего опыта:

для реализации

  1. слушатель месте,
  2. звуковой модуль, генерирующий различные голоса
  3. в обновлениях контента приложения,
  4. API, предоставлять услуги другим приложениям
  5. в приложение биллинга
  6. связь с веб-сервисами (если частота запросов высока)

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

Я предпочитаю смотреть на AsyncTasks так же, как исполнители (ExecutorService), они должны выполняться последовательно и для небольших задач.


Если вы рассматриваете UI и связанные службы, u будет думать, что оба могут существовать и ничего не делать для периодов certian. В таких сценариях ваш пользовательский интерфейс может быть воссоздан много раз, однако Служба этого не делает. И здесь важно обслуживание. Допустим, вы обрабатываете изображения, а затем поворачиваете устройство, которое хотите продолжить обработку во время воссоздания пользовательского интерфейса. Вы записываете голос, а затем поворачиваете устройство. Это одно из мест, где я нашел обслуживание очень важно. (Имея много тяжелой обработки данных, взаимодействия с web, что может быть несколько секунд)