एंड्रॉइड प्लेटफॉर्म में सेवा बनाम इंटेंटसेवा


774

मैं एक ऐसी चीज़ का उदाहरण खोज रहा हूँ, जो IntentServiceएक Service(और इसके विपरीत) के साथ नहीं की जा सकती है ?

मेरा यह भी मानना ​​है कि IntentServiceएक अलग धागे में एक रन और एक Serviceनहीं है। इसलिए, जहां तक ​​मैं देख सकता हूं, अपने स्वयं के धागे के भीतर एक सेवा शुरू करना एक शुरू करने जैसा है IntentService। क्या वो सही है?


45
IntentService is used for short tasks (etc) and a service is for long onesतुमने ऐसा कहां पढ़ा ?
njzk2

9
फिर भी, मेरा सुझाव है कि आप IntentService के लिए स्रोत कोड पढ़ें। यह यह स्पष्ट करता है कि यह क्या है और यह क्या करता है।
njzk2

1
मैंने आपको टिप्पणी देखने के बाद अपना प्रश्न संपादित किया।
रॉबेरग

9
इरादे के लिए कोड: android.googlesource.com/platform/frameworks/base/+/refs/heads/…
greg7gkb

2
पिछली टिप्पणी में लिंक (greg7gkb द्वारा) एक महान पढ़ा है।
DSlomer64

जवाबों:


1348

तेजस लगवानकर ने इस विषय में एक अच्छी पोस्ट लिखी । नीचे सेवा और इरादे के बीच कुछ महत्वपूर्ण अंतर हैं।

कब इस्तेमाल करें?

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

  • IntentService आमतौर पर मुख्य थ्रेड के लिए कोई संचार के साथ लंबे समय से कार्यों में इस्तेमाल किया जा सकता। यदि संचार की आवश्यकता है, तो मेन थ्रेड हैंडलर या प्रसारण इंटेंट का उपयोग कर सकते हैं। उपयोग का एक और मामला है जब कॉलबैक की आवश्यकता होती है (इरादे ट्रिगर कार्यों)।

ट्रिगर कैसे करें?

  • सेवा विधि को फोन करके शुरू हो रहा है startService()

  • IntentService एक आशय का उपयोग कर शुरू हो रहा है, यह एक नई कार्यकर्ता धागा spawns और विधि onHandleIntent()इस धागे पर कहा जाता है।

से ट्रिगर किया गया

  • सेवा और IntentService किसी भी धागा, गतिविधि या अन्य आवेदन घटक से शुरू किया जा सकता है।

इससे संचालित

  • सेवा पृष्ठभूमि में चलता है, लेकिन यह आवेदन के मुख्य थ्रेड पर चलता है।

  • IntentService एक अलग कार्यकर्ता धागा पर चलता है।

सीमाएं / कमियां

  • सेवा आवेदन के मुख्य थ्रेड ब्लॉक कर सकते हैं।

  • IntentService समानांतर में कार्य नहीं चल सकता। इसलिए सभी निरंतर इरादे कार्यकर्ता धागे के लिए संदेश कतार में जाएंगे और क्रमिक रूप से निष्पादित करेंगे।

कब रुकना है?

  • यदि आप किसी सेवा को कार्यान्वित करते हैं , तो यह आपकी ज़िम्मेदारी है कि जब सेवा का कार्य पूरा हो जाए, तो उसे कॉल करके stopSelf()या रोककर सेवा को रोक दिया जाए stopService()। (यदि आप केवल बाध्यकारी प्रदान करना चाहते हैं, तो आपको इस पद्धति को लागू करने की आवश्यकता नहीं है)।

  • IntentService सेवा बंद होने के बाद सब शुरू अनुरोध को संभाल लिया गया है ताकि आप कॉल करने की आवश्यकता नहीं stopSelf()


11
लघु और मधुर, लेकिन इसका बेहतर यदि आप कॉमन्सवेयर सहित बिंदुओं सहित अपने उत्तर को संपादित करते हैं, तो बहुत से लोग केवल स्वीकृत या अधिकांश
उत्कीर्ण

12
@Darpan A सेवा एक अनुप्रयोग घटक है जो पृष्ठभूमि में लंबे समय तक चलने वाले संचालन कर सकता है और उपयोगकर्ता इंटरफ़ेस प्रदान नहीं करता है। एक सेवा इसकी होस्टिंग प्रक्रिया के मुख्य धागे में चलती है। सेवा अपना स्वयं का थ्रेड नहीं बनाती है और एक अलग प्रक्रिया में नहीं चलती है (जब तक कि आप अन्यथा निर्दिष्ट न करें)। इसका मतलब यह है कि, यदि आपकी सेवा किसी भी सीपीयू गहन कार्य या अवरुद्ध संचालन (जैसे एमपी 3 प्लेबैक या नेटवर्किंग) करने जा रही है, तो आपको उस कार्य को करने के लिए सेवा के भीतर एक नया सूत्र बनाना चाहिए।
जोस जुआन सैंचेज़

8
"मेन थ्रेड से इरादे को ट्रिगर किया जाना चाहिए।" क्या आपको यकीन है? मेरे मेनऐक्टिविटी ऑनक्रीट () के अंदर, जब मैं एक नए थ्रेड (नीचे दिए गए कोड) से एक इंटेंससेवा को कॉल करता हूं, तब भी यह मेरे लिए काम करता है। नया थ्रेड (नया रननेबल () {@ ऑवरराइड सार्वजनिक शून्य रन () {इंटेंट इंटेंस = नया इंटेंट (संदर्भ, HelloIntentService.class); प्रारंभ (इरादा);}}}) ()।
अशोक बिजॉय देबनाथ

9
@AshokBijoyDebnath आप सही हैं! सेवा और IntentServices किसी भी धागा, गतिविधि या अन्य आवेदन घटक से शुरू किया जा सकता है। मैंने इस समस्या को ठीक करने के लिए उत्तर का पाठ संपादित किया है। आपके संपादन सुझाव के लिए धन्यवाद! :)
जोस जुआन सेंचेज

2
कोई बात नहीं, इसके लिए जाओ!
जोस जुआन सेंचेज

165

अगर कोई मुझे एक ऐसी चीज़ का उदाहरण दिखा सकता है जो एक के साथ किया जा सकता है IntentServiceऔर एक Serviceऔर दूसरे तरीके से नहीं किया जा सकता है ।

परिभाषा के अनुसार, यह असंभव है। जावा में लिखा गया IntentServiceएक उपवर्ग है Service। इसलिए, कुछ भी IntentServiceकरता है, एक का उपयोग कर Serviceकोड के प्रासंगिक बिट्स को शामिल कर सकता है IntentService

अपने स्वयं के धागे के साथ एक सेवा शुरू करना एक इंटेंससेवा शुरू करने जैसा है। क्या ऐसा नहीं है?

एक की तीन प्राथमिक विशेषताएं IntentServiceहैं:

  • पृष्ठभूमि धागा

  • का स्वत: कतार Intentके लिए दिया रों onStartCommand()है, इसलिए यदि एक Intentप्रोसेस कर रहे हैं onHandleIntent()पृष्ठभूमि धागे पर, अन्य आदेशों अपनी बारी का इंतजार कर अप कतार

  • IntentServiceएक stopSelf()बार जब कतार खाली होती है, तो कॉल के माध्यम से स्वचालित रूप से बंद हो जाता है

किसी भी और सभी का Serviceविस्तार किए बिना लागू किया जा सकता है IntentService


6
थोड़ी देर से, लेकिन मुझे पता चल रहा है कि एएनआर फेंकने से पहले लगभग 10 सेकंड के लिए Serviceबुलाया startServiceजा सकता है - IntentServiceएक इरादे को प्रसारित करने के साथ शुरू किया गया यह सीमा नहीं लगती है
edththird

16
@edthethird: ऐसा इसलिए है क्योंकि आप मुख्य एप्लिकेशन थ्रेड को बांध रहे थे। सभी घटकों पर सभी जीवन चक्र के तरीकों, सहित onStartCommand()एक की Service, मुख्य आवेदन धागे पर कहा जाता है। आप अपने यूआई को फ्रीज किए बिना कुछ मिलीसेकंड से अधिक के लिए इस धागे को टाई नहीं कर सकते हैं, और यदि आप कई सेकंड लेते हैं, तो आपको एएनआर के बराबर सेवा मिलेगी।
कॉमन्सवेयर

3
हाँ, मैंने भी जल्द ही टिप्पणी की। मैं onStartCommandइसके बजाय काम कर रहा था onHandleIntent- ऐसा लगता है जैसे onStartCommandUI थ्रेड पर चलाया जाता है, हालांकि onHandleIntentनिष्पादन के लिए एक अलग थ्रेड का उपयोग किया जाता है।
21

3
@IgorGanapolsky: IntentServiceखुद कॉल करता है, onHandleIntent()रिटर्न के बाद , अगर कोई और काम नहीं करना है।
कॉमन्सवेयर

1
मुद्दा अंग्रेजी नहीं है, बल्कि प्रोग्रामिंग है। उदाहरण के लिए, "मेरे पास एप्लिकेशन बंद है" की कोई सटीक परिभाषा नहीं है, इसलिए मैं आपको बता नहीं सकता कि ऐसा होने पर क्या होता है। मुझे यह भी पता नहीं है कि "मैं 1 साल बाद डाउनलोड करूंगा" से संबंधित ऐप "कैसे बंद हो गया" है। आप एक अलग स्टैक ओवरफ्लो प्रश्न पूछने पर विचार कर सकते हैं, जहां आप "1 घंटे के बाद डाउनलोड करेंगे" का एक न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण प्रदान कर सकते हैं । वहां, आप विस्तार से बता सकते हैं कि "मैंने ऐप को बंद कर दिया है" का अर्थ है (उदाहरण के लिए, उपयोगकर्ता विशेष रूप से ऐप को बंद करने के लिए क्या करता है?)।
कॉमन्सवेयर

39

सर्विस

  • द्वारा आह्वान किया startService()
  • किसी से भी त्रस्त Thread
  • इससे संचालित Main Thread
  • मुख्य (UI) थ्रेड को ब्लॉक कर सकते हैं। हमेशा लंबे कार्य के लिए सेवा के भीतर धागे का उपयोग करें
  • एक बार कार्य पूरा हो जाने के बाद, कॉल करके stopSelf()या सेवा बंद करना हमारी जिम्मेदारी हैstopService()

IntentService

  • यह लंबे समय तक कार्य करता है आमतौर पर मुख्य थ्रेड के साथ कोई संचार नहीं होता है यदि संचार की आवश्यकता होती है तो यह Handlerया द्वारा किया जाता हैBroadcastReceiver
  • के माध्यम से आह्वान किया Intent
  • से ट्रिगर किया गया Main Thread
  • अलग थ्रेड पर चलता है
  • समानांतर में कार्य नहीं चला सकते हैं और एक ही श्रमिक सूत्र पर कई इरादे पंक्तिबद्ध हैं।

19

पहिया को सुदृढ़ मत करो

IntentService सेवा वर्ग का विस्तार करता है जिसका स्पष्ट अर्थ है कि IntentServiceजानबूझकर उसी के लिए बनाया गया है उद्देश्य के ।

तो उद्देश्य क्या है?

`इंटेंससेवा का उद्देश्य पृष्ठभूमि के कार्यों को चलाने के लिए हमारे काम को आसान बनाना है

  • श्रमिक सूत्र का निर्माण

  • एक-एक करके प्रोसेसिंग मल्टीपल-रिक्वेस्ट को कॉपी करना (Threading )

  • को नष्ट कर रहा है Service

तो नहीं , Serviceकोई भी कार्य कर सकता है जो कि IntentServiceकरेगा। यदि आपकी आवश्यकताएं उपर्युक्त मानदंड के अंतर्गत आती हैं, तो आपको Serviceकक्षा में उन लॉगिक्स को लिखने की आवश्यकता नहीं है । तो पहिया को सुदृढ़ मत करो क्योंकिIntentService आविष्कार किया गया पहिया है।

मुख्य अंतर

सेवा यूआई थ्रेड पर चलती है जबकि एक इंटेंससेवा एक अलग थ्रेड पर चलती है

आप IntentService का उपयोग कब करते हैं?

जब आप एक-एक करके कई बैकग्राउंड टास्क करना चाहते हैं, जो किसी एक्टिविटी के दायरे से बाहर होता है, तो IntentServiceपरफेक्ट है।

से कैसे IntentServiceबनाया जाता हैService

यूआई थ्रेड पर एक सामान्य सेवा रन (डिफ़ॉल्ट जैसे द्वारा यूआई धागे पर कोई भी Android घटक प्रकार रन Activity, BroadcastReceiver, ContentProviderऔर Service)। अगर आपको कुछ काम करना है जिसे पूरा करने में थोड़ा समय लग सकता है तो आपको एक धागा बनाना होगा। कई अनुरोधों के मामले में, आपको निपटना होगा synchronizationIntentServiceकुछ डिफ़ॉल्ट कार्यान्वयन दिया गया है जो आपके लिए उन कार्यों को करता है। डेवलपर पृष्ठ के
अनुसार

  1. IntentService वर्कर थ्रेड बनाता है

  2. IntentServiceएक कार्य कतार बनाता है जो onHandleIntent()एक-एक करके विधि भेजने का अनुरोध करता है

  3. जब कोई काम नहीं होता है तो IntentServiceकॉल stopSelf()विधि
  4. onBind()विधि के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान करता है जो अशक्त है
  5. डिफ़ॉल्ट कार्यान्वयन onStartCommand()जिसके Intentलिए वर्कक्यू और अंतिम रूप से अनुरोध भेजता हैonHandleIntent()

15

स्वीकृत उत्तर में अंक जोड़ना:

Android API के भीतर IntentService का उपयोग देखें। उदाहरण के लिए:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

अपने ऐप के लिए एक इंटेंससेवाइन घटक बनाने के लिए, एक वर्ग को परिभाषित करें जो IntentService को बढ़ाता है, और इसके भीतर, ऑनहैंडलइंटेंट () को ओवरराइड करने वाली विधि को परिभाषित करें।

इसके अलावा, IntentService का स्रोत कोड देखें, यह onStartCommand की तरह कंस्ट्रक्टर और लाइफ साइकल मेथड है ...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

एक साथ एक AsyncTask के साथ सेवा कई उपयोग के मामलों के लिए सर्वश्रेष्ठ दृष्टिकोणों में से एक है जहां पेलोड बहुत बड़ा नहीं है। या सिर्फ एक वर्ग बनाने के लिए IntentSerivce का विस्तार। एंड्रॉइड वर्जन 4.0 से सभी नेटवर्क ऑपरेशन बैकग्राउंड प्रोसेस में होने चाहिए अन्यथा एप्लिकेशन कंपाइल / बिल्ड फेल हो जाता है। UI से अलग थ्रेड। AsyncTask वर्ग UI थ्रेड से एक नए कार्य को फायर करने के सबसे सरल तरीकों में से एक प्रदान करता है। इस विषय पर अधिक चर्चा के लिए, ब्लॉग पोस्ट देखें

से एंड्रॉयड डेवलपर्स गाइड :

IntentService सेवाओं का एक आधार वर्ग है जो मांग पर अतुल्यकालिक अनुरोधों (इरादों के रूप में व्यक्त) को संभालता है। ग्राहक startService (इरादे) कॉल के माध्यम से अनुरोध भेजते हैं; सेवा को आवश्यकतानुसार शुरू किया जाता है, प्रत्येक इंटेंट को संभालता है, बदले में, एक कार्यकर्ता धागे का उपयोग करता है, और जब यह काम से बाहर हो जाता है तो खुद को रोक देता है।

IntentService में प्रयुक्त डिज़ाइन पैटर्न

: यह "काम कतार प्रोसेसर" पैटर्न आमतौर पर एक आवेदन के मुख्य धागे से कार्यों को लोड करने के लिए उपयोग किया जाता है। इस पैटर्न को सरल बनाने और यांत्रिकी की देखभाल करने के लिए इंटेंससेवा वर्ग मौजूद है। इसका उपयोग करने के लिए, IntentService का विस्तार करें और onHandleIntent (इरादे) को लागू करें। IntentService को इंटेंट्स प्राप्त होंगे, एक वर्कर थ्रेड लॉन्च करेंगे, और उचित रूप से सेवा को रोकेंगे।

सभी अनुरोधों को एक ही श्रमिक धागे पर नियंत्रित किया जाता है - वे आवश्यक रूप से लंबे समय तक ले सकते हैं (और एप्लिकेशन के मुख्य लूप को ब्लॉक नहीं करेंगे), लेकिन एक समय में केवल एक अनुरोध पर कार्रवाई की जाएगी।

IntentService वर्ग एक सिंगल बैकग्राउंड थ्रेड पर एक ऑपरेशन चलाने के लिए एक सीधी संरचना प्रदान करता है। यह आपके उपयोगकर्ता इंटरफ़ेस की जवाबदेही को प्रभावित किए बिना लंबे समय तक चलने वाले संचालन को संभालने की अनुमति देता है। साथ ही, अधिकांश उपयोगकर्ता इंटरफ़ेस जीवनचक्र घटनाओं से एक इरादे से प्रभावित नहीं होता है, इसलिए यह उन परिस्थितियों में चलता रहता है जो एक AsyncTask को बंद कर देगा।

एक इरादे की कुछ सीमाएँ हैं:

यह सीधे आपके यूजर इंटरफेस के साथ बातचीत नहीं कर सकता है। UI में इसके परिणाम डालने के लिए, आपको उन्हें एक गतिविधि पर भेजना होगा। कार्य अनुरोध क्रमिक रूप से चलते हैं। यदि कोई ऑपरेशन IntentService में चल रहा है, और आप इसे एक और अनुरोध भेजते हैं, तो अनुरोध पहले ऑपरेशन के समाप्त होने तक प्रतीक्षा करता है। IntentService पर चल रहा एक ऑपरेशन बाधित नहीं किया जा सकता है। हालांकि, ज्यादातर मामलों में

IntentService सरल पृष्ठभूमि संचालन का पसंदीदा तरीका है

**

वॉली लाइब्रेरी

एंड्रॉइड नेटवर्किंग एप्लिकेशन विकसित करने के लिए वॉली- लाइब्रेरी नामक पुस्तकालय है। गीथहब में जनता के लिए स्रोत कोड उपलब्ध है।

पृष्ठभूमि नौकरियों के लिए सर्वोत्तम प्रथाओं के लिए Android आधिकारिक दस्तावेज : इरादे सेवा, धागा, हैंडलर, सेवा पर बेहतर समझने में मदद करता है। और नेटवर्क संचालन भी कर रहा है


1
यह बेहतर हो सकता है, यदि आप बिंदु उत्तर तक छोटा दे सकते हैं।
eRaisedToX

12

मुझे यकीन है कि आप कुछ अंतरों की एक विस्तृत सूची पा सकते हैं, जैसे कि 'Android IntentService vs Service'।

उदाहरण के लिए एक और महत्वपूर्ण अंतर यह है कि एक बार जब यह हो जाता है तो इंटेंससेवा स्वयं समाप्त हो जाता है।

कुछ उदाहरण (जल्दी से बने) हो सकते हैं;

IntentService: यदि आप अपना ऐप खोलने की शुरुआत में छवियों का एक गुच्छा डाउनलोड करना चाहते हैं। यह एक बार की प्रक्रिया है और सब कुछ डाउनलोड होने के बाद खुद को साफ कर सकती है।

सेवा: एक सेवा जिसका उपयोग लगातार आपके ऐप और बैक-एंड के बीच वेब एपीआई कॉल के साथ संवाद करने के लिए किया जाएगा। भले ही यह अपने वर्तमान कार्य के साथ समाप्त हो गया हो, फिर भी आप चाहते हैं कि यह कुछ मिनटों के बाद और अधिक संचार के लिए हो।


2
मुझे एक उदाहरण नहीं मिला जो एक के साथ किया जा सकता है और दूसरे के साथ नहीं। बस कुछ स्पष्टीकरण जो मेरी मदद नहीं करते थे।
रॉबेरग

1
इस साइट को आज़माएं, इसमें मूल उदाहरणों vogella.com/articles/AndroidServices/article.html के
स्टीफन डी

4
इसका एक और उदाहरण "कैसे उपयोग करें"। नहीं जब विशेष रूप से सेवा का उपयोग करें और जब intentservice। कृपया मुझे एक सैद्धांतिक उदाहरण दें और उस मेट्रो के लिए "कैसे उपयोग करें" या अन्य किसी भी लिंक से लिंक न करें। मैं आपको मेरे लिए "काम" करने के लिए नहीं कह रहा हूं, जबकि कुछ भी नहीं कर रहा हूं, मैं पहले से ही उन सभी को पसंद करता हूं और अभी भी निश्चित नहीं हूं।
roiberg

5
यह बहुत महत्वपूर्ण अंतर है। उदाहरण के लिए, यदि आप सर्वर के साथ लगातार संबंध बनाए रखने के लिए सेवा का उपयोग करते हैं, तो आप इसके लिए इंटेंस सर्विस का उपयोग नहीं कर सकते हैं क्योंकि यह अपने सभी कार्यों को पूरा करने के तुरंत बाद समाप्त हो जाता है
pelotasplus

24
जब मैं गूगल करता हूँ, तो यह मुझे यहाँ लाता है। अब मैं एक अनंत लूप में हूं।
लू मोर्डा

12

IntentService

IntentServiceअपने ही धागे पर चलता है। ऐसा होने पर यह अपने आप बंद हो जाएगा। आग और भूल की तरह। इसके बाद कॉल की कतार लग जाएगी। कतारबद्ध कॉल के लिए अच्छा है। IntentServiceयदि आप की आवश्यकता हो तो आप कई थ्रेड्स भी स्पिन कर सकते हैं- आप इसका उपयोग करके प्राप्त कर सकते हैं ThreadPoolExecutor। मैं यह कहता हूं क्योंकि बहुत से लोगों ने मुझसे पूछा "क्यों इसका उपयोग IntentServiceसमानांतर निष्पादन का समर्थन नहीं करता है"। IntentServiceसिर्फ एक धागा है। आप इसके अंदर जो कुछ भी कर सकते हैं, कर सकते हैं- यहां तक ​​कि कई धागों को कताई। एकमात्र चेतावनी यह है कि IntentServiceजैसे ही आप उन कई धागों को स्पिन करते हैं, खत्म हो जाता है। यह उन धागों के वापस आने का इंतजार नहीं करता। आपको इसका ध्यान रखने की जरूरत है। इसलिए मैं ThreadPoolExecutorउन परिदृश्यों में उपयोग करने की सलाह देता हूं ।

  • सिंक करने, अपलोड करने आदि के लिए अच्छा है ...

सर्विस

डिफ़ॉल्ट रूप Serviceसे मुख्य धागे पर चलता है। अपना काम करने के लिए आपको एक श्रमिक सूत्र को स्पिन करना होगा। आपको serviceस्पष्ट रूप से रोकने की आवश्यकता है । मैंने इसे एक ऐसी स्थिति के लिए उपयोग किया है जब आपको अपने ऐप से दूर जाने और हेडलेस के लिए अधिक वापस आने पर भी पृष्ठभूमि में सामान चलाने की आवश्यकता होती है service

  • यदि आपको आवश्यकता हो तो फिर से आप कई सूत्र चला सकते हैं।
  • म्यूजिक प्लेयर्स जैसे ऐप्स के लिए इस्तेमाल किया जा सकता है।

BroadcastReceiversयदि आपको आवश्यकता हो तो आप हमेशा अपनी गतिविधि पर वापस संचार कर सकते हैं ।


8

IntentService एक सेवा का एक विस्तार है जो एक कार्य के निष्पादन को आसान बनाने के लिए किया जाता है जिसे पृष्ठभूमि में और एक अलग थ्रेड में निष्पादित करने की आवश्यकता होती है।

IntentService शुरू होता है, एक थ्रेड बनाता है और थ्रेड में अपना कार्य चलाता है। एक बार हो जाने पर, यह सब कुछ साफ कर देता है। IntentService का केवल एक ही उदाहरण एक ही समय में चल सकता है, कई कॉल्स की गणना की जाती है।

यह उपयोग करने के लिए बहुत सरल है और बहुत सारे उपयोग के लिए सुविधाजनक है, उदाहरण के लिए सामान डाउनलोड करना। लेकिन इसकी सीमाएं हैं जो आपको अधिक मूल (सरल नहीं) सेवा के बजाय उपयोग करना चाहते हैं।

उदाहरण के लिए, एक xmpp सर्वर से जुड़ी एक सेवा और गतिविधियों से बंधी बस एक IntentService का उपयोग करके नहीं किया जा सकता है। आप IntentService सामान की अनदेखी या ओवरराइडिंग समाप्त करेंगे।


ऐसा लगता है कि ज्यादातर लोग जो पृष्ठभूमि में एक वास्तविक लंबे समय तक चलने वाली सेवा चलाना चाहते हैं, वे अंतः सेवा के बारे में खोजने की कोशिश कर रहे हैं क्योंकि डॉक्स बनाते हैं ऐसा लगता है कि यह ऐसा करने के लिए है, लेकिन आप ज्यादातर नए थ्रेड का उपयोग कर सकते हैं (new Runnable ())। start ()। दूसरे शब्दों में, जब यह "एक नया धागा पैदा करता है" के बारे में बोलता है, जो यह सब करता है, यह इसे एक अलग प्रक्रिया में नहीं ले जाता है, जो वास्तव में ज्यादातर लोग तब करते हैं जब वे कुछ चल रहे कोड को गतिविधि से अलग करना चाहते हैं। ! (बस को उत्पन्न करने क्योंकि धागे एक एक लाइनर वैसे भी है)
लस्सी किनुमेन

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

5

अगर कोई मुझे किसी ऐसी चीज़ का उदाहरण दिखा सकता है जिसे आप एक के साथ किया जा सकता है IntentServiceऔर एक serviceऔर दूसरे तरीके से नहीं किया जा सकता है ।

IntentService लंबे समय तक सुनने के लिए इस्तेमाल नहीं किया जा सकता है, जैसे XMPP श्रोताओं के लिए, एक ही समय ऑपरेटर, नौकरी करते हैं और अलविदा कहते हैं।

इसके अलावा यह सिर्फ एक थ्रेडवर्क है, लेकिन एक चाल के साथ, आप इसे असीमित के रूप में उपयोग कर सकते हैं।


4

A Serviceऔर a के बीच का प्रमुख अंतर IntentServiceनिम्नानुसार है:

सर्विस :

1. Serviceडिफ़ॉल्ट रूप से, एप्लिकेशन के मुख्य थ्रेड पर चलता है। (यहां कोई डिफॉल्ट वर्कर थ्रेड उपलब्ध नहीं है)। इसके लिए उपयोगकर्ता को एक अलग थ्रेड बनाने और उस थ्रेड में आवश्यक कार्य करने की आवश्यकता होती है।

2. एक समय में कई अनुरोधों (मल्टी थ्रेडिंग)

इरादे:

1.अब, यहां आकर IntentService, किसी भी ऑपरेशन को करने के लिए एक डिफ़ॉल्ट कार्यकर्ता धागा उपलब्ध है। ध्यान दें कि - आपको onHandleIntent()विधि को लागू करने की आवश्यकता है , जो प्रत्येक प्रारंभ अनुरोध के लिए आशय प्राप्त करता है, जहां आप पृष्ठभूमि का काम कर सकते हैं।

2. लेकिन यह एक समय में केवल एक अनुरोध की अनुमति देता है।


3

Android IntentService बनाम सेवा

1.Service

  • प्रारंभ सेवा () का उपयोग करके एक सेवा शुरू की जाती है।
  • किसी भी धागे से एक सेवा का आह्वान किया जा सकता है।
  • कोई सेवा डिफ़ॉल्ट रूप से अनुप्रयोग के मुख्य थ्रेड पर पृष्ठभूमि कार्रवाई चलाता है। इसलिए यह आपके एप्लिकेशन के UI को ब्लॉक कर सकता है।
  • एक सेवा कई बार आह्वान किया कई उदाहरण पैदा करेगा।
  • एक सेवा को stopSelf () या stopService () का उपयोग करके बंद करने की आवश्यकता है।
  • Android सेवा समानांतर संचालन चला सकती है।

2. आशय सेवा

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

यहाँ से देखें

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