2012-01-09 13 views
36

कहा जाता है मेरे पास गतिविधि और सेवा है। जब गतिविधि शुरू होती है, तो यह सेवा startService() पर कॉल करती है ताकि इस सेवा के साथ संवाद करने के लिए गतिविधि को नष्ट कर दिया गया हो और bindService() भी सेवा प्रदान की जा सके।एंड्रॉइड सेवा: ऑनबिंड (इरादा) और ऑनबिंड (इरादा) को केवल एक बार

bindService() सत्य लौटाता है, mService.onBind() कहा जाता है, और ServiceConnection.onServiceConnected() भी कहा जाता है। सभी काम

जब मैं बैक कुंजी दबाकर अपनी गतिविधि को नष्ट करता हूं, तो यह unbindService() पर कॉल करता है, और मेरे mService.onUnbind() को कॉल किया जाता है। bindService() रिटर्न सच (मैं इस onUnbind() में false लौट आते हैं।)

तब मैं इस गतिविधि फिर से शुरू, और फिर mService.onBind()नहीं कहा जाता है! लेकिन ServiceConnection.onServiceConnected() भी कहा जाता है, और सभी फिर से काम करता है।

ऐसा लगता है कि डाल्विक याद करते हैं कि मेरा onBind() पिछली बार लौटा, और बस onBind() पर कॉल नहीं करता है। जब मैं अपनी गतिविधि को फिर से नष्ट कर देता हूं, onUnbind() भी नहीं कहा जाता है।

मैं इस गतिविधि को किसी भी समय अपनी गतिविधि में बाध्य और अनइंड कर सकता हूं, लेकिन इन विधियों को अब तक नहीं कहा जाएगा जब तक कि मैं बिना किसी बाध्यता और stopService() पर कॉल करके सेवा को नष्ट कर देता हूं।

दस्तावेज़ों में मुझे इस व्यवहार का कोई स्पष्टीकरण नहीं मिल रहा है। इसके विपरीत, this figure दिखाता है कि onBind() और onUnbind() हर बार क्लाइंट को बाध्य और अनइंड सेवा कहा जाना चाहिए। यह आंकड़ा this Dev Guide के नीचे पाया जा सकता है।

उत्तर

47

मुझे लगता है कि this (सरकारी देव गाइड से संदर्भित) आपके सभी प्रश्नों की व्याख्या कर सकते हैं:

एकाधिक ग्राहकों सेवा करने के लिए एक ही बार में जुड़ सकते हैं। हालांकि, सिस्टम पहली बार बाइबिल बांधने पर ही आईबींडर को पुनः प्राप्त करने के लिए आपकी सेवा की ऑनबिंड() विधि को कॉल करता है। सिस्टम फिर किसी भी अतिरिक्त क्लाइंट को एक ही आईबींडर प्रदान करता है जो बाध्य() पर कॉल किए बिना बाध्य करता है।

+21

ओह धन्यवाद। दुर्भाग्य से, मुझे यह याद आया। हालांकि, मुझे पता चला कि मैं 'ऑनबिंड()' में सत्य वापस कर सकता हूं, और उसके बाद 'ऑन रिबिंड()' और 'ऑनबिंड()' को अगले क्लाइंट के लिए बुलाया जाएगा। –

+18

प्रलेखन वास्तव में भ्रामक है। यह कहता है कि 'ऑनबिंड()' पर कोई और कॉल नहीं किया जाता है, लेकिन यह केवल कई ग्राहकों के मामले पर लागू होता है। डॉक्स यह भी कहता है कि "यदि आपकी सेवा शुरू हो गई है और बाध्यकारी स्वीकार करती है, तो जब सिस्टम आपके ऑनबिंड() विधि को कॉल करता है, तो आप वैकल्पिक रूप से सत्य लौट सकते हैं यदि आप अगली बार जब ग्राहक क्लाइंट से जुड़ता है तो उसे रिबंड() पर कॉल प्राप्त करना है सेवा (** ऑनबिंड() ** पर कॉल प्राप्त करने के बजाय) "। केवल 'ऑनबिंड() 'पर कोई कॉल नहीं है। फिर भी एक और मामला जब दस्तावेज गलत है। – Malcolm

+0

@ मैल्कम में बंपिंग के लिए खेद है ... मेरे पास बाध्यकारी और अनबाइंडिंग सामान के बारे में एक प्रश्न है।अगर मैं उस सेवा के अंदर सर्वरस्केट थ्रेड डालता हूं, और गतिविधि-ए में मैं बाध्यकारी और बाध्यकारी के साथ ऑनस्टार्ट() और ऑनस्टॉप() डालता हूं। अगर मैं दूसरी गतिविधि में जाता हूं और इसे फिर से बाध्य करता हूं तो क्या इसे फिर से बनाया जाएगा? या थ्रेड अभी भी आखिरी रहेंगे? – gumuruh

0

आप इसे यहाँ पा सकते हैं: https://developer.android.com/guide/components/bound-services.html

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

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