2012-05-11 9 views
6

मैं documentation about Bound Services, जहां यह दिखाया गया है कि आप आसानी से एक दूरस्थ करने के लिए एक गतिविधि से संदेश के माध्यम से संवाद कर सकते हैं (यानी एक ही संदर्भ में नहीं) सेवा लेकिन वहाँ किसी भी तरह से सेवा से संदेश भेजने के लिए है पढ़ा है बाध्य गतिविधि पर? उदाहरण के लिए, मेरी गतिविधि एक ही एप्लिकेशन की चल रही पृष्ठभूमि सेवा से जुड़ी है, इसे एक संदेश भेजती है और इस संदेश के स्वागत पर सेवा गतिविधि के संदेश के साथ जवाब देती है .. मैं इसे कैसे कार्यान्वित कर सकता हूं? क्या आप मुझे कुछ दस्तावेज बता सकते हैं जो इस विषय को बताते हैं?रिमोट सेवा एक बाध्य गतिविधि को संदेश कैसे भेज सकती है?

उत्तर

4

संदर्भ प्रलेखन में Remote Messenger Service Sample पर उदाहरण मिला।

+0

क्या कोई असली दुनिया की स्थिति है जहां हमें दूरस्थ सेवा बाध्यकारी की आवश्यकता होगी? –

25

नोट: यह केवल इन-प्रोसेस सेवाओं और गतिविधियों के लिए है, सवाल पूछे जाने वाले रिमोट नहीं।

किसी गतिविधि के साथ संवाद करने के लिए एक सेवा का उपयोग करने से श्रोता बनाने में शामिल होता है जिसे आप गतिविधि से सेवा में भेज सकते हैं।

आपको एक ऐसी गतिविधि बनाने की आवश्यकता है जो किसी गतिविधि से जुड़ी हो।

पहला कदम सेवा बना रहा है। सेवा में सुनिश्चित करें कि आपके पास बाइंडर ऑब्जेक्ट है और बाइंडर ऑब्जेक्ट को वापस करने की विधि है। नीचे एक उदाहरण है जिसे मैंने अपनी बाध्यकारी को पुनः प्राप्त करने के लिए अपनी सेवा में उपयोग किया था। यह भी ध्यान दें कि इस बाइंडर में श्रोता सेट करने का एक तरीका है, जिसे सेवा में BoundServiceListener प्रकार फ़ील्ड के रूप में सहेजा जाएगा।

/** 
* Class used for the client Binder. Because we know this service always 
* runs in the same process as its clients, we don't need to deal with IPC. 
*/ 
public class DownloadBgBinder extends Binder { 

    public DownloadBgService getService() { 
     // Return this instance of LocalService so clients can call public methods 
     return DownloadBgService.this; 
    } 

    public void setListener(BoundServiceListener listener) { 
     mListener = listener; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 
} 

अब आप है कि आप बांधने की मशीन उद्देश्य यह है कि आपकी सेवा अपडेट भेजने के लिए उपयोग कर सकते हैं करने के लिए पारित कर सकते हैं इंटरफेस किसी तरह का बनाने के लिए की जरूरत है। नीचे मेरा बाउंड सेवा सेवा है।

public interface BoundServiceListener { 

    public void sendProgress(double progress); 
    public void finishedDownloading(); 
} 

अब आपकी गतिविधि में आपको सेवा सेवा कनेक्शन बनाने की आवश्यकता है जिसका उपयोग किसी सेवा के लिए बाध्यकारी करने के लिए किया जाता है। तो कुछ इस तरह जोड़ें।

/** Defines callbacks for service binding, passed to bindService() */ 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
    } 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     // We've bound to LocalService, cast the IBinder and get LocalService instance 
     DownloadBgBinder binder = (DownloadBgBinder) service; 
     mService = binder.getService(); 
     binder.setListener(new BoundServiceListener() { 

      @Override 
      public void sendProgress(double progress) { 
       // Use this method to update our download progress 
      } 

      @Override 
      public void finishedDownloading() { 

      } 
     }); 

     mBound = true; 
    } 

अब यहाँ सूचना के लिए कुंजी लाइन

binder.setListener(new BoundServiceListener() { 

    @Override 
    public void sendProgress(double progress) { 
     // Use this method to update our download progress 
    } 

    @Override 
    public void finishedDownloading() { 

    } 
}); 

है यह हिस्सा है जहां मैं वास्तव में सेवा वर्ग के लिए मेरी BoundServiceListener इंटरफ़ेस भेज रहा हूँ। सेवा वर्ग तो है कि श्रोता वस्तु यहां

if (mListener!=null) 
     mListener.finishedDownloading(); 
    if (mListener!=null) 
     mListener.sendProgress(percent); 

का उपयोग करता है अब आप रख सकते हैं इस कहीं भी आप अपनी सेवा वर्ग में करने की जरूरत है, और अपनी गतिविधि अपनी प्रगति अपडेट प्राप्त होगा।

यह भी सुनिश्चित करें कि वास्तव में बाध्य करने और सेवा शुरू करने के लिए आपकी गतिविधि में निम्नलिखित शामिल करना शामिल है।

Intent intent = new Intent(this, DownloadBgService.class); 
startService(intent); 
bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 

ध्यान रखें कि भले ही आप किसी सेवा से बंधे हों, यह वास्तव में तब तक शुरू नहीं हुआ जब तक आप प्रारंभ सेवा कॉल नहीं करते। सेवा के लिए बाध्यकारी सिर्फ सेवा को एक गतिविधि से जोड़ता है।startService() विधि सेवाओं

onStartCommand(Intent intent, int flags, int startId) 

कॉल इसके अलावा में अपनी सेवा की घोषणा अपने प्रकट

<service android:name=".services.DownloadBgService" /> 

इसके अलावा सेवा निकल जब गतिविधि के द्वारा

@Override 
protected void onStop() { 
    super.onStop(); 
    // Unbind from the service 
    if (mBound) { 
     unbindService(mConnection); 
     mBound = false; 
    } 
} 

आशा इस मदद करता है छोड़ देता है।

+1

महान उदाहरण, अवधारणा को समझाने के लिए इतना समय बिताए जाने के लिए धन्यवाद। –

+0

@Danuofr यह प्रक्रिया में काम करता है। क्या प्रक्रिया सीमाओं में मनमाने ढंग से श्रोता भेजने का कोई तरीका है? – dcow

+2

इस उत्तर के साथ केवल समस्या यह है: यह केवल स्थानीय सेवा के लिए है। लेकिन इस सवाल से स्पष्ट रूप से पूछा जाता है कि रिमोट सेवा के साथ इसे कैसे किया जाए। लेकिन इसे लिखने के लिए वैसे भी धन्यवाद। लेकिन शायद ध्यान दें कि यह वास्तविक प्रश्न का उत्तर नहीं है :) –

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