2013-01-16 2 views
11

재생을 위해 서비스를 사용하는 음악 플레이어를 만들고 있습니다. 나는 (재생, 일시 정지, 다음, ...) 서비스를 제어하는 ​​Activity UI를 가지고있다. 다음 또는 이전 버튼을 누르면 서비스에서 UI를 업데이트하고 싶습니다. 난 정수 값을 전달 생각. 여기 내 코드는 다음과 같습니다.서비스에서 활동으로 데이터 전송 안드로이드

통신용 메신저를 사용했습니다. 내 서비스의 코드는 외모와 같은 :

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

나는 다음 버튼을 클릭에 전화하고 내 방법 : 나는 "songIndex"를 전달하려는 순간 나는 NextSongChanged 이벤트를 화재로

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

을 내 활동에 대한 변수. 이것을 달성하는 방법에 대한 아이디어?

사건 처리하는 내 활동 코드 :

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

샘플 코드의 희망이 다른 사람

1 설정 처리기 (메시지를 수신) 및 메신저 (의사 소통을하기 위해) 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); 
    } 
} 

설치 서비스 클래스 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

먼저 클라이언트 활동에서 요청 메시지를 보내는 것으로 시작해야합니까? 그렇다면 응답으로 응답 메시지를받을 수 있습니까? 클라이언트 활동을 요청하지 않고 서비스에서 진행 상황 업데이트를 계속 받아야합니까? –

관련 문제