2011-09-27 48 views
6

मैं अपने ऐप में मासिक और वार्षिक अलार्म सेट करना चाहता हूं। मैंने साप्ताहिक के लिए यह किया था। AlarmManager.INTERVAL_DAY ने इसके लिए मेरी मदद की। लेकिन मुझे मासिक और वार्षिक दोहराने के लिए अच्छा तरीका नहीं मिला।सालाना और मासिक दोहराव अलार्म कैसे कार्यान्वित करें?

अब तक खोजे गए:

http://www.satyakomatineni.com/akc/display?url=displaynoteimpurl&ownerUserId=satya&reportId=3503

http://groups.google.com/group/android-developers/browse_thread/thread/9f946e40307073c4?pli=1

उपलब्ध किसी भी अन्य तरीका यह है है? किसी भी मदद की सराहना की।

उत्तर

3

मैंने इस मुद्दे को हल किया। मेरे ऐप में, मल्टीपाल अलार्म अलग-अलग दोहराने वाले समय अंतराल के साथ सेट किए गए थे। इसलिए अलार्म के लिए मेरे प्रसारण रिसीवर में, मैंने अलार्म को फिर से निर्धारित किया कि किस समय इसे दोहराया जाना था। मैंने कैलेंडर ऑब्जेक्ट का उपयोग महीने और वर्ष को जोड़ने के लिए किया और फिर से सेट के लिए अगले alarm.i इस तरह कोड का इस्तेमाल किया (अगले महीने के लिए यह समय निर्धारण के लिए) - त्वरित response.In अपने प्रोजेक्ट के लिए

PendingIntent sender = PendingIntent.getBroadcast(context,Integer.parseInt(Long.toString(id)), intent1, 0);        

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(calendar.getTimeInMillis()); 
calendar.add(Calendar.SECOND, 30); 

AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

calendar.add(Calendar.MONTH, 1); 

am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender); 
+0

मैंने इस स्वीकृत उत्तर को कम कर दिया है, क्योंकि लॉरेन से जवाब वास्तव में सही है। –

17

मुझे लगता है कि आप इस दृष्टिकोण के साथ दो निहित मुद्दे हैं:

  • AlarmManager बड़े समय अंतराल को स्वीकार नहीं करेगा क्योंकि मिली सेकंड की संख्या तर्क

  • अतिप्रवाह होगा मैं अलार्म नहीं लगता कि आपके फोन के रीबूट से बच जाएगा जो निश्चित रूप से इतनी लंबी अवधि के दौरान होगा।

मैं सलाह है कि आप एक सुरक्षित जगह में प्रत्येक अलार्म की दुकान और जांच करने के लिए AlarmManager और ONBOOT रिसीवर के संयोजन का उपयोग करता है, तो अपनी सूची से अलार्म में से एक यह बहुत ही दिन निकाल दिया जाना चाहिए और सिर्फ जगाने के लिए एक अलार्म को पुनर्निर्धारित कल अगर आप कोई नहीं करते हैं।

public class AlarmService extends Service { 
    //compat to support older devices 
    @Override 
    public void onStart(Intent intent, int startId) { 
     onStartCommand(intent, 0, startId); 
    } 


    @Override 
    public int onStartCommand (Intent intent, int flags, int startId){ 
    //your method to check if an alarm must be fired today 
    checkForTodayAlarmsAndBehaveAppropriately(); 

    //reschedule me to check again tomorrow 
    Intent serviceIntent = new Intent(AlarmService.this,AlarmService.class); 
    PendingIntent restartServiceIntent = PendingIntent.getService(AlarmService.this, 0, serviceIntent,0); 
    AlarmManager alarms = (AlarmManager)getSystemService(ALARM_SERVICE); 
    // cancel previous alarm 
    alarms.cancel(restartServiceIntent); 
    // schedule alarm for today + 1 day 
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.DATE, 1); 

    // schedule the alarm 
    alarms.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), restartServiceIntent); 
    } 

} 

बूट समय उपयोग में आपकी सेवा शुरू करने के लिए इस:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class serviceAutoLauncher extends BroadcastReceiver{ 

@Override 
    public void onReceive(Context context, Intent intent) { 
     Intent serviceIntent = new Intent(context,AlarmService.class); 
     context.startService(serviceIntent); 
    } 

} 

अंत में अपने serviceAutoLauncher शेड्यूल करने के लिए प्रत्येक बूट पर शुरू होने की अपनी प्रकट करने के लिए इस जोड़ें:

<receiver android:name="serviceAutoLauncher"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
      <category android:name="android.intent.category.HOME"></category> 
     </intent-filter> 
    </receiver> 
+0

धन्यवाद, मैं एक प्रसारण रिसीवर का उपयोग कर रहा अलार्म इरादे को पकड़ने के लिए। मुझे नहीं पता कि मैं कैसे पता लगा सकता हूं कि मेरे प्रसारण रिसीवर के बारे में किस अलार्म का इरादा पकड़ लिया गया है। तो मैं इसे कैसे पुन: निर्धारित कर सकता हूं? क्या आप कुछ नमूना कोड प्रदान कर सकते हैं? – Hiral

+0

@ हिरल: मेरा संपादन देखें। –

+0

कोड काम नहीं कर रहा है। यह मुझे सार्वजनिक intStartCommand पर सार्वजनिक विवरण में एक वापसी कथन जोड़ने के लिए कहता रहता है। कोई विचार? –

3

को जोड़ने के लिए लॉरेन की प्रतिक्रिया के लिए। मैन्युअल रूप से पुनरावृत्ति की गणना से अमूर्त करने के लिए मैं this RFC-2445 implementation पर एक नज़र डालने का सुझाव देता हूं। यह एंड्रॉइड पर ठीक काम करता है और आपको बहुत दर्द बचा सकता है।

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