2011-09-29 32 views
5

ऐप को अंतर्निहित सुविधा की आवश्यकता है जो स्थानों को उठाता है और उन्हें सर्वर पर भेजता है। यह नियमित रूप से (लगभग हर 1-5 मिनट) होना चाहिए, लेकिन सबसे महत्वपूर्ण बात यह है कि यह हर समय होना चाहिए, कभी भी रोकना, ओएस शटिंग प्रक्रियाओं के खिलाफ स्मृति को पुनः प्राप्त करने के लिए सुरक्षित नहीं होना चाहिए, और जब ऐप स्वयं नहीं चल रहा है।स्थायी, नियमित, पृष्ठभूमि स्थान अपडेट कैसे कार्यान्वित करें?

निम्नलिखित समाधान मुझे सुझाए गए हैं। मैं एंड्रॉइड स्थानों को संभालने से परिचित हूं, यहां यह मुद्दा यह सुनिश्चित करना है कि वे जारी रखें, भले ही ऐप स्मृति में न हो, और मेमोरी रिकक्लेम के माध्यम से बने रहें।

  1. सेवा। स्थान घटनाओं को इकट्ठा करने और उन्हें संभालने के लिए एक सेवा का उपयोग करें। यह सुनिश्चित करने के लिए कि सेवा हमेशा चल रही है (और संभावित रूप से मेमोरी रिकक्लेम से बचाने के लिए सेवा प्राथमिकता भी बढ़ाएं) सुनिश्चित करने के लिए बूट और स्क्रीन-ऑन प्रसारण का उपयोग करें।

  2. ALARMS। स्मृति इकट्ठा होने पर मैं इन्हें बंद कर सकता हूं। मैं इसके खिलाफ कैसे रक्षा करूं? यह एक बदसूरत समाधान प्रतीत होता है क्योंकि स्थान किसी भी समय अनुसूची पर पहुंचेंगे, इसलिए ऐसा लगता है कि एक और समय-आधारित घटक होने के लिए अनावश्यक लगता है।

  3. स्थान वीआईए ब्रॉडकास्ट। प्रसारण उद्देश्यों के माध्यम से दिए गए स्थान का अर्थ यह होगा कि मैं प्रसारण रिसीवर में स्थान ईवेंट को संभाल सकता हूं। क्या ये स्थान अलर्ट अनिश्चित काल तक जारी रहेगा? क्या डिवाइस शटडाउन के अलावा कुछ और ऐप उन्हें बंद कर देगा, जिससे उन्हें रोकना पड़ेगा?

सबसे टिकाऊ दृष्टिकोण क्या है?

उत्तर

11

यह नियमित रूप से (लगभग हर 1-5 मिनट) होना चाहिए, लेकिन सबसे महत्वपूर्ण बात यह है कि यह हर समय होना चाहिए, कभी भी रोकना, ओएस शटिंग प्रक्रियाओं के खिलाफ सुरक्षित स्मृति को पुनः प्राप्त करने के लिए सुरक्षित नहीं होना चाहिए, और जब ऐप स्वयं नहीं चल रहा है।

यह विभिन्न मोर्चों पर सख्ती से संभव नहीं है।

उन्हें एक समय में एक टुकड़ा लेते हैं:

यह नियमित रूप से (लगभग हर 1-5mins) होना चाहिए

आप स्थानों, अवधि प्राप्त करने में सक्षम नहीं हो सकता है, अकेले हर 1-5 मिनट उपयोगकर्ता के पास सभी स्थान प्रदाता अक्षम हो सकते हैं। उपयोगकर्ता के पास विमान मोड में डिवाइस हो सकता है। उपयोगकर्ता खराब कनेक्टिविटी (नेटवर्क प्रदाता अविश्वसनीय बनाने) के साथ एक बड़ी इमारत (जीपीएस अवरुद्ध) में हो सकता है।

कभी नहीं

उपयोगकर्ता रोक कभी भी सेटिंग में प्रबंधित सेवाएं स्क्रीन या एक कार्य हत्यारा के माध्यम से आप से छुटकारा पा सकते। यदि वे ऐसा करते हैं, खासकर एंड्रॉइड 3.1+ पर, आपका ऐप किसी भी कारण से फिर से नहीं चलाएगा जब तक कि उपयोगकर्ता आपकी गतिविधि शुरू नहीं करता है (उदाहरण के लिए, लॉन्चर के माध्यम से)। उपयोगकर्ता निश्चित रूप से आपके ऐप को अनइंस्टॉल भी कर सकता है।

ओएस के खिलाफ की रक्षा स्मृति

आप इस के खिलाफ गारंटी नहीं दे सकते पुनः प्राप्त करने के नीचे बंद प्रक्रियाओं। आप बाधाओं को कम कर सकते हैं, लेकिन यह है।


अब, चलो अपने विभिन्न समाधान पर ध्यान दें:

स्थान घटनाओं को इकट्ठा करने और उन्हें संभालने के लिए एक सेवा का उपयोग करें।

जिस तरह से आप इसे (और बाद के वाक्य) वाक्यांश देते हैं, तो आपका मतलब एक अनन्त सेवा है, जिसे 24x7 चलाने के लिए डिज़ाइन किया गया है। परिभाषा के अनुसार, इसका मतलब है कि आपका ऐप चल रहा है, जो आपके नियमों में से एक का उल्लंघन करता है। मान लीजिए कि आप इस नियम को आराम देते हैं, यह समाधान उन बाधाओं को बड़े पैमाने पर बढ़ाता है जो उपयोगकर्ता आपकी सेवा से छुटकारा पायेंगे, और यह उन बाधाओं को बढ़ाता है जो एंड्रॉइड आपकी सेवा से छुटकारा पायेगा। आप बाद में startForeground() के उपयोग से कम कर सकते हैं।

ALARMS। स्मृति इकट्ठा होने पर मैं इन्हें बंद कर सकता हूं।

ऐसा नहीं है कि मुझे पता है। हालांकि, अगर उपयोगकर्ता आपसे छुटकारा पाता है, तो आपके अलार्म हटा दिए जाएंगे।

यह एक बदसूरत समाधान लगता है जैसे स्थानों किसी शेड्यूल पर वैसे भी

नहीं आ जाएगा, वे नहीं होगा। requestLocationUpdates() पर समय पैरामीटर का मतलब यह नहीं है कि "स्थान किसी भी समय शेड्यूल पर पहुंचेंगे"।

प्रसारण उद्देश्य के माध्यम से दिए गए स्थान का अर्थ यह होगा कि मैं प्रसारण प्रसारणकर्ता में स्थान ईवेंट को संभाल सकता हूं।

नहीं, आप नहीं कर सकते। आपने संकेत दिया है कि आपके काम का हिस्सा इस डेटा को सर्वर पर भेजना होगा। आप मुख्य अनुप्रयोग धागे पर विश्वसनीय रूप से ऐसा नहीं कर सकते हैं, क्योंकि इसमें बहुत अधिक समय लग सकता है। getService()PendingIntent, IntentService पर इंगित करना अधिक विश्वसनीय होगा।

क्या ये स्थान अलर्ट अनिश्चित काल तक जारी रहेगा?

नहीं। नीचे देखें।

डिवाइस शटडाउन के अलावा कुछ भी होगा या ऐप उन्हें बंद करने के कारण उन्हें रोक देगा?

उपयोगकर्ता आपके ऐप (अनइंस्टॉल, टास्क किलर, मैनेजमेंट सर्विसेज) से छुटकारा पा सकता है। उपयोगकर्ता स्थान प्रदाताओं को अक्षम कर सकता है। उपयोगकर्ता उस क्षेत्र में प्रवेश कर सकता है जहां स्थान निर्धारित नहीं किया जा सकता है। आदि

इसके अलावा, डिवाइस सो सकता है, AFAIK। यह संभव है कि सिस्टम अपडेट के लिए आपके पंजीकृत अनुरोध की अवधि के लिए WakeLock रखता है। यह भी संभव है कि सिस्टम आपकी आपूर्ति अवधि पर खुद को जागने की व्यवस्था करने के लिए आंतरिक रूप से AlarmManager का उपयोग करेगा, इसलिए इसे डिवाइस को लगातार जागने की आवश्यकता नहीं है। हालांकि, आप इसे पूरी तरह से जांचना चाहेंगे।

सबसे टिकाऊ दृष्टिकोण क्या है?

यदि मेरे पिछले पैराग्राफ में चिंताओं को ओएस द्वारा संभाला जाता है, तो आपका तीसरा विकल्प शायद सबसे मजबूत है। अपने IntentService() में startForeground() का उपयोग करें और onHandleIntent() से बाहर निकलने से पहले stopForeground() पर कॉल करें - AlarmManager द्वारा शुरू की गई छोटी-छोटी सेवाएं भी कम स्मृति के कारण बंद हो सकती हैं, मेरे आश्चर्य के लिए बहुत कुछ।

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

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