START_STICKY और START_NOT_STICKY


272

बीच क्या अंतर है START_STICKYऔर START_NOT_STICKYजबकि एंड्रॉयड में सेवाओं को लागू? क्या कोई कुछ मानक उदाहरणों की ओर इशारा कर सकता है ..?

जवाबों:


371

दोनों कोड केवल तब प्रासंगिक होते हैं जब फोन मेमोरी से बाहर निकल जाता है और सर्विस को खत्म करने से पहले मार देता है। START_STICKYओएस को सेवा को फिर से बनाने के लिए कहता है क्योंकि इसमें पर्याप्त मेमोरी है और onStartCommand()एक नीच इरादे के साथ फिर से कॉल करता है । START_NOT_STICKYओएस को फिर से सेवा को फिर से बनाने के लिए परेशान नहीं करने के लिए कहता है। एक तीसरा कोड भी START_REDELIVER_INTENTहै जो ओएस को सेवा को फिर से बनाने और उसी इरादे को फिर से जारी करने के लिए कहता है onStartCommand()

डायने हैकॉर्न के इस लेख ने आधिकारिक दस्तावेज की तुलना में इस की पृष्ठभूमि को बहुत बेहतर बताया।

स्रोत: http://android-developers.blogspot.com.au/2010/02/service-ap-changes-starting-with.html

यहाँ मुख्य भाग एक नया परिणाम कोड है जिसे फ़ंक्शन द्वारा लौटाया जाता है, यह बताती है कि अगर यह चल रहा है तो इसकी प्रक्रिया को सेवा के साथ क्या करना चाहिए:

START_STICK मूल रूप से पिछले व्यवहार के समान है, जहां सेवा को "प्रारंभ" छोड़ दिया गया है और बाद में सिस्टम द्वारा फिर से शुरू किया जाएगा। प्लेटफ़ॉर्म के पिछले संस्करणों से एकमात्र अंतर यह है कि अगर यह फिर से शुरू हो जाता है क्योंकि इसकी प्रक्रिया को मार दिया जाता है, तो onStartCommand () को सेवा के अगले उदाहरण पर एक अशक्त इरादे के साथ बुलाया जाएगा बजाय बिल्कुल भी नहीं बुलाया जाएगा। इस मोड का उपयोग करने वाली सेवाओं को हमेशा इस मामले की जांच करनी चाहिए और उचित तरीके से निपटना चाहिए।

START_NOT_STICKY का कहना है कि, onStartCreated () से लौटने के बाद, यदि प्रक्रिया को वितरित करने के लिए कोई शेष प्रारंभ आदेशों के साथ नहीं मारा जाता है, तो सेवा को पुनरारंभ करने के बजाय बंद कर दिया जाएगा। यह उन सेवाओं के लिए बहुत अधिक समझ में आता है जो उन्हें भेजे गए आदेशों को निष्पादित करते समय केवल चलाने के लिए हैं। उदाहरण के लिए, कुछ नेटवर्क स्थिति को प्रदूषित करने के लिए अलार्म से हर 15 मिनट में एक सेवा शुरू की जा सकती है। अगर यह उस काम को करते हुए मारा जाता है, तो सबसे अच्छा होगा कि इसे बंद कर दिया जाए और अगली बार अलार्म बजते ही इसे चालू कर दिया जाए।

START_REDELIVER_INTENT START_NOT_STICKY की तरह है, सिवाय इसके कि सेवा की प्रक्रिया किसी दिए गए इरादे के लिए stopSelf () को कॉल करने से पहले मार दी जाए, तब तक इसे पूरा होने तक इरादे को फिर से वितरित किया जाएगा (जब तक कि कुछ संख्या में अधिक प्रयास इसे पूरा नहीं कर सकते। जिस बिंदु पर सिस्टम देता है)। यह उन सेवाओं के लिए उपयोगी है जो काम करने के लिए कमांड प्राप्त कर रहे हैं, और यह सुनिश्चित करना चाहते हैं कि वे अंततः भेजे गए प्रत्येक कमांड के लिए काम पूरा करें।


1
हाउल टू टास्किंग से कैसे बचें टास्कस्टार्ट (इरादा, startId); onStart () और onStartCommand दोनों कहा जाएगा? क्या यह एक अच्छा डिज़ाइन है? @ फ्रेंक लेह
सज्जाद हिसैन खान

2
डिफ़ॉल्ट ध्वज क्या है, हालांकि, अगर कोई भी निर्दिष्ट नहीं है?
इगोरगानापल्स्की

3
यदि आप "वापसी super.onStartCommand (...);" का अनुसरण करते हैं आप देखेंगे कि यदि आपका लक्ष्य sdk संस्करण ECLAIR (API5 = 2.0) से कम है, तो डिफ़ॉल्ट रूप से START_STICKY_COMPATIBILITY वापस आ गई है और 2.0 से और START_STICKY से ऊपर वापस आ गया है।
माइकएल

1
"बिना शेष आरंभ आज्ञाओं" से आपका क्या अर्थ है START_NOT_STICKY?
मालविंदर सिंह

3
@FrankLeigh मैं सहमत नहीं हूं कि START_REDELIVER_INTENTऐसा है START_NOT_STICKY। इसके बजाय यह हैSTART_STICKY
CopsOnRoad

107

KISS जवाब

अंतर:

START_STICKY

सिस्टम आपकी सेवा को मारने के बाद फिर से बनाने की कोशिश करेगा

START_NOT_STICKY

सिस्टम के मारे जाने के बाद आपकी सेवा को फिर से बनाने की कोशिश नहीं करेगा


मानक उदाहरण:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

5
यह वास्तव में सही और भ्रमित नहीं है। यह कहना एक गलती है: "सेवा को मार दिया जाता है" क्योंकि कोई सोच सकता है कि आप स्टॉपसेल्फ या स्टॉप सर्विस को संदर्भित करते हैं, जबकि आप स्पष्ट रूप से मारे गए प्रक्रिया का उल्लेख करते हैं। इसलिए आप अपने उत्तर में शब्द प्रक्रिया का बेहतर उपयोग करें।
इल्या गज़मैन

हाय मैं कैसे परीक्षा दे सकता हूं START_REDELIVER_INTENT। मैंने START_STICKYहाल ही में ऐप द्वारा ऐप का परीक्षण किया और मार दिया। फिर यह सेवा को याद करते हैं। लेकिन START_REDELIVER_INTENTफिर कभी फोन नहीं किया। क्यों?
असिफ मुश्ताक

@ इलियाज़मैन मैं सम्मानपूर्वक असहमत हूं। रोका और मारा जाना दो अलग-अलग शब्द हैं। यह उत्तर सरल और सीधे तरीके से मुद्दे को सही ढंग से समझाता है।
NoHarmDan

23

के लिए प्रलेखन START_STICKYऔर START_NOT_STICKYकाफी सीधा है।

START_STICKY:

यदि इस सेवा की प्रक्रिया को शुरू करने के बाद मार दिया जाता है (लौटने के बाद onStartCommand(Intent, int, int)), तो इसे शुरू की स्थिति में छोड़ दें, लेकिन इस वितरित इरादे को बरकरार न रखें। बाद में सिस्टम सेवा को फिर से बनाने की कोशिश करेगा। क्योंकि यह शुरू में है। , यह onStartCommand(Intent, int, int) नई सेवा आवृत्ति बनाने के बाद कॉल करने की गारंटी देगा ; यदि सेवा को वितरित करने के लिए कोई लंबित स्टार्ट कमांड नहीं हैं, तो इसे एक अशक्त आशय वस्तु के साथ कहा जाएगा, इसलिए आपको इसके लिए जांच करने का ध्यान रखना चाहिए।

यह मोड उन चीजों के लिए समझ में आता है, जिन्हें स्पष्ट रूप से शुरू किया जाना चाहिए और मनमाने ढंग से समय के लिए चलना बंद कर दिया जाएगा, जैसे कि पृष्ठभूमि संगीत प्लेबैक प्रदर्शन करने वाली सेवा।

उदाहरण: स्थानीय सेवा नमूना

START_NOT_STICKY:

यदि इस सेवा की प्रक्रिया की शुरुआत होने के बाद (इसे वापस करने के बाद onStartCommand(Intent, int, int)), और इसे वितरित करने के लिए कोई नई शुरुआत के इरादे नहीं हैं, तो इसे मार दिया जाता है, तो सेवा को शुरू की स्थिति से बाहर ले जाएं और भविष्य में स्पष्ट कॉल करने तक इसे फिर से न करें Context.startService(Intent)onStartCommand(Intent, int, int)एक nullआशय के साथ एक कॉल प्राप्त नहीं होगा क्योंकि इसे फिर से शुरू नहीं किया जाएगा यदि वितरित करने के लिए कोई लंबित इरादे नहीं हैं।

यह मोड उन चीजों के लिए समझ में आता है जो शुरू होने के परिणामस्वरूप कुछ काम करना चाहते हैं, लेकिन स्मृति दबाव में होने पर रोका जा सकता है और स्पष्ट रूप से अधिक काम करने के लिए बाद में खुद को फिर से शुरू कर देगा। इस तरह की सेवा का एक उदाहरण वह होगा जो किसी सर्वर से डेटा के लिए सर्वेक्षण करता है: यह अलार्म को Nअपनी सेवा शुरू करने से हर मिनट के सर्वेक्षण के लिए अलार्म निर्धारित कर सकता है । जब इसका onStartCommand(Intent, int, int)अलार्म से कॉल किया जाता है, यह बाद में एन मिनट के लिए एक नया अलार्म शेड्यूल करता है, और इसकी नेटवर्किंग करने के लिए एक धागा बनाता है। यदि उस जाँच को करते समय इसकी प्रक्रिया को मार दिया जाता है, तो अलार्म बंद होने तक सेवा को फिर से शुरू नहीं किया जाएगा।

उदाहरण: ServiceStartArguments.java


कोई किस्मत नहीं .. मैं आम आदमी के शब्द में प्रलेखन से संबंधित नहीं था। मैं एक वास्तविक समय परिदृश्य के साथ संबंधित करना चाहूंगा। मैं डिवाइस पर एक उदाहरण दिखाना चाहूंगा। ताकि वे और अधिक आसानी से समझ सकें।
प्राग

START_STICKY और START_NOT_STICKY onStartCommand () को केवल एक बार निष्पादित किया जाएगा और इससे बाहर आएंगे। मैं नमूना यू के माध्यम से बाहर चला गया, लेकिन मेरा शक कितनी बार onStartCommand () निष्पादित किया जाएगा। अगर मैं START_STICK को फिर से बताता हूं और फिर भी सेवा को फिर से बनाने की कोशिश करता हूं, तो क्या सेवा ऑनस्टार्टकॉमी पर अमल करेगी?
प्राग

जब सेवा फिर से बनती है तो गतिविधि का क्या होता है? क्या गतिविधि फिर से बनाई गई है?
रैनशॉ

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