我想在我的应用中设置每月和每年的闹钟。我每周都这样做。 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
还有其他方法可以做到这一点吗?任何帮助表示赞赏。
答案 0 :(得分:17)
我认为,这种方法存在两个固有问题:
AlarmManager不会接受大的时间间隔,因为毫秒数会溢出参数
我不认为Alarms会在你的手机重启后存活下来,这种情况在很长一段时间内肯定会发生。
我建议您将每个警报存储在一个安全的地方,并使用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>
答案 1 :(得分:4)
我解决了这个问题。在我的应用程序中,多重警报设置了不同的重复时间间隔。所以在我的广播接收器中进行报警,我根据计划重复的时间重新安排警报。我使用日历对象按月添加月份和年份并再次设置它为下一个alarm.i使用这样的代码(为下个月安排它) -
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);
答案 2 :(得分:3)
添加Laurent的回复。要从手动计算重复计算中抽象,我建议您查看this RFC-2445 implementation。它在Android上运行良好,可以为您节省很多痛苦。