2012-06-07 8 views
28

मैं अटक गया हूँ। जब मेरा एप्लिकेशन शुरू होता है तो मैं यह जांचना चाहता हूं कि अलार्म जिंदा है या नहीं, जिसे मैंने पहले सेट किया था। यदि नहीं तो मैं इसे सेट करना चाहता हूं।क्या यह जांचने का कोई तरीका है कि अलार्म पहले से सेट है या नहीं?

मैंने this solution को संदर्भित किया। मैं इस तरह के इरादे से मिलान करने की कोशिश कर रहा हूं:

Intent intent = new Intent(); 
     intent.setAction("com.vit.upload"); 
     PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE); 

लेकिन यह काम नहीं करता है। और क्या काम करेगा?

उत्तर

65

सबसे पहले, कैसे पूर्व में बनाए गए अलार्म का उपयोग करने की पर एक छोटे से ट्यूटोरियल:

आप इस तरह के रूप में एक विशिष्ट आईडी के साथ प्रत्येक बनाकर अलार्म के बीच अंतर कर सकते हैं:

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getActivity(this,UNIQUE_ID_GOES_HERE, intent, 0); 
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

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

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 1234, intent, 0); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

विचार सरल है। आईडी का ट्रैक रखें और फिर अपने संबंधित अलार्म तक पहुंचने के लिए उनका उपयोग करें। यदि आप एक ही आईडी के साथ कई अलार्म बनाते हैं, तो सबसे हालिया एक पिछले को रद्द कर देगा।

आपकी मुख्य समस्या आ रहा है, यह जांचने के बजाय कि आपका अलार्म सक्रिय है या नहीं, हर बार जब आप अपना एप्लिकेशन लॉन्च करते हैं, तो बस इसे अपनी गतिविधि के onCreate() विधि में पुनः सेट करें। जैसा कि मैंने ऊपर वर्णित किया है वही लंबित इंटेंटेंट के साथ। यह आपको जांचने की सभी परेशानी बचाता है कि क्या अलार्म पहले सेट किया गया है या नहीं। चूंकि आपका लक्ष्य अलार्म को जीवित रखना है, इसलिए जब भी आप एप्लिकेशन लॉन्च करते हैं, तो पहले सेट सेट को ओवरराइड करने में कोई दिक्कत नहीं होगी। बस सुनिश्चित करें कि आप अपना लंबित इंटेंट बनाने के लिए एक ही आईडी का उपयोग करते हैं।

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

आइए एक और मामला मानें: जब आप अपना डिवाइस बंद कर देते हैं, तो आपके सभी अलार्म रद्द कर दिए जाएंगे। यह आपको रीबूट पर फिर से सेट करने के अलावा कोई विकल्प नहीं छोड़ता है। ऐसा करने के लिए, आपको BroadcastReceiver का उपयोग करना होगा।

This answer आपको यह कैसे करने में मदद करेगा। उपर्युक्त सुझाव के अनुसार बस अपने प्रसारण को अपने ब्रॉडकास्ट रिसीवर की ऑनसेसिव() विधि में फिर से बनाएं।

+0

वर्कग्राउंड के लिए हाय धन्यवाद ... लेकिन अगर मेरे पास कोई गतिविधि नहीं है तो क्या होगा .. फिर मेरा बूट पूरा हुआ प्रसारण रिसीवर उस मामले में काम नहीं करेगा (एंड्रॉइड संस्करण 3.0 के साथ मामला) ... तो इसके साथ कैसे आना है .. क्योंकि मैं इस तरह के ऐप पर काम कर रहा हूं कि वे कोई गतिविधि नहीं चाहते हैं ... तो उस रिसीवर को कैसे पंजीकृत करें .. – NullPointerException

+0

आपको बस टैग का उपयोग करने की आवश्यकता है। इसे देखें: http: //developer.android.com/guide/topics/manifest/receiver-element.html। यदि आप अपना अलार्म बनाने के लिए सेवा का उपयोग कर रहे हैं, तो आपको उपरोक्त गतिविधि नाम को अपने सेवा वर्ग के नाम में बदलना होगा। – Erol

+0

ठीक है !!! यह मुझे सबसे अच्छा जवाब मिला है इसलिए मैं इसे पुरस्कृत करता हूं !! – NullPointerException

5
  • जब आप अपने एंड्रॉइड डिवाइस को रीबूट करते हैं तो पहला अलार्म काम नहीं करेगा।
  • अलार्म की जांच करने के लिए आप बूलियन साझा वरीयताओं का उपयोग कर सकते हैं या नहीं।
  • एंड्रॉयड लंबित आशय उपयोग विशिष्ट ID

    पूर्णांक REQUEST_CODE = 2344; // विशिष्ट ID
    PendingIntent pIntent = PendingIntent.getBroadcast (संदर्भ, REQUEST_CODE, आशय, PendingIntent.FLAG_NO_CREATE);

आप बूट रिसीवर प्रसारण जब सिस्टम रिबूट तो एक ही अनुरोध कोड REQUEST_CODE=2344;

+0

अरे यह अच्छा सुझाव जैसा दिखता है लेकिन मूल समस्या एक ही है .. इसे कैसे जांचें मौसम पहले से ही सेट है या नहीं ?? और यदि इसे जांचने की प्रक्रिया है तो मुझे इसके लिए कोड कहां लिखना चाहिए ?? मेरा मतलब है कि जब मेरा ऐप शुरू होता है या किसी अन्य गतिविधि में ?? कृपया मेरी मदद करें .. – NullPointerException

3

Basiclly मेरे experiance से साथ Alaram यदि आप एक ही आशय और FLAG_UPDATE_CURRENT का उपयोग फिर से बनाने के उपयोग करने के लिए है, तो आप कि सुनिश्चित हो सकता है आपके पास एक ही इरादे के लिए दो अलार्म सेट नहीं होंगे। इसके अलावा आप FLAG_NO_CREATE पर बारीकी से देख सकते हैं जिसका उपयोग फ़ंक्शंस के साथ किया जाता है और वर्णित इरादे के साथ लंबित होने पर शून्य वापस आता है।

लंबित इरादे के लिए उसी अनुरोध आईडी का उपयोग करना भी याद रखें क्योंकि उनके अंतर अलग हैं।

+0

Szczygiel बहुत सच मेरा अनुभव यह भी कहता है कि एक ही इरादे का उपयोग करते हुए और setInexactRepeating का उपयोग करते समय, FLAG_UPDATE_CURRENT काम करता है ... –

1

here पर आधारित जानकारी के आधार पर, ऐसा लगता है कि कोई अलार्म मौजूद है या नहीं, यह जांचने के लिए आप ऐसा कर सकते हैं, लेकिन वे कुछ कामकाज की पेशकश करते हैं।