Приложение для музыкального проигрывателя Android: как настроить полноценный слушатель для медиаплеера, который работает в службе? - PullRequest
2 голосов
/ 08 февраля 2012

Я пишу приложение для музыкального плеера. У меня есть объект MediaPlayer в службе. Проблема в что я не знаю, как обновить пользовательский интерфейс из службы. В качестве примера я хочу обновить оставшееся время от текущей песни, но - поскольку MediaPlayer работает, - я не могу установить прослушиватель для объекта MediaPlayer.

Я думал об отправке широковещательного сообщения с текущим временем, но если я сделаю это таким образом, мне придется отправлять сообщение каждую секунду. Полагаю, это повлияет на скорость приложения + время автономной работы

Другим решением может быть создание переменной public static в Service и доступ к ней из активности, но я прочитал, что это не очень хороший вариант.

Что ты думаешь? Знаете ли вы какой-либо - лучший - способ обновить пользовательский интерфейс из службы?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Вы можете сделать это, привязав свой сервис к активности. Выполните это с помощью AIDL в Android.

Вот очень хороший пример AIDL

Что вам действительно нужно сделать, так это создать MediaPlayer в вашем SERVICE, создать класс, расширяющий ServiceConnection, и в вашем файле .aidl создать несколько методов интерфейса, таких как:

interface IPlayerService {
    // You can pass values in, out, or inout. 
    // Primitive datatypes (such as int, boolean, etc.) can only be passed in.

    void play();
     void pause();
     void stop();
     boolean isPlaying();
     int maxDuration();
     int getCurrentPosition();
     void changePosition(int a);

     void seekComplete();

     boolean isMusicCompleted();

} 

Определите эти методы в своем классе обслуживания, создав новую заглушку в методе onBind (намерение) для класса обслуживания.

Теперь ваш mainActvity взаимодействует со службой для обновления вашего пользовательского интерфейса.

Как выполнить эти действия, приведено в примере по ссылке выше AIDL & привязать музыкальное приложение к сервису .

Надеюсь, это поможет вам решить вашу проблему.

1 голос
/ 08 февраля 2012

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

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

Запущен сервис: http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingIntentService

Локальный сервис, к которому должна быть привязана активность вашего клиента при отображении: http://developer.android.com/guide/topics/fundamentals/bound-services.html#Binder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...