2013-07-11 2 views
0

У меня есть MP3-игра Сервис, который имеет свой собственный класс и использует Mediaplayer и подключается к HTTP. Он должен воспроизводить один из URL-адресов, выбранных в предыдущем действии, который я передаю в PlayerActivity.Передача параметра в текущую нишу службы в Android

создать Service таким образом в PlayerActivity OnCreate:

  startService(new Intent(this, PlayerService.class)); 
     Intent connectionIntent = new Intent(this, PlayerService.class); 
     bindService(connectionIntent, mp3PlayerServiceConnection, Context.BIND_AUTO_CREATE); 

Вот первый запуск выбранного URL. Я запускаю MediaPlayer вызов в новом потоке, чтобы не блокировать UI (вызов в ActivityPlayer сам по себе):

private ServiceConnection mp3PlayerServiceConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName arg0, IBinder binder) { 
     mp3Service = ((LocalBinder) binder).getService(); 


     Thread t = new Thread() { 
     public void run() { 

      mp3Service.playSong(getApplicationContext(),url); 

     } 
     }; 

     t.start(); 


    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 

    } 
}; 

Проблема заключается в том, как передать новый URL в теме этой службы, когда пользователь разрушает эту активность, идет в меню и выберите новый URL. Новый поток должен воспроизводиться в одном потоке, но у меня были ситуации, которые возвращались к Home с кнопкой «Назад» и снова запускали приложение. Я получал одновременно 2 URL-адреса. Может быть, причиной новой декларации Thread(). Поэтому, когда Activity создает URL-адрес, как передать его URL-адрес прямо в поток Service, поэтому, если это старый URL-адрес, ничего не происходит, и если он новый, плеер переключается на новый URL-адрес, но не играет 2 потока вместе?

Спасибо.

+0

Вы возвращаете тот же Binder на bindService или новый? –

+0

Вот код из класса обслуживания: 'public final IBinder localBinder = new LocalBinder(); @Override public IBinder onBind (намерение намерения) { return localBinder; } Публичный класс LocalBinder extends Binder { PlayerService getService() { return PlayerService.this; } } ' – Tramway11

ответ

0

По какой-либо причине не сообщать через эфиры? Вы могли бы реализовать вложенные BroadcastReceiver в службе (и, если нужно, в активность) и просто отправлять сигналы от нее.

Если у вас есть какие-либо личные данные, вы можете использовать LocalBroadcastManager, чтобы он не был системным.

EDIT:

Для других целей, есть также Android Interface Definition Language.

+0

Возможно, я что-то видел об этом, но Служба обычно встречается первой, поэтому я выбрал более простой способ (по крайней мере, для новичков в Android) ... – Tramway11

+0

Не могли бы вы сказать что-то о том, как использовать Thread здесь? Есть ли возможное место для двух потоков одновременно? – Tramway11

+0

Вы можете указать в манифесте 'process =: process_desc'. '' 'Сделает сервис запущенным в собственном процессе. –

Смежные вопросы