如何实现年度和月度重复警报?

问题描述:

我想在我的应用程序中设置每月和每年的闹钟。我每周都这样做。 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

可用任何其他方式做到这一点?任何帮助赞赏。

我解决了这个问题。在我的应用程序中,多重警报设置了不同的重复时间间隔。因此,在我的广播接收器中发出警报,我根据预定要重复的时间重新安排警报。我使用日历对象逐个添加月份和年份并重新设置为下一个闹钟。我使用这样的代码(用于安排下个月) -

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的答案其实是正确的答案。 –

我认为,你有这个方法有两个固有的问题:

  • 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。有任何想法吗? –

要添加对洛朗的回应。要从手动计算复发中抽象出来,我建议看看this RFC-2445 implementation。它在Android上运行良好,可以为您节省很多痛苦。