2013-07-18 7 views
18

मेरे पास Activity है जिसमें मैं Service डाउनलोड करने के लिए शुरू करता हूं और बाध्य करता हूं।onServiceDisconnected() को सेवा रोकने के बाद कॉल नहीं किया गया है()

Service में पर onServiceDisconnected()Activity में कॉल नहीं किया जाता है।

मुझे उम्मीद है कि इसे Service बंद कर दिया गया है, इसलिए सभी बाध्य गतिविधियां अनबाउंड होनी चाहिए।

मुझे क्या याद आ रही है?

उत्तर

24

आधिकारिक दस्तावेज के मुताबिक, सेवा डिस्क्लेक्टेड() पर सेवा को क्रैश या मार डाला जाने पर कहा जाएगा। लिंक http://developer.android.com/reference/android/content/ServiceConnection.html

कॉल किया गया जब सेवा से कनेक्शन खो गया है। यह आमतौर पर तब होता है जब सेवा की प्रक्रिया को क्रैश या मार दिया गया है। यह सर्विसकनेक्शन को स्वयं नहीं हटाता है - सेवा के लिए यह बाध्यकारी सक्रिय रहेगा, और जब सेवा अगली चल रही है तो आपको सेवा कनेक्ट (कॉम्पोनेंटनाम, आईबिन्डर) पर कॉल प्राप्त होगा।

+1

ठीक है। इसलिए 'सेवा' को सूचित करने के लिए मैं 'प्रसारण' भेजूंगा। – jul

+0

यदि आप सेवा से जुड़ते हैं तो आप केवल एक नोटिस भेज सकते हैं और फिर स्टॉपसेल्फ() –

+0

'स्टॉपसेल्फ()' को सीधे 'सेवा' (जिसे करने के लिए और डाउनलोड नहीं किया जा रहा है) में कहा जाता है, न कि किसी विधि से 'गतिविधि'। – jul

21

बस एक बाध्य ग्राहक पर सूचना भेजते समय और stopSelf() (या stopService()) बुला वास्तव में पूरा नहीं होगा तुम क्या करने कोशिश कर रहे हैं। वास्तव में सेवा को नष्ट करने के लिए आपको बाध्य ग्राहक में unbindService() पर कॉल करना होगा (और सेवा में कोई अन्य बाध्य ग्राहक नहीं होना चाहिए)।

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

1) प्रारंभ सेवा: आप इसे शुरू करने के लिए startService() पर कॉल करते हैं; सेवा केवल stopService() या stopSelf() पर कॉल करके रुक जाएगी।

2) बाउंड सेवा: आप bindService() पर कॉल करते हैं और BIND_AUTO_CREATE ध्वज में पास करते हैं। अन्य ग्राहक इच्छा से सेवा को बाध्य और बाध्य कर सकते हैं, जब सभी क्लाइंट अलग हो जाते हैं तो सेवा स्वचालित रूप से नष्ट हो जाएगी। इस मामले में, stopService() या stopSelf() पर कोई प्रभाव नहीं पड़ता है।

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

कॉम्बो सेवाओं के लिए जीवन चक्र के लिए दस्तावेज़ का कहना है:

इन दोनों रास्तों पूरी तरह से अलग नहीं हैं। यही है, आप सेवा से जुड़ सकते हैं जो पहले ही startService() से शुरू हो चुका था। उदाहरण के लिए, पृष्ठभूमि संगीत सेवा startService() पर कॉल करके संगीत को पहचानने के इरादे से शुरू किया जा सकता है।बाद में, संभवतः जब उपयोगकर्ता खिलाड़ी पर कुछ नियंत्रण करना चाहता है या वर्तमान गीत के बारे में जानकारी प्राप्त करना चाहता है, तो bindService() पर कॉल करके एक गतिविधि सेवा से जुड़ सकती है। इस तरह के मामलों में, stopService() या stopSelf() वास्तव में सेवा सेवा को तब तक नहीं रोकता जब तक सभी क्लाइंट अनबाइंड न हों।

तो आपके मामले में, आपके पास एक बाध्य ग्राहक है। कॉलिंग stopSelf() जबरन बाध्य ग्राहकों को डिस्कनेक्ट नहीं करता है, इसलिए आपको स्पष्ट रूप से अपने क्लाइंट को सूचित करना होगा कि सेवा बंद करना चाहती है, और फिर सेवा को नष्ट होने से पहले आपके क्लाइंट को unbindService() पर कॉल करना होगा। यदि आप प्रक्रियाओं में अपनी सेवा के साथ संवाद कर रहे हैं तो आप इसे विभिन्न तरीकों से पूरा कर सकते हैं, अधिकतर प्रसारण या आईबींडर इंटरफ़ेस या मैसेंजर या एआईडीएल के माध्यम से।

+0

दिलचस्प, धन्यवाद। तो जब मेरी 'सेवा' से 'stopSelf() 'को कॉल करते समय, मुझे अपने क्लाइंट को' ब्रॉडकास्ट 'भी भेजना होगा ताकि वह उसे अनबिंड कर सके। – jul

+0

उत्कृष्ट स्पष्टीकरण, धन्यवाद। –

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