2012-05-08 38 views
7

Service के साथ विजेट अपडेट करने के लिए मैं Alarm Manager पर हस्ताक्षर कर रहा हूं। मेरे पास दो अलग-अलग प्रश्न हैं।अलार्म प्रबंधक का उपयोग करना भले ही ऐप बंद हो?

पहला प्रश्न: मैं अलार्म प्रबंधक के इरादे से सेवा को बुला रहा हूं। इस तरह:

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent i = new Intent(context, MyService.class); 
pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 

context.startService(new Intent(context, MyService.class)); 

Long repeat = Long.parseLong(prefs.getString("update_preference", "600")); 
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), 1000*repeat, pi); 

क्या यह गलत है?

यह दिखता है और सही काम करता है। लेकिन जब मैंने कामकाजी सेवाओं को देखा है, मैं सूची में अपना सेवा नाम नहीं देख सकता। शायद यह एकल/अलग सेवा के रूप में नहीं चल रहा है। बस आवेदन का नाम देखा (एक सेवा के रूप में नहीं)। मुझे यकीन नहीं है कि कैसे अलग करना है या इससे कोई फर्क पड़ता है?

एक और सवाल: लंबे समय से चलने वाले एप्लिकेशन, जो विगेट्स अपडेट को नियंत्रित करते हैं, किसी भी तरह से (मैन्युअल रूप से या एक कार्य हत्यारा द्वारा बंद) है। बेशक Alarm Manager रुकने वाला और विजेट के कार्य भी बंद हो जाएंगे। उदाहरण के लिए बटन क्लिक करें।

लेकिन, ट्विटर ने इस समस्या को हल किया। जबकि विजेट सक्रिय है, अगर मैं मुख्य अनुप्रयोग (ट्विटर) को बंद करता हूं - जो विजेट को नियंत्रित करता है- विजेट पर क्लिक करने के बजाय, किसी भी तरह विजेट विजेट को ट्रिगर करता है और यह फिर से शुरू होता है। तो बटन ठीक से काम करते हैं। वो कैसे संभव है?

किसी भी मदद की सराहना की जाएगी।

उत्तर

3

आपको context.startservice करने की आवश्यकता नहीं है कि लंबित मंशा क्या है, यदि आप पहली बार सेवा चलाने के लिए चाहते हैं तो इसे वर्तमान समय पर चलाने के लिए सेट करें, फिर वर्तमान समय से अंतराल सेट करें। जहां setInexact नहीं है और ओएस द्वारा समायोजित किया जा सकता है जब यह इसलिए यह में अयथार्थ निकाल दिया जाता

तुम भी दोहरा जब आप setRepeating की जरूरत नहीं है के 2 अलग अलग प्रकार के सेट कर रहे हैं सख्त है। आप एक या दूसरे दोनों नहीं चाहते हैं।

यह अंतराल बहुत छोटा है और यह बैटरी को काफी मारने जा रहा है।

यह सिर्फ होना चाहिए इस

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent i = new Intent(context, MyService.class); 
pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 

Long repeat = Long.parseLong(prefs.getString("update_preference", "600")); 
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
         Calendar.getInstance().getTimeInMillis(), 1000*repeat, pi); 
+0

2 अलग-अलग दोहराने के लिए खेद है, मैंने अपना प्रश्न संपादित कर लिया है। –

+0

फिर भी आपको 'context.startService' की आवश्यकता नहीं है, हालांकि लंबित इंटेंट सेवा – tyczj

+0

सेवा शुरू करेगा सबसे पहले, मेरा विजेट किसी भी सर्वर से डेटा ला रहा है।क्या आप निश्चित रूप से सेवा का उपयोग करने के बारे में सुनिश्चित हैं अनावश्यक है? क्या मुझे विजेट क्लास में अद्यतन फ़ंक्शन का उपयोग करना चाहिए? क्या आप उपयोग करने के लिए उदाहरण दे सकते हैं। धन्यवाद। –

1

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

+0

यह स्पष्ट रूप से पता मिल गया। धन्यवाद। लेकिन क्या होगा अगर अलार्म मैनेजर रखने वाले एप्लिकेशन को मैन्युअल रूप से या कुछ हत्यारे द्वारा बताया गया हो? –

+0

अलार्ममेनर आपके आवेदन के अंदर नहीं चल रहा है। यदि आपका आवेदन मारे गए हैं तो कोई समस्या नहीं है क्योंकि सेवा के इरादे लॉन्च होने पर ओएस द्वारा इसे शुरू किया जाएगा। – lujop

+0

ठीक है, आपका मतलब है कि अंतराल समाप्त होने पर, सेवा फिर से शुरू होती है। लेकिन यदि आवेदन चला जाता है तो अभी भी काम नहीं कर रहे ईवेंट पर क्लिक करें। यही कारण है कि मुझे तुरंत सेवा को पुनरारंभ करना चाहिए। लेकिन यह नहीं पता कि यह कैसे करें। –

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