स्थानीय, इन-प्रोसेस, बेस क्लास सर्विस की तुलना an a AsyncTask:
Not (यह उत्तर निर्यात की गई सेवाओं, या क्लाइंट से भिन्न प्रक्रिया में चलने वाली किसी भी सेवा को संबोधित नहीं करता है, क्योंकि अपेक्षित उपयोग के मामले उन लोगों से काफी भिन्न होते हैं AsyncTask। इसके अलावा, संक्षिप्तता के हित में, कुछ विशेष की प्रकृति। Serviceउपवर्गों (जैसे, IntentService, JobService) यहाँ नजरअंदाज कर दिया जाएगा।)
प्रक्रिया जीवनकाल
एक ServiceOS का प्रतिनिधित्व करता है, "उपयोगकर्ता के साथ बातचीत न करते हुए एक लंबे समय तक चलने वाले ऑपरेशन को करने के लिए एक एप्लिकेशन की इच्छा" [ रेफ ]।
जब आपके पास एक Serviceरनिंग होती है, तो एंड्रॉइड समझता है कि आप नहीं चाहते कि आपकी प्रक्रिया को मार दिया जाए। यह तब भी सच है जब आपके पास एक Activityऑनस्क्रीन है, और यह विशेष रूप से सच है जब आप एक अग्रभूमि सेवा चला रहे हैं । (जब आपके सभी एप्लिकेशन घटक चले जाते हैं, तो एंड्रॉइड सोचता है, "ओह, अब इस ऐप को मारने का एक अच्छा समय है, इसलिए मैं संसाधनों को मुक्त कर सकता हूं"।)
इसके अलावा, Service.onCreate()एंड्रॉइड से अंतिम रिटर्न मान के आधार पर , उन ऐप्स / सेवाओं को "पुनर्जीवित" करने का प्रयास कर सकते हैं जो संसाधन दबाव [ रेफ ] के कारण मारे गए थे ।
AsyncTasksऐसा कुछ भी मत करो। इससे कोई फर्क नहीं पड़ता कि आपके पास कितने बैकग्राउंड थ्रेड चल रहे हैं, या वे कितनी मेहनत कर रहे हैं: एंड्रॉइड आपके ऐप को केवल इसलिए जीवित नहीं रखेगा क्योंकि आपका ऐप सीपीयू का उपयोग कर रहा है। यह जानने का कोई तरीका है कि आपके ऐप में अभी भी काम करना है; यही कारण है कि Servicesओएस के साथ पंजीकृत हैं, और AsyncTasksनहीं।
बहु सूत्रण
AsyncTasks सभी एक पृष्ठभूमि धागा बनाने के बारे में हैं, जिस पर काम करना है, और फिर उस कार्य का परिणाम यूआई थ्रेड्स में थ्रेडसेफ़ तरीके से प्रस्तुत करना है।
प्रत्येक नए AsyncTaskनिष्पादन में आम तौर पर अधिक समरूपता (अधिक थ्रेड्स) होते हैं, जो AsyncTasks'sथ्रेड-पूल [ रेफ ] की सीमाओं के अधीन होते हैं ।
Serviceदूसरी ओर, तरीकों को हमेशा यूआई थ्रेड [ रेफ ] पर लगाया जाता है । इस पर लागू होता है onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), आदि तो, कुछ अर्थों में, Servicesनहीं "रन" पृष्ठभूमि में है। एक बार जब वे शुरू हो जाते हैं ( onCreate()), तो वे थोड़े से "बैठते हैं" - जब तक कि सफाई करने का समय नहीं है, तब तक ए, निष्पादित करें onStartCommand()आदि।
दूसरे शब्दों में, अतिरिक्त जोड़ने Servicesसे अधिक संगामिति नहीं होती है। सेवा विधियां बड़ी मात्रा में काम करने के लिए एक अच्छी जगह नहीं हैं, क्योंकि वे यूआई थ्रेड पर चलते हैं ।
बेशक, आप Serviceअपने स्वयं के तरीकों को बढ़ा सकते हैं , जोड़ सकते हैं और उन्हें किसी भी थ्रेड से कॉल कर सकते हैं। लेकिन अगर आप ऐसा करते हैं, तो थ्रेड सेफ्टी की जिम्मेदारी आपके साथ होती है - फ्रेमवर्क की नहीं।
यदि आप अपने लिए एक बैकग्राउंड थ्रेड (या किसी अन्य प्रकार का वर्कर) जोड़ना चाहते Serviceहैं, तो आप ऐसा करने के लिए स्वतंत्र हैं। आप एक पृष्ठभूमि धागा शुरू कर सकता है / AsyncTaskमें Service.onCreate()उदाहरण के लिए,। लेकिन सभी उपयोग मामलों में इसकी आवश्यकता नहीं होती है। उदाहरण के लिए:
- आप एक
Serviceचालू रखना चाह सकते हैं ताकि आप "पृष्ठभूमि" में स्थान अपडेट प्राप्त करना जारी रख सकें (मतलब, बिना किसी Activitiesऑनस्क्रीन के)।
- या, आप अपने ऐप को जीवित रखना चाह सकते हैं, ताकि आप
BroadcastReceiverएक लंबी अवधि के आधार पर पंजीकृत "निहित" रख सकें (एपीआई 26 के बाद, आप इसे हमेशा मैनिफ़ेस्ट के माध्यम से नहीं कर सकते हैं, इसलिए आपको इसके बजाय रनटाइम पर पंजीकरण करना होगा [ रेफ ]]।
इन उपयोग मामलों में से किसी को भी सीपीयू गतिविधि की बहुत आवश्यकता नहीं है; उन्हें बस यह चाहिए कि ऐप को न मारा जाए ।
कार्यकर्ता के रूप में
Servicesकार्य-उन्मुख नहीं हैं। वे "एक कार्य करने के लिए" और "एक परिणाम देने के लिए" सेट नहीं हैं, जैसे AsyncTasksहैं। Servicesकिसी भी थ्रेड-सुरक्षा समस्याओं को हल न करें (इस तथ्य के बावजूद कि सभी विधियाँ एक ही थ्रेड पर निष्पादित होती हैं)। AsyncTasksदूसरी ओर, आपके लिए उस जटिलता को संभालें।
ध्यान दें कि AsyncTaskहै समाप्त होने वाली । लेकिन इसका मतलब यह नहीं है कि आपके AsyncTasksसाथ आपकी जगह होनी चाहिए Services! (यदि आपने इस उत्तर से कुछ भी सीखा है, तो यह स्पष्ट होना चाहिए।)
टी एल; डॉ
Servicesज्यादातर "मौजूद" हैं। वे एक ऑफ-स्क्रीन की तरह हैं Activity, जिससे एप्लिकेशन को जीवित रहने का कारण मिलता है, जबकि अन्य घटक "काम" करने का ध्यान रखते हैं। AsyncTasks"काम" करते हैं, लेकिन वे स्वयं की प्रक्रिया को जीवित नहीं रखेंगे।