Intereting Posts
Как использовать ScrollView в Android? Предупреждение: этот <FrameLayout> можно заменить тегом <merge> Должен ли я использовать AsyncTask или IntentService для моего приложения? Сохранять состояние фрагмента между действиями Подписание существующего apk с помощью debug.keystore, сгенерированного eclipse Как я могу отключить 3G / Data программно на Android? «GoogleApiClient еще не подключен» исключение в приложении Cast Сопряжение эмуляторов Android и Wear Android LinearLayout с цветовым ресурсом: что я делаю неправильно? Адаптер Android Array с ArrayList и ListView не обновляется при изменении архаиста TextView анимация – затухать, ждать, исчезать Тег регистрации может содержать не более 23 символов Должен ли полный файл xml содержимого резервной копии быть пустым или вообще не добавлять, чтобы включить все? Включите / выключите светодиодный индикатор камеры / вспышку в Samsung Galaxy Ace 2.2.1 и вкладке Galaxy Как отправить объекты через комплект

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

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

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

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) { } };