2010-08-02 15 views
15

अपने Android एप्लिकेशन में, मैं startService और bindService दोनों फोन:क्या मुझे एंड्रॉइड सेवाओं के लिए unbindService और stopService दोनों को कॉल करने की आवश्यकता है?

Intent intent = new Intent(this, MyService.class); 
ServiceConnection conn = new ServiceConnection() { ... } 

startService(intent) 
bindService(intent, conn, BIND_AUTO_CREATE); 

बाद में, मैं दोनों unbindService and stopService` करने का प्रयास:

unbindService(conn); 
stopService(intent); 

हालांकि, मैं unbindService को फोन पर एक अपवाद मिलता है। अगर मैं इस कॉल को हटा देता हूं, तो ऐप stopService कॉल के माध्यम से ठीक से चल रहा है।

क्या मैं कुछ गलत कर रहा हूं? मैंने सोचा कि bindService कॉल को unbindService कॉल से जोड़ा जाना था, और startService कॉल को stopService कॉल से जोड़ा जाना था। हालांकि, यह मामला यहां प्रतीत नहीं होता है।

+0

क्या आपने कभी यह पता लगाया है? मैं एक ही चीज़ में भाग गया, और अपने लिए unbindService (conn) पर टिप्पणी की। ठीक काम करने लगता है, लेकिन आपके जैसे ही, मेरा आंत कहता है कि पृष्ठभूमि में कुछ इसे पसंद नहीं करेगा। –

उत्तर

24

stopService के लिए Android दस्तावेज़() कहता है:

ध्यान दें कि यदि एक बंद कर दिया सेवा अभी भी ServiceConnection वस्तुओं BIND_AUTO_CREATE सेट के साथ यह करने के लिए बाध्य है, यह जब तक इन बाइंडिंग के सभी निकाल दिए जाते हैं नष्ट नहीं किया जाएगा। सेवा के जीवन चक्र पर अधिक जानकारी के लिए सेवा प्रलेखन देखें।

तो stopService() पहले unbindService() के बाद काम करना चाहिए (यह मेरे लिए काम कर रहा है) पर कॉल।

+1

आह, तो ऐसा लगता है कि 'unbindService' के आदेश और' स्टॉप सेवा 'पीछे की ओर थे, मैं देखता हूं। –

+0

धन्यवाद, इससे मेरी मदद की! मेरे पास BIND_AUTO_CREATE का उपयोग किया गया था और unbindService() ने ServiceConnection रिसाव के साथ समस्या को हल करने में मदद की। – lomza

+0

@ मैट हग्गिन्स तो आप लोगों का मतलब है कि पहले अनबिंड करना है और फिर इसे रोकना है? –

5

जैसा कि आप देख सकते हैं here यह निर्भर करता है कि आप क्या हासिल करना चाहते हैं और आप सेवा को कैसे बाध्य करते हैं। यदि आप सेवा के लिए लंबे समय से संदर्भ चाहते हैं, तो startService की तुलना में bindService का उपयोग करना बेहतर है। यदि bindService विधि में, ध्वज BIND_AUTO_CREATE का उपयोग किया जाता है, तो आपको startService को कॉल करने की आवश्यकता नहीं है, क्योंकि जब आवश्यक हो तो सेवा स्वयं शुरू होती है।

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

+1

धन्यवाद, लेकिन मैं वहां गया हूं, और यह स्पष्ट नहीं है कि अगर मुझे BIND_AUTO_CREATE ध्वज के साथ बाध्य करने से पहले इसे मैन्युअल रूप से प्रारंभ करने के लिए सेवा को अनइंड और रोकना है तो मुझे दोनों को बंद करना होगा। –

8

एक पकड़ लिया है कि मैं इस से मारा:

सुनिश्चित करें कि आप एक ही संदर्भ है कि आप bindService कहा जाता है पर unbindService कहते हैं। मेरे मामले में, मैं इसे बाध्य करने के लिए निम्नलिखित कर रहा था:

Context c = getApplicationContext(); 
c.bindService(...); 

तो यह निकल करने के लिए, बस:

unbindService(...); 

सुनिश्चित करें कि दोनों बाँध बनाना और उसी संदर्भ समस्या हल इस्तेमाल किया निकल।

+1

धन्यवाद - बस इसके द्वारा फिसल गया – SteelBytes

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

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