Потоки в сервисе. Слежение за сервисом из 2 activity

Ответить
anda
Сообщения: 1
Зарегистрирован: 24 июл 2013, 01:45

Потоки в сервисе. Слежение за сервисом из 2 activity

Сообщение anda » 24 июл 2013, 03:37

Приветствую тех кто сможет помочь или ответит.
По просьбе друга, начал писать приложение радиоплеера дня 3-5 назад. Знания java и заложенных в нее стандартных методов, объектов на данный момент довольно скудны. В целом туда же можно отнести знания android sdk.
Вступление завершено. Теперь о уже написанном приложении:
  • android:minSdkVersion="8" android:targetSdkVersion="8" планирую ввести Android Support Lib для поддержки разных версий sdk. Но пока пишу для 2.2. Различия между api 16 только в notification.
  • Foreground сервис с асинхронным вызовом playRadio(playRadio поставляется сторонней библиотекой, написанной не мною). MediaPlayer не подходит.
  • Библиотека playRadio. В наличии callback интерфейс(это вроде так называется) по смене состояний плеера и 2 функции проигрывания: асинхронное и синхронное.
  • 2 активити с одинаковым( 1в1 ) набором функций, но использующие разный layout.id.
Прошу помочь в проектировании архитектуры приложения и функций, которые можно брать из SDK. Потому что я пишу, приложение работает - но на некоторых этапах возникает четкое ощущение говнокода. Где-то можно и нужно писать элегантнее и проще, чем имеется. Например: 2 активити для разных лайаутов с одинаковым набором функций.

Впоросы:
2 лайаута написано для того чтобы вызывать сервис радиоплеера для двух разных радиопотоков.
Каждое активити запускает один и тот же сервис, передавая ему ID потока, который надо запустить через intent.putExtra.
Нужно чтобы при запуске сервиса из другого активити запущенный ранее сервис(из первого активити) прекращал свое вещание.
Проблема в том, переодически сервис запускается из другого активити, но предыдущий продолжает свою работу и его не остановить. Я так понимаю, не вызывается функция onDestroy() старого сервиса и поток просто теряется.
Что в таком случае можно делать?
Один из способов воспроизведения такого бага часто нажимать на кнопку play/stop. Я планирую написать свой OnClickListener(сейчас onClick установлен в layout) и ставить кнопке play статус disabled, до тех пор пока плеер не запустится, но я не уверен что данное действие мне поможет.
Есть подозрение, что я дурак и так и не понял как работает intent, и я просто глушу сервис неправильно. Сейчас это:
[syntax=java]public final static String INTENT_FILTER = "ru.radioplayer.oneAct";
public final static String INTENT_FILTER_OTHER = "ru.radioplayer.twoAct";
stopService(new Intent(INTENT_FILTER_OTHER));
Intent intent = new Intent(MainTwo.this, RadioPlayer.class);
startService(intent);[/syntax]

Второй вопрос не совсем по теме, но частично связан с этим.
Нет ли более простого способа реализовать два разных layout с помощью вкладок и переключения их по swipe?
Проведи пальцем влево, откроется 2 лайаут и вверху сменится таб на 2. Вправо - первый.
гугл и данный сайт дали мне 2 результата за первые 5 минут поисков. Их я не реализовывал, но может быть кто-то заранее посоветует то, что подойдет мне.
1. savagelook.com/blog/android/swipes-or-flings-for-navigation-in-android
2. http://startandroid.ru/ru/uroki/vse-uro ... oe-vkladki

vrn
Сообщения: 7
Зарегистрирован: 26 авг 2013, 10:12

Re: Потоки в сервисе. Слежение за сервисом из 2 activity

Сообщение vrn » 16 окт 2013, 09:22

Если еще нужно решение, то расскажу свое.
Запускай сервис 1 раз, и при смене активити передавай туда об этом информацию, как только сменится активити сервис об этом узнает. В этом тебе поможет биндинг. В onCreate каждой активности создай ServiceConnection, и в onServiceConnected вызывай заранее описанный тобой метод сервиса какой-нибудь типа setActivity1/setActivity2 (в них накодь, что сервис будет делать для каждой активности).

Ответить