2011-09-02 11 views
6

मैं AlarmManager को क्रियान्वित किया है दिन में एक बार फोन जगाने के लिए, एक अद्यतन कार्य विजेट का अद्यतन करें और यदि लागू हो सूचनाएं भेजने के लिए के साथ दोहराया नहीं जाता है।एंड्रॉयड AlarmManager setRepeating लंबे अंतराल

मैं setRepeating और ELAPSED_REALTIME_WAKEUP अलार्म का उपयोग कर रहा पहली बार (SystemClock.elapsedRealtime()+60000) शुरू हो रहा है, लेकिन यह 86400000 मिलीसेकंड (24 घंटे) बाद में शुरू हो रहा प्राप्त करता है।

वाकई इस के साथ संघर्ष कर, मैं गलत या अगर कोई बेहतर तरीके मैं क्या करने की कोशिश कर रहा हूँ प्राप्त करने के लिए कर रहे हैं कुछ im कर स्वीकार करने के लिए खुश हूँ। हालांकि मुझे लगता है कि मेरा कोड मानक चीज की तरह दिखता है जो लोग ऐसा करते हैं।

यह लगभग दोहरा अलार्म की तरह है नहीं करता है यह क्या कहना है कि वह सभी मामलों में ऐसा करना चाहिए। अगर मैं 10 मिनट कहने के अंतराल को कम करता हूं तो यह काम करता है, मेरा अलार्म ट्रिगर होता है और सेवा खत्म हो जाती है।

मेरे ऐप की प्रकृति एक बार से अधिक अद्यतन करने का मतलब है एक दिन overkill है। मैं इस के लिए एक यथार्थवादी विश्वसनीय समाधान खोजने के लिए की जरूरत है।

अपना समय & के लिए धन्यवाद आशा है कि आप मुझे सही दिशा में बात कर सकते हैं।

यहाँ मेरी अलार्म कार्यान्वयन कोड है ...

मैनिफ़ेस्ट: बूट प्रसारण के लिए

<receiver android:name=".SystemChangeReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" /> 
    </intent-filter> 
</receiver> 
<receiver android:name=".UpdateAlarmReceiver" /> 
<service android:name=".UpdateService" /> 
<receiver android:name=".WidgetProviderSmall" android:label="@string/widget_small_label"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.appwidget.provider" 
     android:resource="@xml/appwidget_small" /> 
</receiver> 
<receiver android:name=".WidgetProviderLarge" android:label="@string/widget_large_label"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.appwidget.provider" 
     android:resource="@xml/appwidget_large" /> 
</receiver> 

SystemChangeReceiver सुनता है, चेकों एक अलार्म की जरूरत है स्थापित किया जाना है, अगर यह होता है, यह तय करता है।

SystemChangeReceiver:

@Override 
public void onReceive(Context context, Intent intent) { 

    SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.prefs_name), 0); 

    Boolean notifications = prefs.getBoolean("enable_updates", false); 
    if(notifications == true) { 
     Utils.setNotificationAlarm(context); 
    } 
} 

setNotificationAlarm विधि, दोहरा अलार्म सेट ...

public static void setNotificationAlarm(Context context) { 
     AlarmManager alarmManager=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

     Intent intent = new Intent(context, UpdateAlarmReceiver.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 

     alarmManager.setRepeating(
      AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime()+60000, 
      86400000, 
      pi); 
} 

अलार्म मेरी रिसीवर UpdateAlarmReceiver ट्रिगर होता है तो निर्णय लेता है कि क्या करना है और WakefulIntentService का उपयोग कर मेरी पृष्ठभूमि अद्यतन चलाता है प्रक्रिया, सेवा के लिए हैंडलर विजेट अपडेट करता है और आवश्यकतानुसार अधिसूचना भेजता है

UpdateAlarmReceiver:

public void onReceive(Context context, Intent intent) { 
    WakefulIntentService.sendWakefulWork(context, UpdateService.class); 
} 
+0

त्वरित प्रश्न यह सब हल कर सकता है: क्या आप एक कार्य हत्यारा का उपयोग करते हैं? क्या आपका ऐप श्वेतसूची पर है? –

+0

मैं वास्तव में ऑटोकिल्लर मेमोरी ऑप्टिमाइज़र का उपयोग कर रहा हूं, इसमें श्वेतसूची नहीं है यह समस्या हो सकती है? प्रक्रिया सूची के अनुसार मेरा ऐप अभी भी चल रहा है। – Rob

उत्तर

1

आप इसे दोहराना नहीं स्थापित करने की कोशिश की है। फिर जब यह बंद हो जाता है तो आप 24 घंटे बाद अगले एकल शॉट अलार्म सेट करते हैं? यह दोहराने वाले अलार्म की तरह काम करेगा लेकिन आप जो कुछ समस्याएं देख रहे हैं उससे बच सकते हैं।

+0

मैंने इसे नहीं माना है। मैंने सोचा था कि मूल रूप से क्या सेट किया गया था। हालांकि, मैं कोशिश करता हूं, धन्यवाद। – Rob

+0

मैंने अलार्म घड़ी के प्रकार का आवेदन किया और इस तरह मैंने इसे संभाला और ऐसा लगता है कि अगले दिन सही समय पर अलार्म एक्टिविटी को शुरू करने के लिए मुझे सही तरीके से संकेत दिया गया। मैंने कभी भी सेट रिपेटिंग() ध्वज का उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि यह क्यों काम नहीं करेगा, ऐसा लगता है कि इन दोनों दृष्टिकोणों को भी ऐसा ही करना चाहिए। क्या यह हो सकता है कि यह डिवाइस ट्रिगर होने पर डिवाइस को ठीक से जगा नहीं रहा है? – FoamyGuy

+0

मुझे लगता है कि यह WakefulIntentService' जो 'का उपयोग करता PowerManager.WakeLock' – Rob

2

कुछ भी स्पष्ट रूप से गलत नहीं है।

ऐसे ही एक लंबी अवधि के लिए है, हालांकि, मैं RTC_WAKEUP, सलाह देते हैं ताकि आप इसे नहीं बल्कि एक अर्द्ध से हर 24 घंटे से रात के बीच में या शायद एक उपयोगकर्ता के चयन के समय में होने के लिए, व्यवस्था कर सकते हैं यादृच्छिक प्रारंभ बिंदु। यह संभव है RTC_WAKEUP आपको बेहतर परिणाम देगा।

इसके अलावा:

  • WakefulIntentService साथ UpdateAlarmReceiver की onReceive() करने के लिए एक प्रवेश बयान जोड़े पुष्टि करने के लिए कि क्या आप सब पर नियंत्रण हो रही है, या समस्या है कि क्या (दम तोड़ देना!)।
  • अपनी अवधि को तेजी से बढ़ाने का प्रयास करें। चूंकि आप 10 मिनट काम करते हैं, एक घंटे का प्रयास करें, फिर चार घंटे, आदि, और जब यह टूट जाता है तो समझने की कोशिश करें।
  • "मैं वास्तव में ऑटोकिल्लर मेमोरी ऑप्टिमाइज़र का उपयोग कर रहा हूं, इसमें श्वेतसूची नहीं है यह समस्या हो सकती है? मेरा ऐप अभी भी प्रक्रिया सूची के अनुसार चल रहा है।" - मैं यह सुनिश्चित करने के लिए कि वे हस्तक्षेप नहीं कर रहे हैं, सभी कार्य हत्यारों को अक्षम कर देंगे।
+0

धन्यवाद मार्क, मैं पहले से ही विभिन्न स्थानों में प्रवेश करने, लंबे अंतराल के साथ अपने भी पूरा उपयोग नहीं कर अलार्म रिसीवर इतना यकीन है कि im जोड़ लिया है का उपयोग करते हुए' im ठीक जागने है, इसकी कहीं गलती पर अलार्म प्रबंधक। मैंने अब मेमोरी ऑप्टिमाइज़र को अक्षम कर दिया है, बीमार सभी अन्य सुझावों को आजमाएं। – Rob

+0

@Rob: केवल एक चीज जो मुझे पता है, एक अनुसूचित अलार्म से छुटकारा पायेगा: यदि आप इसे रद्द करते हैं, तो यदि उपयोगकर्ता बल सेटिंग ऐप में सेवाओं को प्रबंधित करने से रोकता है, या यदि कोई कार्य हत्यारा इसे रोकता है (और यह केवल 2.1 और इससे पहले की समस्या हो सकती है - मैं अलार्म को मिटा देने के लिए 'killBackgroundProcesses() 'की अपेक्षा नहीं करता, लेकिन मैं वहां गलत हो सकता हूं)। उम्मीद है कि आप पाएंगे कि ऑटोकिल्लर अपराधी था। – CommonsWare

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