2013-01-16 12 views
11

Oynatım için bir hizmet kullanan bir müzik çalar yapıyorum. Hizmeti kontrol eden (oynat, duraklat, sonraki, ...) bir Etkinlik Arabirim var. Bir sonraki veya önceki düğmeye basıldığında UI'yi servisimden güncellemek istiyorum. Tam sayı değerini geçmeyi düşündüm. İşte benim kodum:Verileri Hizmetten Faaliyete Gönder Android

İletişim için bir elçi kullandım. Hizmetimde kod benziyor:

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

sonraki düğmeyi tıklamak sesleniyorum Benim yöntemi: Ben "songIndex" geçmek istiyorum En kısa zamanda NextSongChanged olayı olarak

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

aktivitemde değişken. Bunu nasıl başaracağınıza dair bir fikrin var mı?

olayı işlemek için My Etkinlik kodu:

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

Bağlantı hizmeti ve etkinlik için bağlayıcı kullanıyorum. –

cevap

14

Örnek kod umut başkalarına

1. Set Handler (mesaj almak için) ve Messenger (iletişim) MainActivity.java

yardımcı olacaktır
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. Kurulum hizmeti sınıfı 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(); 
} 

Eğer manifest yılında Service ilan ve aktivitede binding/unbinding Servis emin olun.

+0

Önce müşteri etkinliğinden bir istek mesajı göndermekten başlamalı mıyım, o zaman sadece cevap olarak servisten cevap mesajı alabilir miyim? İstemci etkinliğinden talep etmeden hizmetten ilerleme güncellemesi almaya devam etmem ne dersiniz? –