2013-01-16 41 views
11

Tôi đang xây dựng trình phát nhạc sử dụng dịch vụ để phát lại. Tôi có một giao diện người dùng hoạt động kiểm soát (phát, tạm dừng, tiếp theo, ...) dịch vụ. Tôi muốn cập nhật giao diện người dùng từ dịch vụ của tôi khi nhấn nút tiếp theo hoặc trước đó. Tôi đã nghĩ đến việc truyền một giá trị số nguyên. Đây là mã của tôi:Gửi dữ liệu từ dịch vụ đến hoạt động Android

Tôi đã sử dụng một sứ giả để liên lạc. Các mã trong dịch vụ của tôi trông giống như:

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

Phương pháp của tôi mà tôi đang kêu gọi bấm vào nút bên cạnh:

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

Ngay sau khi tôi bắn sự kiện NextSongChanged Tôi muốn vượt qua "songIndex" biến thành hoạt động của tôi. Bất kỳ ý tưởng về cách để đạt được điều này?

đang Hoạt động của tôi để xử lý sự kiện:

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

Tôi sử dụng chất kết dính cho dịch vụ liên kết và hoạt động. –

Trả lời

14

mẫu mã hy vọng sẽ giúp đỡ người khác

1. Set Handler (để nhận tin nhắn) và Messenger (để giao tiếp) 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. Thiết lập lớp dịch vụ 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(); 
} 

Hãy chắc chắn rằng bạn đã khai báo dịch vụ trong manifestbinding/unbinding Dịch vụ trong hoạt động.

+0

Có cần thiết phải bắt đầu gửi một tin nhắn yêu cầu từ hoạt động của khách hàng trước không, sau đó chỉ tôi mới có thể nhận được một tin nhắn trả lời từ dịch vụ dưới dạng trả lời? Tôi cần tiếp tục nhận cập nhật tiến độ từ dịch vụ mà không cần yêu cầu từ hoạt động của khách hàng như thế nào? –

Các vấn đề liên quan