8

मैं एक एसएमएस शेड्यूल ऐप बना रहा हूं जो उपयोगकर्ता से समय, एसएमएस और संख्या लेगा और किसी भी समय इस एसएमएस को भेज देगा। मैं PendingIntent का उपयोग कर रहा हूं। मेरा नमूना कोड यहाँ है।एंड्रॉइड में ब्रॉडकास्ट रिसीवर को कैसे रोकें

जब उपयोगकर्ता शेड्यूल बनाता है, तो यह बस इस विधि को कॉल करता है।

private void SendMessages() 
    { 
     Intent intent = new Intent(this, SMSBroadcastReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(
       this.getApplicationContext(), 234324243, intent, 0); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent); 
    } 

और यहाँ

मेरा प्रश्न है 'SMSBroadcastReceiver.java' फ़ाइल है: उपयोगकर्ता अनुसूची संपादित करता है तो कैसे मुझे लगता है कि प्रसारण रद्द करने और एक नया एक भेज सकते हैं ??? जैसा कि एक से अधिक कार्यक्रम हो सकते हैं, बदलने/निरस्त करने के लिए कल्पना कैसे प्राप्त करें ??

उत्तर

10

उपयोगकर्ता अनुसूची संपादित करता है तो मुझे लगता है कि प्रसारण कैसे रद्द करने और कर सकते हैं एक नया भेज एक?

एक कार्यक्रम निर्धारित करने के लिए इस्तेमाल करने के लिए AlarmManager पर कॉल cancel() एक बराबर PendingIntent साथ:

Intent intent = new Intent(this, SMSBroadcastReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 234324243, intent, 0); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

alarmManager.cancel(pendingIntent); 

हो सकता है के रूप में एक अनुसूची, कैसे बदलने के लिए speicific को खोजने के लिए की तुलना में अधिक/गर्भपात?

आपके कार्यान्वयन में केवल एक अलार्म है।

+1

लेकिन अगर मैं एकाधिक अलार्म जोड़ना चाहता हूं तो क्या होगा ?? –

+4

@DawoodAbbasi: प्रत्येक के लिए अलग-अलग आईडी का उपयोग करें (आपके '234324243')। – CommonsWare

+1

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

6

यदि आपके पास लंबित इरादे का संदर्भ है तो आप cancel इरादा कर सकते हैं। यदि आप वर्तमान प्रसारण को रद्द करना चाहते हैं तो आप abortBroadcast का उपयोग कर सकते हैं।

यह भी देखें:

1) How to get and cancel a PendingIntent?

2) Stop pending intent

3) Aborting/Cancelling Broadcasts

+0

मुझे किसी भी लंबित इरादे को न केवल वर्तमान में संदर्भित किया गया है जैसा कि मैंने –

+0

में उल्लेख किया है, शायद आपको अपने द्वारा बनाए गए प्रत्येक नए लंबित इरादे का संदर्भ रखना चाहिए, यदि आपको लगता है कि आपको बाद में इसे रद्द करने की आवश्यकता है, तो आप अपने लंबित पर पुनः सक्रिय कर सकते हैं इरादे और ऊपर उल्लिखित रद्द विधि का उपयोग करें। –

0
  • सार्वजनिक अंतिम शून्य abortBroadcast()

एपीआई स्तर में जोड़ा गया 1 झंडा यह दर्शाता है कि इस रिसीवर वर्तमान प्रसारण गर्भपात चाहिए सेट; केवल Context.sendOrderedBroadcast के माध्यम से भेजे गए प्रसारण के साथ काम करता है। यह किसी अन्य प्रसारण रिसीवर को प्रसारण प्राप्त करने से रोक देगा। यह अभी भी onReceive BroadcastReceiver की (संदर्भ, आशय) कि Context.sendOrderedBroadcast की कॉलर में पारित कॉल करेंगे।

इस विधि इस तरह के Context.sendBroadcast

साथ
0

तो भेजा उन लोगों के रूप गैर आदेश दिया प्रसारण के साथ काम नहीं करता है आप बस Timemilli बदल रहे हैं, आप अपने sendMessage() फ़ंक्शन को फिर से कॉल कर सकते हैं।

alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent); 

अलार्ममेनगर.सेट() फ़ंक्शन स्वचालित रूप से पिछली अलार्म को तब तक रद्द कर देगा जब तक लंबित इंटेन्टेंट समान न हो; यह एक ही उदाहरण नहीं होना चाहिए, लेकिन इरादे के अनुसार 'मैच' की जरूरत है।filterEquals():

इस व्यवहार के कारण, यह जानना महत्वपूर्ण है कि लंबित इंटेंटेंट को पुनर्प्राप्त करने के प्रयोजनों के लिए दो इरादों को समान माना जाता है। लोगों द्वारा की जाने वाली एक आम गलती कई लंबित इंटेंटेंट ऑब्जेक्ट्स को उन उद्देश्यों के साथ बनाना है जो केवल "अतिरिक्त" सामग्री में भिन्न होती हैं, जो हर बार एक अलग लंबित इंटेन्टेंट प्राप्त करने की अपेक्षा करती हैं। ऐसा नहीं होता है। मिलान के लिए उपयोग किए जाने वाले इरादे के कुछ हिस्सों को Intent.filterEquals द्वारा परिभाषित किया गया है। यदि आप दो इरादों का उपयोग करते हैं जो Intent.filterEquals के बराबर हैं, तो आप दोनों के लिए एक ही लंबित इंटेंट प्राप्त करेंगे।

http://developer.android.com/reference/android/app/AlarmManager.html#set(int, लंबे, android.app.PendingIntent)

http://developer.android.com/reference/android/app/PendingIntent.html http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent)

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