2012-11-05 18 views
10

मैं एक ऐप लिख रहा हूं जो लगातार डिवाइस के सेंसर को चुनाव करता है और हर बार फाइल को कुछ आंकड़े लिखना चाहिए। यह एक बार एक बार या एक मिनट में एक बार धीमा हो सकता है। क्या मुझे Handler'spostDelayed() विधि का उपयोग करना चाहिए या बस इसे AlarmManager के साथ शेड्यूल करना चाहिए?क्या मुझे अलार्ममेनगर या हैंडलर का उपयोग करना चाहिए?

उत्तर

2

मैं कहूंगा कि यह मतदान अंतराल पर निर्भर करता है। मुझे लगता है कि यह आपके मामले में काफी कम है (लगभग कुछ सेकेंड), इसलिए आपको हैंडलर रास्ता या टाइमर क्लास का उपयोग करके जाना चाहिए।

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

+0

मैं टाइमर प्रलेखन जाँच की है, इसका क्या मतलब है के लिए एक टाइमर एक डेमॉन धागे के रूप चलाने के लिए? क्या यह एक सेवा है? –

9

यदि ऐप को स्टैंडबाय में काम करना चाहिए तो AlarmManager। यदि नहीं तो Handler
AlarmManager सीपीयू जगाएगा इसलिए यह बैटरी को और अधिक निकाल देगा, जबकि Handler स्टैंडबाय पर काम नहीं करेगा।

+0

फ़ोन कब नींद मोड में जाता है? मैं थोड़ी देर के लिए अपने ऐप का परीक्षण कर रहा हूं और डिवाइस स्टैंडबाय में जा रहा है कभी भी कोई मुद्दा नहीं रहा है। –

+2

मुझे अभी और अधिक विस्तृत उत्तर मिला है: http://stackoverflow.com/a/5120225/538169 – pawelzieba

9

तय करें कि आपके डिजाइन नीचे दिए गए महत्वपूर्ण बिंदुओं पर आधारित:

AlarmManager: लाभ AlarmManager साथ यह काम करता है कि भले ही डिवाइस (सीपीयू बंद है) गहरी नींद मोड में है है। जब अलार्म आग लगती है, तो यह BroadcastReceiver और onReceive में हिट करता है, यह जागने के लॉक को प्राप्त करता है (यदि आपने WAKEUPRTC_WAKEUP या ELAPSED_TIME_WAKEUP जैसे अलार्म के प्रकारों का उपयोग किया है)। onReceive() को खत्म करने के बाद यह जाग ताला जारी करता है।

लेकिन ज्यादातर बार यह मेरे लिए काम नहीं करता था। इसलिए मैंने onReceive() में अपने स्वयं के जागने वाले ताले हासिल कर लिए हैं और यह सुनिश्चित करने के लिए अंत में उन्हें जारी किया है कि मुझे वास्तव में सीपीयू मिल जाए।

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

टाइमर और हैंडलर: Handler और टाइमर गहरी नींद मोड में काम नहीं करते काम अर्थ/runnable जब डिवाइस सो है अनुसूची के अनुसार नहीं चलेंगे। वे नींद में समय की गणना नहीं करते हैं जिसका मतलब है कि कार्य निष्पादित करने में देरी की गणना केवल सक्रिय मोड के दौरान की जाएगी। इसलिए, वास्तविक देरी देरी से दी जाएगी + समय-व्यतीत-गहरी नींद में।

13

इससे आपको Handler और AlarmManager के बीच भेदभाव करने में मदद करनी चाहिए। [source]

हालांकि यह अधिकतर एपीआई 23 के लिए काम करने पर सहमत है। यह एक नई रिलीज है।

A flowchart for background work, alarms, and your Android app

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