2013-01-16 12 views
11

Buduję odtwarzacz muzyczny, który używa usługi do odtwarzania. Mam interfejs aktywności, który kontroluje (odtwarza, wstrzymuje, dalej, ...) usługę. Chcę zaktualizować interfejs z mojej usługi po naciśnięciu następnego lub poprzedniego przycisku. Myślałem o przekazaniu wartości całkowitej. Oto mój kod:Wysyłanie danych z usługi do aktywności Android

Użyłem komunikatora do komunikacji. Kod w moim usługi wygląda następująco:

enum Event { 
    NextSongChanged, CurrentPlayingSong 
}; 

public synchronized void registerHandler(Messenger m) { 
    clients.add(m); 
} 


private void emit(Event e) { 
    for (Messenger m : clients) { 
     try { 
      m.send(Message.obtain(null, e.ordinal())); 
     } catch (RemoteException exception) { 
      /* The client must've died */ 
      clients.remove(m); 
     } 
    } 
} 

Moja metoda, że ​​wzywam kliknięciem kolejnego przycisku:

public synchronized void playnext() { 
    reset(); 
    if(songIndex < (songsList.size() - 1)) { 
     songIndex += 1; 
     playSong(songIndex); 
    } else { 
     songIndex = 0; 
     playSong(songIndex); 
    } 
    emit(Event.NextSongChanged); 
} 

Jak tylko ogień zdarzenie NextSongChanged chcę przekazać „songIndex” zmienna w moją aktywność. Masz pomysł, jak to osiągnąć?

Mój kod aktywny obsłużyć zdarzenia:

kod
private Messenger playerMessenger = new Messenger(new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (MyService.Event.values()[msg.what]) { 
      case NextSongChanged: 
       //String songTitle = songsList.get(currentSongIndex+1).get("songTitle"); 
       //currentSongIndex += 1; 
       //songTitleLabel.setText(songTitle); 
       //updatePlaying(); 
       break; 

      case CurrentPlayingSong: 
       break; 
     } 
    } 
}); 
+0

http://stackoverflow.com/questions/10664114/send-data-from-service-to-activity-and-screen-rotation – AbdulHannan

+0

Używam spoiwa dla usługi wiązania i aktywności. –

Odpowiedz

14

Próbka nadzieja będzie pomagać innym

1. Set Handler (aby otrzymać wiadomość) i Messenger (komunikowania) MainActivity.java

Messenger msgService; 
boolean isBound; 

ServiceConnection connection = new ServiceConnection() { 

    @Override 
    public void onServiceDisconnected(ComponentName name) { isBound = false; } 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     isBound = true; 
     msgService = new Messenger(service); 
    } 
}; 

public void sendMessage(View view) { 
    if (isBound) { 
     try { 
      Message message = Message.obtain(null, MessangerService.MESSAGE, 1, 1); 
      message.replyTo = replyMessenger; 

      Bundle bundle = new Bundle(); 
      bundle.putString("rec", "Hi, you hear me"); 
      message.setData(bundle); 

      msgService.send(message); //sending message to service 

     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
//setting reply messenger and handler 
Messenger replyMessenger = new Messenger(new HandlerReplyMsg()); 

class HandlerReplyMsg extends Handler { 
    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     String recdMessage = msg.obj.toString(); //msg received from service 
     toast(recdMessage); 
    } 
} 

2. Ustawianie klasy serwisowej MessengerService.java

Messenger replyMessanger; 
final static int MESSAGE = 1; 

class IncomingHandler extends Handler { 

    @Override 
    public void handleMessage(Message msg) { 

     if (msg.what == MESSAGE) { 
      Bundle bundle = msg.getData(); 
      toast(bundle.getString("rec"));//message received 
      replyMessanger = msg.replyTo; //init reply messenger 
      doSomething(); 
     } 
    } 
} 

private void doSomething() { 
    // do stuff 

    if (replyMessanger != null) 
     try { 
      Message message = new Message(); 
      message.obj = "Yes loud and clear"; 
      replyMessanger.send(message);//replying/sending msg to activity 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
} 
Messenger messenger = new Messenger(new IncomingHandler()); 

@Override 
public IBinder onBind(Intent intent) { 
    return messenger.getBinder(); 
} 

Upewnij się, że zadeklarowane Service w manifest i binding/unbinding usługi aktywności.

+0

Czy konieczne jest rozpoczęcie od wysłania najpierw wiadomości z żądaniem od klienta, czy tylko ja mogę otrzymać odpowiedź z usługi jako odpowiedź? Co powiesz na to, że muszę otrzymywać aktualizacje postępu z usługi bez żądania aktywności klienta? –

Powiązane problemy