2012-06-02 9 views
6

मैंने अभी 3 दिनों के लिए खोज की है लेकिन कहीं भी समाधान या इसी तरह की समस्या/प्रश्न नहीं मिला है। यहाँ सौदा है: -> 2 घंटे में काम करता है सहीअलार्ममेनर जल्द ही लंबित इन्टेंट को ट्रिगर करता है

उत्प्रेरक -> 1:23

उत्प्रेरक 1 में में दिन के चला जाता है -

1 घंटे में उत्प्रेरक में की> चला जाता है ~ 11: 00

तो अलार्ममेनगर इतनी अप्रत्याशित और हमेशा जल्द ही क्यों है? या मैं गलत क्या कर रहा हूँ? और क्या कोई और तरीका है जिससे यह सही ढंग से काम कर सके?

AlarmManager alarmManager = (AlarmManager)parent.getSystemService(ALARM_SERVICE); 
Intent myIntent = new Intent(parent, UpdateKlasRoostersService.class); 
PendingIntent pendingIntent = PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

//Set startdate of PendingIntent so it triggers in 10 minutes 
Calendar start = Calendar.getInstance(); 
start.setTimeInMillis(SystemClock.elapsedRealtime()); 
start.add(Calendar.MINUTE, 10); 

//Set interval of PendingIntent so it triggers every day 
Integer interval = 1*24*60*60*1000; 

//Cancel any similar instances of this PendingIntent if already scheduled 
alarmManager.cancel(pendingIntent); 

//Schedule PendingIntent 
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, start.getTimeInMillis(), interval, pendingIntent); 
//Old way I used to schedule a PendingIntent, didn't seem to work either 
//alarmManager.set(AlarmManager.RTC_WAKEUP, start.getTimeInMillis(), pendingIntent); 

यह अगर कोई एक समाधान है भयानक होगा:

इस तरह से मैं AlarmManager (नीचे छीन) में मेरी PendingIntent रजिस्टर है। किसी भी मदद के लिए धन्यवाद!

अद्यतन: 2 घंटे पहले यह 2 घंटों के अंतराल के साथ ट्रिगर करने के लिए काम करता था, लेकिन इसके बाद यह 1:20 घंटे के बाद ट्रिगर हुआ। यह वास्तव में अजीब हो रहा है। मैं एक लॉगफाइल के साथ ट्रिगर्स को ट्रैक कर दूंगा और इसे कल यहां पोस्ट करूंगा।

अद्यतन: PendingIntent हर 3 घंटे चलाने के लिए निर्धारित किया गया है। लेकिन

[2012-5-3 2:15:42 519] Updating Klasroosters 
[2012-5-3 4:15:15 562] Updating Klasroosters 
[2012-5-3 5:15:42 749] Updating Klasroosters 
[2012-5-3 8:15:42 754] Updating Klasroosters 
[2012-5-3 11:15:42 522] Updating Klasroosters 

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

+1

मैं आपकी समस्या को फिर से नहीं बना सकता। वास्तव में आप इसे 2 घंटे, 1 दिन भी अग्रिम करने के लिए 'स्टार्ट' कैसे बदलते हैं? – Sam

+1

मैंने लॉगफाइल जोड़ा और पाया कि शायद एक पुराना लंबित इंटेंट अभी भी चल रहा है। – Wezelkrozum

+0

मुझे भी वही समस्या है, क्या आपके पास कोई समाधान समाधान है? – david

उत्तर

1

कोई कैलेंडर का उपयोग कर आप को ध्यान में ले जा रहे हैं कि कैलेंडर सही मिल्ली सेकंड के लिए नीचे समय का उपयोग करता है। शायद आपको मिली दूसरा फ़ील्ड और सेकंड फ़ील्ड शून्य पर सेट करना चाहिए ताकि यह डॉट पर जा रहा हो।

इसके अलावा एक दिन के लिए यह इसके अलावा इस

Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(0); 
cal.add(Calendar.DAY_OF_MONTH, 1); 

उपयोग करने के लिए जब आप getInstance कि इसके बनाए जाने के लिए निर्धारित नहीं करता कैलेंडर समय उपयोग करती हैं इसलिए वहाँ करने के लिए किसी भी आवश्यकता नहीं होना चाहिए आसान होगा सही समय फिर से सेट करें?

+1

प्रलेखन में देख रहे हैं, SystemClock.elapsedRealtime() फोन बूट होने के बाद से वास्तविक समय नहीं है। इसके अलावा, मुझे नहीं लगता कि setTimeInMillis (0) कॉल जरूरी है, क्योंकि आप अब से 1 दिन अलार्म चाहते हैं, इकोच से 1 दिन नहीं (जो कि पहले की उम्र है)। –

+1

लेकिन मेरा मानना ​​है कि वह एक दिन के अंतराल के रूप में वास्तविक समय नहीं है? – FabianCook

+1

हाँ, लेकिन मुझे लगता है कि यह समस्या ट्रिगर समय के साथ है जो 'कैलेंडर' का उपयोग करके सेट की गई है। 1 दिन का अंतराल 'इंटीगर' का उपयोग करके परिभाषित किया गया है और ठीक होना चाहिए। –

1

पुनर्लेखन: मैं अंत में अपने त्रुटि देखा, लेकिन अप्रत्याशित रूप से। एक ही धारणा के रूप में आपको लगता है कि किसी भी तरह एक पुराने इरादे प्रसारित हो रहा है के तहत

PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

:

मैं इस बदल दिया:

PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

यह करने के लिए। मैं के बाद से अस्थायी ...

इसके अलावा एक बार ही मैंने देखा कि यह मेरे प्रारंभिक कॉल के दौरान थे नहीं देखा है। एक अन्य दृष्टिकोण current और previous कैलेंडर ऑब्जेक्ट को ट्रैक करने के लिए हो सकता है, यदि अंतराल आपके द्वारा अपेक्षित नहीं है तो इस "प्रारंभिक" प्रसारण को अनदेखा करें।(इस विधि पर विचार निरर्थक लगता है कैसे अलार्म चाहिए काम करते हैं, इस पर विचार करने के लिए कैसे अलार्म काम कर रहा है उन बाहरी कॉल्स को रोकने में मदद करता है ...)

आशा है कि मदद करता है, मैं अगर मैं लगता है आपको इसकी जानकारी देंगे और कुछ।

+1

आपके प्रयास के लिए धन्यवाद लेकिन मैंने इसे पहले से ही किया है। जब मैं इस डेटा का विश्लेषण करता हूं तो इसे समय पर लंबित इंटेंटेंट को ट्रिगर करना चाहिए, लेकिन ऐसा नहीं है। तो, यह समस्या है। – Wezelkrozum

+1

यह सुनकर खेद है ... जब आप नया डेटा पोस्ट करते हैं तो मुझे टैग करें, अगर मैं कर सकता हूं तो मैं मदद करूंगा। – Sam

+1

मैंने एक लॉगफाइल – Wezelkrozum

1

मुझे पता है कि यह प्रश्न थोड़ा पुराना है, लेकिन मुझे यह समस्या स्वयं ही थी। मुझे पता चला कि अगर मैंने विधि के बाहर कैलेंडर चर घोषित करने की कोशिश की, तो यह अच्छी तरह से खेल नहीं पाएगा और अलार्म जल्दी आग लगेंगे। चूंकि आपकी कक्षा छीन ली गई है, यह कहना मुश्किल है कि आप कहां कैलेंडर उदाहरण कह रहे हैं।

अगर मैं इसे सेट अप के रूप में है, तो यह सही समय पर सक्रिय होगा:

protected void nextAlarm(Context context, int seconds){ 
    Calendar nextAlarm = Calendar.getInstance(); 

    Intent intent = new Intent(context, MyClass.class); 
    PendingIntent pending = PendingIntent.getBroadcast(context, MainActivity.REPEATING_ALARM, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    AlarmManager amanager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    nextAlarm.add(Calendar.SECOND, seconds); 

    amanager.set(AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pending); 

} 
+1

ईमानदार होने के लिए मैं ठीक हूं कि यह ठीक नहीं है। मैं विधि के भीतर कैलेंडर बना रहा हूँ। लेकिन मुझे हमारे लंबित इंटेन्टेंट को पुनर्प्राप्त करने के तरीके में एक अंतर दिखाई देता है। जब आप getService विधि का उपयोग कर रहे हों, तो आप GetBroadcast विधि का उपयोग करें। – Wezelkrozum

1

सुनिश्चित करें कि आपके सेवा के onStartCommand रिटर्न START_NOT_STICKY करे, अन्यथा यह स्वचालित रूप से फिर से प्रयास किया जाएगा:

public class UpdateKlasRoostersService extends Service { 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     buildUpdate(); 
     return START_NOT_STICKY; 
    } 
} 
+1

क्या इसका मतलब है कि मेरी सेवा शुरू करने की कोशिश कर रही है? – Wezelkrozum

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

  • कोई संबंधित समस्या नहीं^_^