बीच क्या अंतर है START_STICKY
और START_NOT_STICKY
जबकि एंड्रॉयड में सेवाओं को लागू? क्या कोई कुछ मानक उदाहरणों की ओर इशारा कर सकता है ..?
बीच क्या अंतर है START_STICKY
और START_NOT_STICKY
जबकि एंड्रॉयड में सेवाओं को लागू? क्या कोई कुछ मानक उदाहरणों की ओर इशारा कर सकता है ..?
जवाबों:
दोनों कोड केवल तब प्रासंगिक होते हैं जब फोन मेमोरी से बाहर निकल जाता है और सर्विस को खत्म करने से पहले मार देता है। 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 () को कॉल करने से पहले मार दी जाए, तब तक इसे पूरा होने तक इरादे को फिर से वितरित किया जाएगा (जब तक कि कुछ संख्या में अधिक प्रयास इसे पूरा नहीं कर सकते। जिस बिंदु पर सिस्टम देता है)। यह उन सेवाओं के लिए उपयोगी है जो काम करने के लिए कमांड प्राप्त कर रहे हैं, और यह सुनिश्चित करना चाहते हैं कि वे अंततः भेजे गए प्रत्येक कमांड के लिए काम पूरा करें।
START_NOT_STICKY
?
START_REDELIVER_INTENT
ऐसा है START_NOT_STICKY
। इसके बजाय यह हैSTART_STICKY
अंतर:
सिस्टम आपकी सेवा को मारने के बाद फिर से बनाने की कोशिश करेगा
सिस्टम के मारे जाने के बाद आपकी सेवा को फिर से बनाने की कोशिश नहीं करेगा
मानक उदाहरण:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
START_REDELIVER_INTENT
। मैंने START_STICKY
हाल ही में ऐप द्वारा ऐप का परीक्षण किया और मार दिया। फिर यह सेवा को याद करते हैं। लेकिन START_REDELIVER_INTENT
फिर कभी फोन नहीं किया। क्यों?
के लिए प्रलेखन START_STICKY
और START_NOT_STICKY
काफी सीधा है।
यदि इस सेवा की प्रक्रिया को शुरू करने के बाद मार दिया जाता है (लौटने के बाद
onStartCommand(Intent, int, int))
, तो इसे शुरू की स्थिति में छोड़ दें, लेकिन इस वितरित इरादे को बरकरार न रखें। बाद में सिस्टम सेवा को फिर से बनाने की कोशिश करेगा। क्योंकि यह शुरू में है। , यहonStartCommand(Intent, int, int)
नई सेवा आवृत्ति बनाने के बाद कॉल करने की गारंटी देगा ; यदि सेवा को वितरित करने के लिए कोई लंबित स्टार्ट कमांड नहीं हैं, तो इसे एक अशक्त आशय वस्तु के साथ कहा जाएगा, इसलिए आपको इसके लिए जांच करने का ध्यान रखना चाहिए।यह मोड उन चीजों के लिए समझ में आता है, जिन्हें स्पष्ट रूप से शुरू किया जाना चाहिए और मनमाने ढंग से समय के लिए चलना बंद कर दिया जाएगा, जैसे कि पृष्ठभूमि संगीत प्लेबैक प्रदर्शन करने वाली सेवा।
उदाहरण: स्थानीय सेवा नमूना
यदि इस सेवा की प्रक्रिया की शुरुआत होने के बाद (इसे वापस करने के बाद
onStartCommand(Intent, int, int))
, और इसे वितरित करने के लिए कोई नई शुरुआत के इरादे नहीं हैं, तो इसे मार दिया जाता है, तो सेवा को शुरू की स्थिति से बाहर ले जाएं और भविष्य में स्पष्ट कॉल करने तक इसे फिर से न करेंContext.startService(Intent)
।onStartCommand(Intent, int, int)
एकnull
आशय के साथ एक कॉल प्राप्त नहीं होगा क्योंकि इसे फिर से शुरू नहीं किया जाएगा यदि वितरित करने के लिए कोई लंबित इरादे नहीं हैं।यह मोड उन चीजों के लिए समझ में आता है जो शुरू होने के परिणामस्वरूप कुछ काम करना चाहते हैं, लेकिन स्मृति दबाव में होने पर रोका जा सकता है और स्पष्ट रूप से अधिक काम करने के लिए बाद में खुद को फिर से शुरू कर देगा। इस तरह की सेवा का एक उदाहरण वह होगा जो किसी सर्वर से डेटा के लिए सर्वेक्षण करता है: यह अलार्म को
N
अपनी सेवा शुरू करने से हर मिनट के सर्वेक्षण के लिए अलार्म निर्धारित कर सकता है । जब इसकाonStartCommand(Intent, int, int)
अलार्म से कॉल किया जाता है, यह बाद में एन मिनट के लिए एक नया अलार्म शेड्यूल करता है, और इसकी नेटवर्किंग करने के लिए एक धागा बनाता है। यदि उस जाँच को करते समय इसकी प्रक्रिया को मार दिया जाता है, तो अलार्म बंद होने तक सेवा को फिर से शुरू नहीं किया जाएगा।
उदाहरण: ServiceStartArguments.java