यदि एंड्रॉइड सर्विस को कई बार शुरू किया जाए तो क्या होगा?


120

अगर मेरे पास निम्नलिखित कोड है:

Intent intent = new Intent(this,DownloadService.class);     
for(int i=0;i<filesArray.length;i++){        
     startService(intent);          
}

इस कोड में DownloadService फैली हुई है IntentService

इसलिए अब जब मैं फोन कर रहा हूं तो startService(intent)इसका मतलब है कि मैं हर बार एक नई सेवा शुरू कर रहा हूंstartService(intent) या इसका मतलब यह DownloadServiceहै कि एक बार चलाया जाता है और फिर हर बार जब मैं कॉल करता हूं तो startService(intent)यह एक अलग शुरुआत के साथ एक अलग इरादे से गुजरता है।

क्या यह समझ में आता है, और इनमें से कौन सा मामला है?

जवाबों:


167

सेवा केवल एक उदाहरण में चलेगी। हालाँकि, हर बार जब आप सेवा शुरू करते हैं,onStartCommand() विधि कहा जाता है।

यह यहाँ प्रलेखित है


1
धन्यवाद। यह वहाँ भी कहता है: "startService () पद्धति तुरंत वापस आती है और Android सिस्टम सेवा के onStartComm () विधि को कॉल करता है। यदि सेवा पहले से ही नहीं चल रही है, तो सिस्टम पहले onCreate () कहता है, फिर onStartCommand () कहता है।" तो अगर सेवा पहले से ही चल रही है, तो सिस्टम ऑनक्रिएट () विधि को छोड़ देगा और ऑनस्टार्टकोमैंड () को कॉल करेगा केवल और क्या?
बाइटबिस्किट

मैं वास्तव में नहीं जानता, लेकिन मुझे पूरा यकीन है कि यह मामला है ( onCreate()यदि सेवा पहले से ही निर्मित है, तो कॉल न करने के लिए बहुत सारी विनम्रता है)। यह निर्धारित करना आसान होना चाहिए कि क्या आप Log.i()कॉलबैक में दोनों डालते हैं और लॉगकट की जांच करते हैं।
फिलिप वेंड्ट

बस यही किया ... और अजीब तरह से यह आखिरी शुरुआत () कॉल के बाद onCreate शुरू होता है !!!
बाइटबिस्किट

15
ऐसा इसलिए है क्योंकि startService()अतुल्यकालिक है। जब आप कॉल को लूप कर रहे होते हैं, तो सेवा स्वयं किसी भी संसाधन को प्राप्त नहीं करती है और अभी तक शुरू नहीं हुई है।
फिलिप वेंड्ट

1
@neelabh "अभी नहीं", सेवा शुरू करने में कुछ समय लगता है, और "के लिए" लूप अभी भी चल रहा होगा और बार-बार सेवा को कॉल करेगा, इसलिए पहले प्रयास करता है कि अभी तक कोई सेवा नहीं मिल रही है ... इसलिए सेवा प्रारंभ () को कुछ समय कहा जाएगा, जब तक कि सेवा स्टार्टअप पूरा नहीं हो जाता। कृपया मेरी खराब अंग्रेजी बहाना।
मज़ारज़ार

21

बिलकुल सही। आवेदन प्रक्रिया के लिए सेवा का केवल एक उदाहरण बनाया जाता है। और जब आप StartService();फिर से कॉल करते हैं, तो केवल कॉल किया onStartCommand()जाता है और नया इंटेंट पास किया जाता हैonStartCommand() विधि जाता है।

ध्यान दें: onCreate() फिर से नहीं कहा जाता है।

बुलाने के बारे में bindService()कई बार करने के :

जब तुमने फोन किया bindService() कई बार करते हैं, तो फिर सेवा के लिए केवल एक ही उदाहरण का उपयोग किया जाता है और एंड्रॉइड रनटाइम क्लाइंट के लिए समान आईबींडर ऑब्जेक्ट देता है।

मीन्स, onBind()को कई बार नहीं कहा जाता है। और बस कैब किए गए IBinder ऑब्जेक्ट को वापस कर दिया गया है।


करता है onStop()हर इसी के लिए कहा जा करने के लिए है onStartCommand?
इगोरगानापोलस्की जूल

6
@IgorGanapolsky: सबसे पहले, सेवा में onStop () ऐसी कोई कॉलबैक विधि नहीं है। हमें एक सेवा को रोकने के लिए stopService () या stopSelf () को कॉल करने की आवश्यकता है। और जब onStartCommand () को कई बार कई इरादों के लिए बुलाया जाता है, तो हमें केवल एक बार stopSelf () या stopService () कॉल करने की आवश्यकता होती है। यदि IntentService का उपयोग करते हैं, तो आपको onHandleIntent () से stopSelfResult (int id) पासिंग अनुरोध आईडी शुरू करना चाहिए, जो संबंधित प्रारंभ आईडी अनुरोध को रोक देगा, जिसे IntentService की कार्य कतार में रखा गया था। उम्मीद है की यह मदद करेगा।
अनिश मित्तल

8

उपरोक्त उत्तरों में कुछ और जानकारी जोड़ना, जो दूसरों के लिए मददगार हो सकता है, startIdवह यह है कि, onStartCommand()प्राप्त करने का तरीका हर startService()कॉल के लिए अलग है ।

इसके अलावा, अगर हम ऊपर लिखे गए लूप के लिए लिखते हैं, तो कोड लिखा हुआ है onHandleIntent() लूप आवृत्ति के लिए परिभाषित कई बार निष्पादित होगा, लेकिन अनुक्रम में और समानांतर में नहीं।

अवधारणा IntentServiceएक काम कतार बनाता है और प्रत्येक startService()ट्रिगर करने का अनुरोध करता है onStartCommand()जो बदले में काम कतार में इरादे को संग्रहीत करता है और फिर एक-एक करके इरादे को पास करता है onHandleIntent()


2

डॉक्टर के अनुसार :

StartService () विधि तुरंत वापस आती है, और एंड्रॉइड सिस्टम सेवा के ऑनस्टार्टकोमैंड () विधि को कॉल करता है। यदि सेवा पहले से ही नहीं चल रही है, तो सिस्टम पहले onCreate () को कॉल करता है, और फिर इसे onStartCommand () कहता है।

तथा

सेवा के onStartCommand () में कई संगत कॉल में सेवा परिणाम शुरू करने के लिए कई अनुरोध। हालाँकि, सेवा को रोकने के लिए केवल एक अनुरोध (stopSelf () या stopService () के साथ) इसे रोकने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.