2011-11-05 11 views
86

अगर मैं निम्नलिखित कोड है:यदि सेवा कई बार शुरू होती है तो क्या होता है?

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

इस कोड में DownloadServiceIntentService फैली हुई है।

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

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

उत्तर

123

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

यह here

+1

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

+0

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

+0

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

7

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

नोट: ऑनक्रेट() को फिर से नहीं कहा जाता है।

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

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

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

+0

क्या प्रत्येक संबंधित 'ऑनस्टार्ट कमांड' के लिए 'ऑनस्टॉप()' को कॉल किया जाना है? –

+6

@ इगोरगानापोलस्की: सबसे पहले, सेवा में STtop() पर ऐसी कोई कॉलबैक विधि नहीं है। हमें सेवा रोकने के लिए stopService() या stopSelf() को कॉल करने की आवश्यकता है। और जब ऑनस्टार्ट कमांड() को कई उद्देश्यों के लिए कई बार बुलाया गया है, तो हमें केवल एक बार केवल StopSelf() या stopService() को कॉल करने की आवश्यकता है। यदि IntentService का उपयोग कर रहे हैं, तो आपको StopSelfResult (int id) को HandleIntent() से अनुरोध की प्रारंभ आईडी पास करना चाहिए, जो संबंधित प्रारंभ आईडी अनुरोध को रोक देगा, जो IntentService की कार्य कतार में रखा गया था। उम्मीद है की यह मदद करेगा। –

2

उपर्युक्त उत्तरों में कुछ और जानकारी जोड़ना जो दूसरों के लिए सहायक हो सकता है, यह शुरू करें कि ऑनस्टार्ट कमांड() विधि प्रत्येक प्रारंभ सेवा() कॉल के लिए अलग है। इसके अलावा यदि हम उपरोक्त वर्णित लूप के लिए लिखते हैं, तो हैंडलइन्टेंट() में लिखे गए कोड को लूप फ्रीक्वेंसी द्वारा परिभाषित किया गया है, लेकिन अनुक्रम में और समानांतर में नहीं। अवधारणा है IntentService एक कार्य कतार बनाता है और सेवा अनुरोध करने के लिए प्रत्येक अनुरोध बनाता है() स्टार्ट कमांड() पर ट्रिगर करें जो बदले में काम कतार में इरादा रखता है और फिर इरादे को एक से एक पर हैन्डलइन्टेंट() पर।

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