2010-05-16 13 views
17

जबकि इस प्रश्न लिखने हल आपूर्ति की है, लेकिन इस मामले में पोस्टिंग यह मदद करता है किसी को भी:एकाधिक कॉल एक ही आशय/PendingIntent अतिरिक्त मान देने, लेकिन मैं अलग-अलग

मैं इस तरह एकाधिक अलार्म सेट कर रहा हूं,

AlarmManager alarms = (AlarmManager)context.getSystemService(
     Context.ALARM_SERVICE); 
Intent i = new Intent(MyReceiver.ACTION_ALARM); // "com.example.ALARM" 
i.putExtra(MyReceiver.EXTRA_ID, id); // "com.example.ID", 2 
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0); 
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p); // 5 mins 

... और इस तरह से उन्हें प्राप्त करने:

public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(ACTION_ALARM)) { 
     // It's time to sound/show an alarm 
     final long id = intent.getLongExtra(EXTRA_ID, -1); 

अलार्म मेरी रिसीवर एक के लिए दिया जाता id के विभिन्न मूल्यों के साथ सही समय पर नहीं, लेकिन अक्सर के साथ गलत मूल्य पर सेट किया जाता है: यह एक मूल्य है जिसे मैंने किसी बिंदु पर उपयोग किया है, सिर्फ उस समय नहीं जिसे मैं उस विशेष समय पर वितरित करना चाहता था।

उत्तर

24

प्रलेखन PendingIntent.getBroadcast() के लिए कहते हैं:

रिटर्न

दिए गए मापदंडों से मेल खाते किसी मौजूदा या नए PendingIntent देता है।

समस्या यह है कि इस उद्देश्य के लिए केवल अतिरिक्त अंतर अलग-अलग होते हैं। तो getBroadcast() अभी तक बनाए गए इरादे के आस-पास एक नए व्यक्ति के बजाय कुछ यादृच्छिक पुराने लंबित इन्टेंट (एक अलग के साथ) वापस कर देगा।

Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id)); 

फिर आप आईडी नंबर का उपयोग कर प्राप्त कर सकते हैं: ठीक इस तरह एक डेटा उरी की आपूर्ति और यह आईडी के साथ अलग बनाने के लिए, है

Long.parseLong(intent.getData().getSchemeSpecificPart()); 

... या निश्चित रूप से आपूर्ति अतिरिक्त भी और इसका उपयोग करें।

+0

बस सोच रहा है, अगर मैं एक नए प्रयोग है इरादा i = नया इरादा (संदर्भ, सीएलएस) के साथ इरादा; क्या मेरे पास यह मिश्रित आईडी समस्या है? मेरे मामले में, सीएल अलग अलार्म के लिए अलग है। यह ठीक होना चाहिए, है ना? – Safecoder

+0

मैं वर्तमान में एक्स्ट्रा के बारे में बिंदु देखने के लिए पहले देखे गए सटीक स्थान को नहीं ढूंढ सकता, लेकिन हां, एक अलग वर्ग के साथ यह एक पूरी तरह से अलग इरादा है इसलिए मैं काम करने की अपेक्षा करता हूं। –

+1

@ क्रिसबॉयले, बहुत बहुत धन्यवाद। लेकिन मेरे मामले में, यह काम नहीं करता है। हालांकि यह काम करता है: 'इरादा इरादा = नया इरादा (शून्य, Uri.parse (Long.toString (आईडी)), संदर्भ, AlarmActivity.class); '। ध्यान दें कि मैं गतिविधि का उपयोग कर सकता हूं। –

7

तुम भी झंडा PendingIntent.FLAG_UPDATE_CURRENT

PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 

इस्तेमाल कर सकते हैं इस करना चाहिए काम भी

+0

यदि आप केवल एक बार में इसका उपयोग करने जा रहे थे, तो हाँ, लेकिन कई टाइमर सेट वाले अलार्म के लिए, आपको एक साथ कई लंबित संकेतों की आवश्यकता होती है, और FLAG_UPDATE_CURRENT आपको एकल अलार्म भेजने वाले सभी अलार्म के साथ छोड़ देगा। –

2

आपकी समस्या के लिए समाधान Intent.FLAG_ACTIVITY_NEW_TASK

p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK); 
संबंधित मुद्दे