2013-01-16 18 views
11

पर डेटा भेजें मैं एक संगीत प्लेयर बना रहा हूं जो प्लेबैक के लिए सेवा का उपयोग करता है। मेरे पास एक गतिविधि 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); 
     } 
    } 
} 

मेरे विधि है कि मैं अगले बटन को क्लिक पर बोल रहा हूँ:

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

नमूना कोड आशा दूसरों

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

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

क्या क्लाइंट गतिविधि से पहले एक अनुरोध संदेश भेजने से शुरू करना आवश्यक है, तो केवल मुझे जवाब के रूप में सेवा से एक उत्तर संदेश प्राप्त हो सकता है? क्लाइंट गतिविधि से अनुरोध किए बिना मुझे सेवा से प्रगति अद्यतन प्राप्त करने की आवश्यकता है? –

संबंधित मुद्दे