2013-01-16 52 views
11

我正在構建使用服務進行播放的音樂播放器。我有一個活動用戶界面,可以控制(播放,暫停,接下來,...)服務。 我想在按下下一個或上一個按鈕時從我的服務更新UI。我想傳遞一個整數值。這裏是我的代碼:從服務發送數據到活動Android

我已經使用信使進行溝通。在我服務的代碼如下所示:

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

我的方法,我的下一個按鈕的點擊呼叫:

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

只要我火了NextSongChanged事件我想通過「songIndex」變成我的活動。任何想法如何實現這一目標?

我的動態代碼來處理事件:

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

我使用活頁夾來綁定服務和活動。 –

回答

14

示例代碼,希望可以幫助別人

集處理器(接收消息)和Messenger(溝通)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.設置服務等級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(); 
} 

確保在manifest申報服務和binding/unbinding服務活動。

+0

是否需要首先從客戶端活動發送請求消息開始,然後我才能收到來自服務的回覆消息作爲回覆?如果我不需要從客戶端活動請求,我需要不斷收到服務進度更​​新? –

相關問題