Intereting Posts
Библиотека фильтров с открытым исходным кодом, такая как Instagram? Dagger 2 issue overriding single предоставляет аннотированный метод из модуля в библиотеке, которая использует приложение Кнопки управления внутри уведомлений об андроидах Дождитесь, пока firebase извлечет данные Уведомление от Google не исчезает после нажатия на значок LocationManager возвращает старое кэшированное местоположение Wifi с текущей меткой времени ByteBuffer Вставка Little Endian не работает Android Fragment – переход от одного вида к другому? Вставка значений в таблицу SQLite на Android Выберите «Диалоговое окно« Файл » Как получить источник ImageView, чтобы изменить его? Как зарегистрировать этот планшет в списке Ubuntu udev? Android In App Billing: покупка продолжает отменять ответ пользователя -1005 Каждый браузер, основанный на WebKit, разбивает сайты с помощью Omniture. Зачем? Что такое прецедент для фрагмента без пользовательского интерфейса?

Привязать услугу к активности или фрагменту?

Я работаю над приложением для музыкального плеера. У меня есть основное действие, которое имеет несколько фрагментов, каждый из которых отображает песни на альбоме устройства, мудрый, художник и т. Д.
У меня есть музыкальный сервис, который обрабатывает все воспроизведение и другие вещи.
То, что я смущен, – это привязка этой службы к различным фрагментам, которые у меня есть.
Прямо сейчас я привязываю основную деятельность и каждый фрагмент в отдельности к сервису и его работу очень хорошо. Но мне было интересно, действительно ли это лучшая практика? Есть ли способ связать основное действие с сервисом, а затем каким-то образом использовать его в своих дочерних фрагментах?
Возможно, мне не хватает элементарной концепции деятельности или фрагментов или служб. Так что, пожалуйста, помогите мне в этом отношении.
Я предполагаю, что это скорее концептуальный вопрос, поэтому никакой код не нужен. Но все же, если это необходимо, пожалуйста, дайте мне знать.

РЕДАКТИРОВАТЬ :
Мой вопрос: что было бы лучшим способом связать службу с активностью с несколькими дочерними фрагментами (каждый из которых будет использовать эту услугу)?

Solutions Collecting From Web of "Привязать услугу к активности или фрагменту?"

Свяжите Service с вашей деятельностью, а не с Fragment . Описание вашего приложения, одно действие с несколькими Fragment , которые меняются местами и вне их, делает это наиболее (и действительно только) практическим подходом.

Когда вы привязываете Service к Activity вы привязываете ее жизненный цикл к ресурсу Activity . См. Связанные службы . Каждый раз, когда вы добавляете или удаляете Fragment в своей деятельности, Fragment создается и уничтожается. Вы не хотите пытаться связать службу с этим процессом, потому что тогда вам придется создавать и уничтожать службу каждый раз, когда создается или уничтожается новый фрагмент.

Вместо этого привязывайтесь к Activity узла. Затем вы можете взаимодействовать с активностью вашего хоста с вашими фрагментами с помощью интерфейса для доступа к связанной службе или по Intent .

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

Я вижу два основных преимущества в соединении с фрагментом:

  1. Служебное соединение асинхронно, поэтому внутри фрагмента вы никогда не уверены, что служба, которую вы получаете от активности, не является нулевой. Это приведет вас хотя бы к некоторым проверкам нулевого указателя и к некоторому механизму для обновления фрагмента как при его создании, так и при подключении службы (так что вы уверены, что будете отображать данные независимо от того, какая из них произойдет первой).
  2. Вы не зависите от конкретной активности, с которой ваши фрагменты уходят. Чтобы получить услугу из этой активности, я думаю, что вы делаете актерский состав для определенного класса активности. Вы можете создать такой интерфейс, как BoundActivity, с помощью метода getBoundService, чтобы получить сервис от него, но я думаю, что это накладные расходы, учитывая преимущество пункта 1. И что, если у вас есть несколько сервисов.

ОБНОВИТЬ

Вот очень простой проект, показывающий это. https://github.com/ena1106/FragmentBoundServiceExample

Вы можете получить доступ к своей деятельности из фрагмента методом getActivity()

Вы можете использовать лоток с использованием шаблона шины событий с помощью этой библиотеки, шаблона публикации / подписки eventbus. https://github.com/greenrobot/EventBus проверьте сайт проекта для получения дополнительной информации.

Вы можете отправлять события с / на службу на активные или фрагменты

Если вам нужно получить некоторые данные из вашей службы в ваш фрагмент в начале жизненного цикла фрагмента, onServiceConnected в действии еще не вызывается, в основном, когда вы вращаете свое устройство, и вы получите NPE. Я думаю, что это хорошая идея, пусть фрагмент создает свои собственные соединения, поскольку служба запускается с помощью startService (), а не с bindService ().

Я связываю службу в разделе «Мой хост-активность» и передаю объект Ибндера Bundle, который задан в аргументах.

И моему коду может понравиться следующее:

 private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //put service in bundle } @Override public void onServiceDisconnected(ComponentName name) { } };