闹钟管理器在特定时间设置每日闹钟?

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 时,代码不再触发。

我有一种感觉,我忽略了一些关于设置闹钟时间的相当简单的事情,但我现在看不到它。

Raz*_*riz 5

从此答案中找到了更好的答案稍微调整了一下。

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)