बस एक बाध्य ग्राहक पर सूचना भेजते समय और 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()
पर कॉल करना होगा। यदि आप प्रक्रियाओं में अपनी सेवा के साथ संवाद कर रहे हैं तो आप इसे विभिन्न तरीकों से पूरा कर सकते हैं, अधिकतर प्रसारण या आईबींडर इंटरफ़ेस या मैसेंजर या एआईडीएल के माध्यम से।
ठीक है। इसलिए 'सेवा' को सूचित करने के लिए मैं 'प्रसारण' भेजूंगा। – jul
यदि आप सेवा से जुड़ते हैं तो आप केवल एक नोटिस भेज सकते हैं और फिर स्टॉपसेल्फ() –
'स्टॉपसेल्फ()' को सीधे 'सेवा' (जिसे करने के लिए और डाउनलोड नहीं किया जा रहा है) में कहा जाता है, न कि किसी विधि से 'गतिविधि'। – jul