2012-09-24 16 views
5

मैं एक एंड्रॉइड एप्लिकेशन लिख रहा हूं जहां उपयोगकर्ता कई स्टॉक चुनने के लिए चुन सकता है और पूर्वनिर्धारित अलर्ट स्थिति से मेल खाने पर सतर्क हो जाता है। स्टॉक डेटा को कस्टम पार्सेलबल क्लास "अलर्ट" (स्टॉक और हालत प्रति एक ऑब्जेक्ट) की 5 ऑब्जेक्ट्स में सहेजा जाता है। आवधिक डेटा अपडेट AlarmManager द्वारा शुरू की गई सेवा के माध्यम से किया जाता है। चेतावनी वस्तुएं उन्हें उस इरादे में डालकर सेवा में पास की जाती हैं जो अलार्ममेनगर के लंबित इंटेंट में डाल दी जाती है।अलार्म मैनेजर द्वारा सेवा शुरू होने पर इरादे का उपयोग करके डेटा को डेटा को अपडेट करने के लिए कैसे करें?

Intent intent = new Intent(this, UpdateService.class); 
    Bundle b = new Bundle(); 
    saveAlertsToBundle(b);  
    intent.putExtras(b); 
    intent.setData(Uri.parse("updateManager")); 
    PendingIntent pendIntent = PendingIntent.getService(this,0,intent,0); 

    // 1min intervall 
    long intervall = DateUtils.MINUTE_IN_MILLIS * 1; 
    // time of first start 
    long firstStartDelay = DateUtils.SECOND_IN_MILLIS * 30; 
    long firstStart = System.currentTimeMillis() + firstStartDelay; 

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    // kill running 
    am.cancel(pendIntent); 
    //start new 
    am.setRepeating(AlarmManager.RTC_WAKEUP,firstStart,intervall,pendIntent); 

मेरे समस्या है:

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

तो मेरा सवाल यह है कि पहले से चल रहे अलार्ममेनर को अपडेट किए गए इरादे को कैसे पास किया जाए।

मैंने पहले से ही अलार्ममेनर (// मारने वाली टिप्पणी पर पंक्ति) को रोकने और इसे पुनरारंभ करने का प्रयास किया है, लेकिन यह काम नहीं करता है। संभवतः उस उद्देश्य के कारण जब वह बनाया गया था उसी चेतावनी वस्तुओं को नहीं पकड़ रहा था? मैंने इरादे के डेटा हिस्से में एक यूरी सेट करके इसे ठीक करने की कोशिश की लेकिन इससे भी मदद नहीं मिली।

सहायता के लिए धन्यवाद।

उत्तर

2

आपकी समस्या PendingIntent काम करता है। प्रणाली PengingIntent एस के पूल का प्रबंधन करती है। जब आपके कोड करता है:।

PendingIntent pendIntent = PendingIntent.getService(this,0,intent,0); 

यह एक PendingIntent कि मानकों (इस मामले में आप में उत्तीर्ण कर ली है से मेल खाता है, के लिए खोज करने के लिए प्रणाली का कारण बनता है अपने Intent हालांकि, मिलान एल्गोरिथ्म कि PendingIntent का उपयोग करता है केवल कुछ फ़ील्ड तुलना Intent का यह निर्धारित करने के लिए कि यह वह है जिसे आप ढूंढ रहे हैं। विशेष रूप से, यह अतिरिक्त की तुलना नहीं करता है। इसलिए इसका मतलब है कि आपने पहले PendingIntent बनाया है, तो PendingIntent.getService() पर कॉल हमेशा PendingIntent से वापस आ जाएगा पूल (और एक नया निर्माण नहीं, जो आप चाहते हैं)

आदेश, PendingIntent.getService() करने के लिए कॉल एक नया PendingIntent हर बार जब आप फोन यह, पैरामीटर आप कॉल करने के लिए अद्वितीय पारित बनाने का प्रयास करें बनाने बनाने के लिए इस तरह में:

int requestCode = (int) System.currentTimeMillis(); // Create unique request code 
PendingIntent pendIntent = PendingIntent.getService(this, requestCode, intent, 0); 

requestCode के बाद से प्रत्येक कॉल के लिए अलग होगा PendingIntent.getService(), यह आपकी समस्या का समाधान करना चाहिए।

संपादित नीचे

ओपी की टिप्पणी के आधार पर आप मौजूदा अलार्म रद्द करने और नए डेटा के साथ एक नया बनाना चाहते हैं। उस स्थिति में आपको अद्वितीय पहचानकर्ताओं का उपयोग करने की आवश्यकता नहीं है क्योंकि आप पूल में केवल PendingIntent रखना चाहते हैं। लेकिन, आप इसके लिए डेटा बदलना चाहते हैं।इसे आज़माएं:

// Create a PendingIntent (or update the existing PendingIntent with new values 
PendingIntent pendIntent = PendingIntent.getService(this, 0, intent, 
         PendingIntent.FLAG_UPDATE_CURRENT); 

AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
// cancel any pending alarms 
am.cancel(pendIntent); 
//start new 
am.setRepeating(AlarmManager.RTC_WAKEUP,firstStart,intervall,pendIntent); 
+0

आपकी मदद के लिए धन्यवाद, इसने समस्या हल की लेकिन एक नया बनाया। अतिरिक्त अलर्ट ऑब्जेक्ट्स को सेवा में पास किया जाता है, लेकिन अतिरिक्त अलार्ममेनगर नियंत्रित सेवाओं के रूप में, पहले से चल रहे अलार्ममेनर्स चलते रहते हैं। इसलिए हर बार जब मैं एक अलर्ट ऑब्जेक्ट जोड़ता हूं तो अलार्ममेनर्स की मात्रा बढ़ जाती है। इसका मतलब है कि मेरे पास एक अलर्ट ऑब्जेक्ट के लिए चल रहा है, एक के लिए दो, तीन में से एक, आदि। मुझे लगता है कि अगर मौजूदा मौजूदा अलर्ट की मौजूदा मात्रा में केवल एक ही होगा तो मुझे अभी भी पुराने अलार्ममेनर को रोकने की जरूरत है। सेवाओं को रोकने के लिए बंद कर दिया गया है()। – user1695117

+0

ठीक है। मुझे यकीन नहीं था कि आप वास्तव में क्या करना चाहते थे। इस टिप्पणी के आधार पर ऐसा लगता है कि आप मौजूदा अलार्म को रद्द करना चाहते हैं और नए पैरामीटर के साथ एक नया बनाना चाहते हैं। मैं इसके लिए अपना जवाब संपादित करूंगा। –

+0

यह पूरी तरह से काम किया। तो मैं जो खो रहा था वह सही ध्वज था, ऐसा लगता है। आपके सहयोग के लिए धन्यवाद। – user1695117