2011-09-27 12 views
6

Chcę ustawić miesięczny i roczny alarm w mojej aplikacji. Robiłem to co tydzień. AlarmManager.INTERVAL_DAY pomógł mi w tym. Ale nie mogłem znaleźć dobrego sposobu na comiesięczne i roczne powtarzanie.Jak wdrażać powtarzające się alarmy roczne i miesięczne?

Szukano tak daleko:

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

Czy jakikolwiek inny sposób dostępne, aby to zrobić? Każda pomoc doceniona.

Odpowiedz

3

Rozwiązałem problem. W mojej aplikacji ustawiono alarmy wielowierszowe z różnymi powtarzającymi się interwałami czasowymi. W moim odbiorniku telewizyjnym dla alarmu, ponownie zaplanowałem alarm na podstawie tego, o której godzinie miał być powtarzany. Użyłem obiektu kalendarza, aby dodać miesiąc i rok w sposób harmonijny i ponownie ustawić go na następny alarm.i użyć takiego kodu (dla zaplanowania go na następny miesiąc) -

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

Zignorowałem tę zaakceptowaną odpowiedź, ponieważ odpowiedź od Laurenta jest rzeczywiście poprawna. –

17

myślę, że masz dwa nieodłączne problemy z tego podejścia:

  • AlarmManager nie przyjmuje dużych odstępach czasowych, ponieważ liczba Millis wyleje argument

  • Nie sądzę Alarmy przetrwa ponowne uruchomienie telefonu, które na pewno nastąpi w tak długim okresie czasu.

I rada jaką można przechowywać każdy alarm w bezpiecznym miejscu i użyć kombinacji AlarmManager i onBoot odbiorników, aby sprawdzić, czy musi być zwolniony jeden z alarmów z listy tego samego dnia i po prostu przełożyć alarm obudzić wstajesz jutro, jeśli nic nie masz.

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); 
    } 

} 

Aby uruchomić usługę w użytku czasie startu to:

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); 
    } 

} 

koniec dodać to do Twojego manifest zaplanować serviceAutoLauncher być uruchomiony na każdym boot:

<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

Dzięki za szybką reakcję. W moim projekcie używam odbiornika radiowego do wychwytywania alarmu. Nie wiem, jak mogę dowiedzieć się, które intencje alarmu są wykrywane w sieci odbiornika radiowego. Jak mogę to zmienić? czy możesz podać przykładowy kod? – Hiral

+0

@Hiral: zobacz moją edycję. –

+0

Kod wydaje się nie działać. Ciągle mówi mi, dodaj instrukcję return do publicznej int onStartCommand. Jakieś pomysły? –

3

Aby dodać na odpowiedź Laurenta. Aby abstrahować od ręcznego obliczania powtarzalności, sugeruję, aby przyjrzeć się this RFC-2445 implementation. Działa dobrze na Androidzie i może zaoszczędzić Ci wiele bólu.

Powiązane problemy