2011-09-05 7 views
33

मेरे ऐप को प्रत्येक दिन एक विशिष्ट समय पर वेब से कुछ डेटा पकड़ने की आवश्यकता है। इसलिए मैं कार्य को शेड्यूल करने के लिए अलार्ममेनगर का उपयोग करता हूं और यह ठीक काम करता है।क्या मुझे AlarmManager के साथ लंबित INTent.getService() या getBroadcast का उपयोग करना चाहिए?

लेकिन जब विभिन्न उदाहरणों को देखते हैं तो लंबित इरादे की बात आती है जब अलार्ममेनगर से निपटने के दो तरीके होते हैं।

एक अलार्म बंद होने पर और रिसीवर के अंदर वास्तविक काम करने की सेवा शुरू होने पर एक प्रसारण रिसीवर को कॉल करने के लिए PendingIntent.getBroadcast() का उपयोग करता है।

एक और दृष्टिकोण PendingIntent.getService() का उपयोग करना है और उस अलार्म को बंद होने पर सीधे सेवा को कॉल करना है।

क्या कोई मुझे दो दृष्टिकोणों के बीच अंतर बता सकता है ताकि मैं तय कर सकूं कि किस पर भरोसा करना है?

संपादित करें: getService() का उपयोग करते समय जागने के लॉक को प्राप्त करने का एक और सवाल यह है कि?

WakeReminderIntentService.acquireStaticLock(context); 

मैं सक्रिय करने वाले लॉक कैसे प्राप्त करना चाहिए अगर मैं बजाय की तरह सीधे सेवा को कॉल:

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT); 

उदाहरण के लिए, जब एक BroadcastReceiver का उपयोग कर रहा onReceive() में निम्न पंक्ति है

क्या मुझे इसे बस सेवा के भीतर से प्राप्त करना चाहिए?

+0

यह वास्तव में एक तरफ या दूसरे से कोई फर्क नहीं पड़ता। आप IntentService या सेवा, या स्थानीय या वैश्विक प्रसारण का उपयोग कर सकते हैं। आप उन सभी में ऐसा करने में सक्षम होना चाहिए। –

उत्तर

16

PendingIntent.getBroadcast() का उपयोग broadcast receiver पर कॉल करने के लिए करता है जब अलार्म बंद हो जाता है और उस रिसीवर के अंदर असली काम करने की सेवा शुरू होती है।

यह से

एक और दृष्टिकोण है प्रारंभिक सेवा में एक और कदम PendingIntent.getService() का उपयोग करें और सेवा सीधे कॉल जब कि अलार्म बंद हो जाता करने के लिए है।

तो आप दूसरा दृष्टिकोण का उपयोग करना चाहिए के रूप में यह निष्पादन में अपनी एक कदम को कम करने है ..

+1

"तो आपको दूसरे दृष्टिकोण का उपयोग करना चाहिए क्योंकि यह आपके एक चरण को निष्पादन में कम कर रहा है": यदि यह एकमात्र अंतर है, निश्चित रूप से हां।लेकिन मैं सोच रहा था कि क्या कोई सूक्ष्म अंतर था, कुछ ऐसा जो प्रदर्शन पर प्रभाव डाल सकता है आदि। – marlar

+0

मुझे नहीं लगता कि कुछ और है जो प्रदर्शन को प्रभावित करेगा .. –

+0

धन्यवाद। कृपया मेरा अद्यतन प्रश्न देखें। – marlar

11

अपने संपादित पढ़ना मुझे लगता है कि आप अपने आप को पता चला: आप का उपयोग करते समय है कि आपकी सेवा शुरू कर दिया है यह सुनिश्चित करना चाहते हैं AlarmManager, आप बेहतर रूप से एक रिसीवर को भेजने और वहां एक लॉक लॉक प्राप्त करने का चक्कर लगाते हैं। अन्यथा यह संभव है कि अनुरोधित सेवा लॉन्च होने से पहले फोन सो जाएगा। यही है कि javadoc of AlarmManager कहता है और मैंने इसे Google engineer द्वारा पोस्ट में भी पढ़ा है।

तो अब आपके संपादन के लिए: लॉक कब प्राप्त करें? रिसीवर का उपयोग करने का पूरा बिंदु रिसीवर की onReceive() विधि के भीतर लॉक प्राप्त करना है, क्योंकि एंड्रॉइड इस विधि के निष्पादन के दौरान सो नहीं जाएगा।

उदाहरण के लिए यह question देखें।

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