2011-09-03 9 views
35

मुझे एक ऐसी सेवा चाहिए जो पृष्ठभूमि में तब तक चल सकती है जब तक कि मैं रुक जाऊं, भले ही इसे शुरू करने वाला घटक नष्ट हो और गतिविधियों को बाध्यकारी भी हो। यह कैसे संभव है ?यह कैसे संभव है सेवा अनिश्चित काल तक चलती है और एंड्रॉइड में बाइंडिंग की अनुमति भी देती है?

प्रति एंड्रॉयड बाध्य सेवाओं दस्तावेज़ के रूप में - वहाँ बाध्य सेवा

  1. विस्तार बाइंडर वर्ग बनाने के तीन तरीके हैं।
  2. मैसेंजर का उपयोग करना।
  3. एआईडीएल का उपयोग करना।

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

एंड्रॉइड Services Dev Guide के रूप में यह संभव है - "हालांकि यह दस्तावेज आम तौर पर इन दो प्रकार की सेवाओं को अलग-अलग चर्चा करता है, आपकी सेवा दोनों तरीकों से काम कर सकती है-इसे शुरू किया जा सकता है (अनिश्चित काल तक चलाने के लिए) और बाध्यकारी भी अनुमति देता है। यह बस एक बात है चाहे आप दो कॉलबैक विधियों को कार्यान्वित करें: onStartCommand() घटकों को बाध्यकारी अनुमति देने के लिए इसे चालू करने और बाइंड() को अनुमति देने के लिए। "

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

मैं फेडोरा 15 ओएस में ग्रहण मंच का उपयोग कर रहा हूं।

किसी भी मदद .....

+5

"मैं एक सेवा है जो पृष्ठभूमि में अनिश्चित काल के लिए चला सकते हैं चाहता हूँ"। यदि उपयोगकर्ता महसूस करता है कि आप निरंतर मूल्य प्रदान किए बिना अपने डिवाइस संसाधनों को बर्बाद कर रहे हैं तो उपयोगकर्ता आपकी सेवा को मार देगा। ओएस आपकी सेवा को मार देगा अगर ऐसा लगता है कि यह बहुत लंबा चल रहा है। मुझे लगता है कि एंड्रॉइड अनुप्रयोगों के 0.1% से कम की एक अनन्त सेवा की आवश्यकता है। हमें विश्वास दिलाएं कि आपके एप्लिकेशन को वास्तव में ऐसी सेवा की आवश्यकता है जो हर समय चलता है। – CommonsWare

+1

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

+0

आप इसे अनिश्चित काल तक क्यों चलाना चाहते हैं? आप हमेशा क्या निष्पादित करना चाहते हैं? –

उत्तर

43

आपको इसे startService() कहीं से शुरू करने की आवश्यकता है। जब कोई और बाइंडिंग नहीं होती है तो यह स्वचालित रूप से बंद होने से रोकेगा।

Service documentation, जोर मेरा से:

एक सेवा दोनों शुरू कर दिया है और यह करने के लिए बाध्य कनेक्शन है हो सकता है। इस तरह के मामले में, सिस्टम तक चलने वाली सेवा को बनाए रखेगा या तो यह शुरू हो गया है या Context.BIND_AUTO_CREATE ध्वज के साथ एक या अधिक कनेक्शन हैं।

जैसा कि अन्य ने बताया है, संसाधनों की आवश्यकता होने पर भी एंड्रॉइड द्वारा इसे मार दिया जा सकता है। आप अपनी सेवा को "प्राथमिकता" दे सकते हैं और यदि आप इसे foreground service बनाते हैं तो इसे मारने की संभावना कम हो सकती है।

+2

@ कुशबू: यह सही जवाब है। –

+2

यह (कम से कम) हमेशा सत्य नहीं है। मैंने startService का उपयोग करके सेवा शुरू की और फिर इसे बाध्य किया। जब अंतिम बांधने वाला बांध बांधता है, तो सेवा मारे जाती है। सेवा एक अलग प्रक्रिया में चलाता है। – Harmen

5

मैं दूत सेवा के साथ सेवाओं का उपयोग नहीं किया है, लेकिन मैं एक दूरस्थ (AIDL) इंटरफेस के साथ एक दूरस्थ सेवा करने के लिए बाध्य है। मेरे निष्कर्ष कुछ मदद की हो सकती है। जैसा कि मेरे मुख्य गतिविधि और सेवा वर्तमान में लागू किया जाता है, मैं सेवा पर बने रहें जैसे आप

mServiceConnected = bindService(new Intent("com.mypackage.MyService.SERVICE"), this, 
       Context.BIND_AUTO_CREATE); 

मेरे गतिविधि की तरह कोड के साथ क्या लागू करता ServiceConnection

जब मैं unbindService (यह) के रूप में फोन गतिविधि समाप्त होती है, फिर आपको मिलती है, सेवा की ऑनस्ट्राय() विधि को कॉल किया जाता है।

यदि फिर भी, bindService लाइन से पहले, मैं भी स्पष्ट रूप से सेवा

startService(new Intent("com.mypackage.MyService.SERVICE")); 

के साथ शुरू तो निकल निष्पादित करने के लिए सेवा की OnDestroy() का कारण नहीं है। गतिविधि के ऑनस्ट्रोय/स्टॉप में अभी भी आवश्यक कॉल unbindService है, अन्यथा आप एक सेवा कनेक्शन रिसाव करेंगे।

मेरे मामले में, संभवत: सेवा अन्य रिमोट इंटरफ़ेस के माध्यम से बाध्य करने के लिए अन्य अनुप्रयोगों के लिए उपलब्ध है।

+0

मुझे दूरस्थ सेवा (एआईडीएल इंटरफ़ेस) के बारे में बहुत कुछ पता नहीं है। क्या आप समझा सकते हैं कि इसका उपयोग क्यों और कहाँ किया जाता है? मैंने एंड्रॉइड दस्तावेज़ पढ़ा और मैंने पाया कि "एआईडीएल का उपयोग केवल तभी जरूरी है जब आप विभिन्न अनुप्रयोगों से ग्राहकों को आईपीसी के लिए अपनी सेवा तक पहुंचने दें और अपनी सेवा में मल्टीथ्रेडिंग को संभालना चाहते हैं।" तो मुझे लगता है कि मुझे इसकी आवश्यकता नहीं है। मेरे आवेदन में मैं एसआईपी संदेशों के लिए सुन रहा हूं और उस अद्यतन यूई के अनुसार और प्रतिक्रिया भेज रहा हूं। मैं एआईडीएल के बारे में उलझन में हूँ। क्या आप अपना सुझाव दे सकते हैं? –

+0

@ कुशबू - मैंने केवल एक दूरस्थ सेवा और एआईडीएल का उपयोग किया क्योंकि मैं मुख्य ऐप से एक अलग एपीके में सेवा चाहता था। आपके मामले में आप अभी भी स्थानीय सेवा पर bindService और startService दोनों का उपयोग कर सकते हैं। – NickT

3

Service.onStartCommand कॉलबैक केवल तभी कॉल किया जाएगा जब आप startService विधि का उपयोग करके अपनी सेवा शुरू करते हैं। जैसा कि @ निकट और @ जोएलएफ ने पहले ही इंगित किया है कि आपको startService() पर कॉल करने की आवश्यकता है bindService() अपने क्लाइंट कोड में कहीं भी कॉल करें (उदा। ऑनक्रेट में)।

आप यह भी देखना चाहते हैं (थोड़ा पुराना, लेकिन अभी भी उपयोगी) आलेख: "Double life of a service" और प्रदान किए गए उदाहरण प्रोग्राम लेखक को आजमाएं।

2

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

http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

आधिकारिक एंड्रॉयड दस्तावेजों के रूप में पता चलता है http://developer.android.com/guide/components/services.html#StartingAService

हालांकि इस दस्तावेज़ आम तौर पर अलग सेवाओं के इन दो प्रकार की चर्चा, आपकी सेवा दोनों काम कर सकते हैं तरीकों से - इसे शुरू किया जा सकता है (अनिश्चित काल तक चलाने के लिए) और बाध्यकारी भी अनुमति दें। यह केवल एक बात है कि आप दो कॉलबैक विधियों को लागू करते हैं: onStartCommand() घटकों को बाध्यकारी की अनुमति देने के लिए इसे चालू करने और बाइंड() को अनुमति देने के लिए।

इस परियोजना सेवा (BothService) के इस मिश्रण को लागू करने और है कि कैसे एक सेवा अनिश्चित काल के लिए चला सकते हैं और यह भी कई गतिविधियों साथ बंधन की अनुमति को दर्शाता है। यह संभव नहीं है -

https://github.com/shanrais/BothService

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