2012-05-29 5 views
7

मैं इस तरह किसी अन्य सेवा से सेवा बाध्य करने के लिए कोशिश कर रहा हूँ:जब बिल्कुल सेवा के लिए कनेक्ट की गई सेवा को कॉल किया जाएगा?

public class ServiceA extends Service { 
    private ServiceB mDataService; 
    private boolean mIsBound; 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     doBindService(); 
     /* ... */ 
    } 

    @Override 
    public void onStart(final Intent intent, final int startId){ 
     /*...*/ 
    } 

    private ServiceConnection mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) {    
      mDataService = ((ServiceB.LocalBinder)service).getService(); 
     } 
     public void onServiceDisconnected(ComponentName className) {    
      mDataService = null; 
     } 
    }; 

    void doBindService() {   
     bindService(new Intent(ServiceA.this, ServiceB.class), mConnection, Context.BIND_AUTO_CREATE);   
     mIsBound = true; 
    } 

    void doUnbindService() { 
     if (mIsBound) {      
      unbindService(mConnection); 
      mIsBound = false; 
     } 
    }  
} 

यह एक सरल टुकड़ा है कि मैं Goolge के नमूनों से ले लिया :) कोड ठीक काम करता है और mDataService ServiceB उदाहरण के लिए एक संदर्भ रखती है, है, लेकिन एक बात है जिसे मैं समझ नहीं पाया: onServiceConnected कॉलबैक को कॉल के बाद onStart पर कॉल किया जाता है। जैसा कि मैंने एंड्रॉइड के दस्तावेज़ों पर देखा, the callback is running on the main thread - लेकिन क्या मैं इस पर भरोसा कर सकता हूं कि यह मेरे मामले में हमेशा इस क्रम में होगा? ऑनक्रेट -> ऑनस्टार्ट -> ऑन-सर्विस कनेक्ट?

उत्तर

2

मैं इस पर भरोसा नहीं करता। यह निर्भर करता है कि सेवा ए और सर्विसबी एक ही या विभिन्न प्रक्रियाओं में चल रहे हैं या नहीं। यह शायद यह भी निर्भर करता है कि सेवा बी पहले ही शुरू हो चुका है या नहीं। आपको अपना कोड लिखना चाहिए ताकि आप घटनाओं के इस अनुक्रम पर निर्भर न हों।

12

यह आधिकारिक देव गाइड में स्पष्ट रूप से नहीं किया गया ने कहा है, Context.bindService() वास्तव में एक अतुल्यकालिक कॉल, क्यों ServiceConnection.onServiceConnected() एक कॉलबैक के रूप में कार्यान्वित किया जाता है यह भी स्पष्ट है। dev guide देखें:

कोई ग्राहक bindService() को कॉल करके सेवा से जुड़ सकता है। जब ऐसा होता है, तो उसे सेवा कनेक्शन का कार्यान्वयन प्रदान करना होगा, जो सेवा के साथ कनेक्शन पर नज़र रखता है। BindService() विधि बिना किसी मूल्य के तुरंत लौटाती है, लेकिन जब एंड्रॉइड सिस्टम क्लाइंट और सेवा के बीच कनेक्शन बनाता है, तो यह सेवा कनेक्शन से सेवा करने के लिए उपयोग करने वाले आईबींडर को वितरित करने के लिए सर्विसकनेक्शन पर सेवा से कनेक्ट() पर कॉल करता है।

ServiceConnection.onServiceConnected() भविष्य में कुछ बिंदु पर यूआई धागे पर कहा जाता है (तुरंत नहीं Context.bindService बुला के बाद()), एक बार सेवा करने के लिए कनेक्शन ठीक तरह से स्थापित है।

+0

यूप। और निम्नलिखित को बड़े लाल अक्षरों के साथ कहीं भी बताया जाना चाहिए: ** सेवा कनेक्शन की प्रतीक्षा करते समय गतिविधि/सेवा स्टार्टर थ्रेड को अवरुद्ध न करें! ** (अच्छी तरह से, इसे कभी भी अवरुद्ध न करें, लेकिन सेवा के मामले में बाध्यकारी होने पर यह बदतर है) – snuk182

+2

-1, देव गाइड गलत है। 'bindService()' एक मान वापस करता है। Http://developer.android.com/reference/android/content/Context.html से, "यदि आपने सेवा के लिए सफलतापूर्वक बाध्य किया है, तो सत्य वापस कर दिया गया है; अगर कनेक्शन नहीं बनाया जाता है तो झूठा वापस कर दिया जाता है ताकि आपको प्राप्त नहीं होगा सेवा वस्तु। " –

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