2013-01-16 21 views
11

Ich baue einen Musik-Player, der einen Dienst für die Wiedergabe verwendet. Ich habe eine Aktivitäts-Benutzeroberfläche, die den Dienst steuert (Wiedergabe, Pause, Nächste, ...). Ich möchte die Benutzeroberfläche von meinem Dienst aktualisieren, wenn die nächste oder vorherige Schaltfläche gedrückt wird. Ich dachte daran, einen ganzzahligen Wert zu übergeben. Hier ist mein Code:Senden von Daten vom Dienst an Aktivität Android

Ich habe einen Messenger für die Kommunikation verwendet. Der Code in meinem Dienst wie folgt aussieht:

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

Meine Methode, die ich auf Klick auf Next-Button nenne:

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

Sobald ich das NextSongChanged Ereignis ausgelöst ich die „songIndex“ übergeben wollen Variable in meine Tätigkeit. Irgendeine Idee, wie man das erreicht?

Mein Aktivitätscode das Ereignis zu behandeln:

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

Ich benutze Bindemittel für Bind-Service und Aktivität. –

Antwort

14

Beispielcode Hoffnung andere

1. Set Handler (erhalten Nachricht) wird dazu beitragen, und Messenger (Kommunikation) 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. Setup-Dienstklasse 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(); 
} 

Stellen Sie sicher, Sie Service erklärt in manifest und binding/unbinding Dienst in Tätigkeit.

+0

Ist es notwendig, mit dem Senden einer Anforderungsnachricht von der Clientaktivität zu beginnen, dann kann nur ich eine Antwortnachricht vom Dienst als Antwort erhalten? Wie wäre es, wenn ich die Aktualisierung des Fortschritts vom Dienst erhalten möchte, ohne von der Clientaktivität anzufordern? –

Verwandte Themen