सेवा शुरू करने के लिए Android onCreate या onStartCommand


105

आमतौर पर जब मैं एक एंड्रॉइड सेवा बनाता हूं तो मैं onCreateविधि को लागू करता हूं , लेकिन मेरी अंतिम परियोजना में यह काम नहीं करता है। मैंने लागू करने की कोशिश की onStartCommand, और यह काम करने लगता है।

सवाल यह है: जब मुझे एक सेवा को लागू करना है तो किस विधि की आवश्यकता है? मुझे किन तरीकों को लागू करना है? onCreate, onStartCommandया दोनों? और प्रत्येक की भूमिका क्या है?


onCreateहमेशा परवाह किए बिना कहा जाता है
इगोरगानपोलस्की

जवाबों:


189

onCreate()कहा जाता है जब Serviceवस्तु को तत्काल (अर्थात: जब सेवा बनाई जाती है )। आपको इस तरीके की चीजें करनी चाहिए जो आपको केवल एक बार करने की आवश्यकता है (यानी: कुछ चर को इनिशियलाइज़ करें, आदि)। onCreate()केवल कभी भी एक बार प्रतिलेखित वस्तु कहा जाएगा ।

आपको केवल तभी लागू करने की आवश्यकता है onCreate()जब आप वास्तव में केवल एक बार कुछ शुरू करना चाहते हैं ।

onStartCommand()कहा जाता है कि हर बार एक ग्राहक सेवा का उपयोग शुरू करता है startService(Intent intent)। इसका मतलब है कि onStartCommand()कई बार कॉल किया जा सकता है। आपको इस विधि में उन चीजों को करना चाहिए जो हर बार क्लाइंट को आपकी सेवा से कुछ अनुरोध करने की आवश्यकता होती है । यह इस बात पर बहुत निर्भर करता है कि आपकी सेवा क्या करती है और यह ग्राहकों के साथ कैसे संवाद करती है (और इसके विपरीत)।

यदि आप कार्यान्वित नहीं करते हैं, onStartCommand()तो आप Intentउस ग्राहक से कोई भी जानकारी प्राप्त करने में सक्षम नहीं होंगे जो onStartCommand()आपकी सेवा से गुजरता है और आपकी सेवा कोई उपयोगी कार्य करने में सक्षम नहीं हो सकती है।


6
एक ही सेवा के दो उदाहरण एक आवेदन के भीतर मौजूद हो सकते हैं?
जैकट्रेड

1
@jacktrades सैद्धांतिक रूप से और प्रलेखन के अनुसार: नहीं। हालांकि, एंड्रॉइड में कुछ बग प्रतीत होते हैं जहां वास्तव में कुछ परिस्थितियों में यह एक सेवा के कई उदाहरणों का निर्माण करेगा। हालाँकि, जैसा कि मैंने कहा, यह एक बग है, और हम मज़बूती से इसे पुन: पेश करने में सक्षम नहीं हैं। तुम क्यों पूछ रहे हो?
डेविड वासर

3
@Mr_and_Mrs_D कोई आधिकारिक बग नहीं हैं जहाँ तक मुझे पता है। हालाँकि, ऐसा होने की कई रिपोर्ट हैं और मेरे पास एक एप्लिकेशन है जहां मुझे पता है कि यह हो रहा है। मैं समस्या को कुछ छोटे और दोहराए जाने में कम करने में असमर्थ रहा हूं इसलिए मैंने खुद बग दर्ज नहीं किया है। प्रलेखन स्पष्ट रूप से नहीं बताता है कि सेवाएं एकल हैं, लेकिन यह बहुत स्पष्ट है कि इसका उद्देश्य क्या है। 'StartService () `के लिए डॉक्स को देखें: स्पष्ट रूप से कहा गया है कि यदि सेवा पहले से ही नहीं चल रही है, तो इसे बनाया और शुरू किया जाएगा, अगर यह चल रहा है तो यह चालू रहता है
डेविड वाशर

6
@Diffy जब आप कॉल करते हैं startService(), यदि सेवा नहीं चल रही है, तो एंड्रॉइड सेवा वर्ग का एक उदाहरण बना देगा (यह एक सेवा ऑब्जेक्ट है) और फिर onCreate()उस ऑब्जेक्ट पर कॉल करेगा । यह तब onStartCommand()उस वस्तु पर कॉल करेगा । यदि, कुछ समय बाद, आप फिर से कॉल करते हैं startService(), यदि सेवा अभी भी चल रही है, तो एंड्रॉइड एक नई सेवा ऑब्जेक्ट नहीं बनाएगा। इसके बजाय, यह केवल onStartCommand()मौजूदा सेवा ऑब्जेक्ट पर कॉल करेगा । स्पष्ट है क्या?
डेविड वासर

1
मैं तुमसे प्यार करता हूँ! (y) जादू की तरह काम किया (y) बहुत ही सरल और अच्छी व्याख्या
हिल्टन खडका

11

सेवा एक ही तरह की गतिविधि करती है जो भी आप associateएक बार सेवा के साथ करना चाहते हैं वह onCreateआरंभीकरण की तरह होगा

और जब भी startServiceservice का उपयोग करके कहा जाता है । बुलाया जाएगा। और आप प्रदर्शन करने के लिए कोई भी कार्यवाही पास कर सकते हैं। एक म्यूजिक प्लेयर के लिए, आप एक्शन का इस्तेमाल करना, रोकना, खेलना बंद कर सकते हैंonStartCommand

और आप कोई भी operation in serviceकार्रवाई भेजकर उसे प्राप्त करते हैंonStartCommand

onCreate कंस्ट्रक्टर की तरह काम करें।

लघु में संपादित करें

onCreate()कॉल केवल पहली बार के लिए आप एक शुरू Serviceजबकि onStartCommand()कॉल हर आप फोन startServiceफिर से। यह आपको प्ले, स्टॉप, पॉज़ संगीत जैसे एक्शन सेट करने देता है।

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

इसलिए जब मैं startService (आशय) का उपयोग करके किसी सेवा को कॉल करता हूं, क्या onCreate () अभ्यस्त कहा जाएगा? मुझे यह समझने में संदेह है कि एक 'सेवा वस्तु' क्या है क्योंकि मैंने हमेशा स्टार्टसेवाइस (इरादा) द्वारा एक सेवा शुरू की है।
डिफिक्ट

क्या आपने सेवा वस्तु को ठीक से देख लिया है या संभवत: आपके पास आपके प्रकट में सेवा नहीं है
AndroidGeek

स्टार्ट सर्विस की तरह सेवा शुरू करें (नया इरादा (यह, ServiceName.class));
AndroidGeek

लेकिन क्या इस विधि को सेवा को तत्काल करना कहा जाता है? फिर सेवा-वस्तु कहाँ है?
डिफिक्ट

यह गतिविधि और सेवा को कॉल करने का एक तरीका है, इरादे का उपयोग करके Android में गतिविधि और सेवा खोलने के लिए जिम्मेदार है। आप सेवा की वस्तु के साथ क्या करना चाहते हैं आप इसे इरादे से भी कर सकते हैं। मेरा मतलब है कि सेवा के लिए डेटा पास करना
एंड्रॉइड गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.