2011-09-27 75 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

我解決了這個問題。在我的應用程序中,多重警報設置了不同的重複時間間隔。因此,在我的廣播接收器中發出警報,我根據預定要重複的時間重新安排警報。我使用日曆對象逐個添加月份和年份並重新設置爲下一個鬧鐘。我使用這樣的代碼(用於安排下個月) -

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

我已經低估了這個被接受的答案,因爲Laurent的答案其實是正確的答案。 –

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

感謝您的快速響應。在我的項目中,我使用廣播接收器來捕捉鬧鐘意圖。我不知道我怎麼能找出哪個鬧鐘的意圖在接收我的廣播receiver.then如何重新安排它?你能提供一些示例代碼嗎? – Hiral

+0

@Hiral:看我的編輯。 –

+0

該代碼似乎沒有工作。它一直告訴我添加一個返回語句public int onStartCommand。有任何想法嗎? –

3

要添加對洛朗的迴應。要從手動計算復發中抽象出來,我建議看看this RFC-2445 implementation。它在Android上運行良好,可以爲您節省很多痛苦。