2010-12-03 13 views
23

मैं एक alarmManager जो मैं विशिष्ट समय पर उपयोगकर्ता के लिए सूचनाएं भेजने के लिए उपयोग कर रहा हूँ है। चूंकि कई अलार्म हैं, मेरे पास कई लंबित इरादे हैं जो मैं एक अद्वितीय आईडी बना रहा हूं और दे रहा हूं, हालांकि कुछ ऐसी स्थितियां हैं जिनमें मुझे सभी लंबित इरादों को प्राप्त करने की आवश्यकता होगी और फिर उन्हें रद्द कर दें, इसलिए मैं अलार्म रीसेट कर सकता हूं। मैंने ऐसा करने की कोशिश की है और मुझे अभी भी यह सही नहीं लगता है इसलिए मेरे पास कुछ प्रश्न हैं:लंबित इंटेन्टेंट कैसे प्राप्त करें और रद्द करें?

क्या यह PendingIntent को सही तरीके से प्राप्त और रद्द कर देगा?

Intent intent = new Intent(con, AppointmentNotificationReciever.class); 
PendingIntent sender = PendingIntent.getBroadcast(con, id, intent, 
     PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE); 
am.cancel(sender); 

क्या इरादे को मूल लंबित इरादे (अतिरिक्त और सभी) से बिल्कुल मेल खाना चाहिए?

PendingIntent झंडा मूल लंबित आशय का है कि मैच के लिए की आवश्यकता है?

+0

'FLAG_CANCEL_CURRENT' कोई फर्क नहीं पड़ता - वास्तव में उत्कृष्ट विश्लेषण के लिए [यह] (http://justanapplication.wordpress.com/tag/flag_cancel_current/#PendingIntentMatching) –

उत्तर

56

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

+0

मुझे आपके द्वारा उल्लिखित एक ही समस्या का सामना करना पड़ा । क्या आप संक्षेप में समझा सकते हैं कि मैं इस समस्या को कैसे दूर कर सकता हूं। यदि संभव हो तो आप लंबित इरादे बनाने और रद्द करने के लिए स्निपेट कोड प्रदान कर सकते हैं। –

+3

इस उत्तर का प्रयास करें: http://stackoverflow.com/questions/9823408/cancelling-a-pendingintent – Whitecat

+0

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

1

बनाने और एक अलार्म को रद्द करने के अपने परीक्षण कार्यान्वयन का एक उदाहरण है।

public void setTHEalarm(Calendar aCalendarToAlarm) { 
    int id; 
    Intent intent; 
    PendingIntent pendingIntent; 
    AlarmManager alarmManager; 

    //I create an unique ID for my Pending Intent based on fire time of my alarm: 

    id = Integer.parseInt(String.format("%s%s%s%s", 

      aCalendarToAlarm.get(Calendar.HOUR_OF_DAY), 
      aCalendarToAlarm.get(Calendar.MINUTE), 
      aCalendarToAlarm.get(Calendar.SECOND), 
      aCalendarToAlarm.get(Calendar.MILLISECOND))); //HASH for ID 

    intent = new Intent(this,AlarmReceiver.class); 
    intent.putExtra("id",id); //Use the id on my intent, It would be usefull later. 

    //Put the id on my Pending Intent: 
    pendingIntent = PendingIntent.getBroadcast(this,id,intent,0); 
    alarmManager = (AlarmManager) 

      this.getSystemService(Context.ALARM_SERVICE); 


    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,aCalendarToAlarm.getTimeInMillis(),CustomDate.INTERVAL_MINUTE,pendingIntent); 


    Log.w(TAG+" Torrancio","Created alarm id: " 
      +id+" -> " 
      +CustomDate.dateToHumanString(aCalendarToAlarm.getTime())); 

    //Keep a reference in a previously declared field of My Activity (...) 
    this.idSaved = id; 

} 

//Now for canceling 
public void setCancel() { 
    int id; 
    Intent intent; 
    PendingIntent pendingIntent; 
    AlarmManager alarmManager; 

    id = this.idSaved; 
    intent = new Intent(this,AlarmReceiver.class); 
    intent.putExtra("id",id); 
    pendingIntent = PendingIntent.getBroadcast(this,id,intent,PendingIntent.FLAG_CANCEL_CURRENT); 

    //Note I used FLAG_CANCEL_CURRENT 

    alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.cancel(pendingIntent); 

    Log.w(TAG+" Torrancio","Canceled->"+id); 


} 

आवश्यकता 3 चीजें,

  • आशय का एक ही प्रकार के (इस मामले में हम एक AlarmManager के बारे में बात कर रहे हैं)।
  • ही PendingIntent आईडी (, आईडी के संदर्भ रखें यह किसी तरह से बचाने के लिए)।
  • एक सही ध्वज (, रद्द की कोई जरूरत नहीं है और न ही और ठीक एक जब pendingintent बनाया आप इस्तेमाल किया जाना चाहिए के लिए FLAG_CANCEL_CURRENT [क्योंकि हम calcel के लिए रद्द झंडा उपयोग करें, लेकिन नहीं बना।])

अधिक जानकारी के लिए कृपया this देखें।

उम्मीद है कि यह मदद करता है।

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