Raz*_*riz 3 android alarmmanager
我一直在开发这个应用程序,该应用程序应该每天在给定时间运行(周末除外)。我使用了AlarmBroadCastReceiver在给定时间触发特定代码块。我的AlarmBroadCastReceiver班级中有这样的代码:
public void SetAlarm(Context context) {
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
intent.putExtra(ONE_TIME, Boolean.FALSE);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 2);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 0, pi);
}
Run Code Online (Sandbox Code Playgroud)
基本上我会尝试在那个时间设置一个重复闹钟。
然后按一下按钮,我就可以在 MainActivity 中调用它:
public void onStartAlarmClicked(View view){
Context context = this.getApplicationContext();
if(alarm != null){
Log.e(TAG, "starting alarm");
alarm.SetAlarm(context);
}else{
Log.e(TAG, "Alarm is null");
}
}
Run Code Online (Sandbox Code Playgroud)
其中alarm是类的对象AlarmBroadCastReceiver。
我遇到的问题是代码只触发一次。一旦到达 2:30,它就会开火。但是,当我将时间设置回 2:29 并等待 2:30,或者将日期向前设置 1 天,然后将时间设置为 2:20 并等待 2:30 时,代码不再触发。
我有一种感觉,我忽略了一些关于设置闹钟时间的相当简单的事情,但我现在看不到它。
从此答案中找到了更好的答案。稍微调整了一下。
public void Set12nnAlarm(Context context) {
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
intent.putExtra(ONE_TIME, Boolean.FALSE);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
// every day at 9 am
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
// if it's after or equal 9 am schedule for next day
if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 9) {
Log.e(TAG, "Alarm will schedule for next day!");
calendar.add(Calendar.DAY_OF_YEAR, 1); // add, not set!
}
else{
Log.e(TAG, "Alarm will schedule for today!");
}
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pi);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5442 次 |
| 最近记录: |