android - 警报管理器在特定时间设置每日警报?

标签 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);

}

基本上我会尝试在那个时间设置重复闹钟。

然后按下一个按钮,我在我的 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");
    }
}

其中 alarmAlarmBroadCastReceiver 类的对象。

我遇到的问题是代码只触发一次。一旦到达 2:30,它就会触发。但是,当我将时间设置回 2:29 并等待 2:30,或者将日期设置为提前 1 天然后将时间设置为 2:20 并等待 2:30 时,代码不再触发。

我觉得我忽略了一些关于设置闹钟时间的相当简单的东西,但我现在看不到它。

最佳答案

this answer.找到更好的答案稍微调整了一下。

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);
}

关于android - 警报管理器在特定时间设置每日警报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39092274/

相关文章:

android - 有没有办法在 PendingIntent 被触发时终止 Activity ?

android - 警报管理器未触发

android - 应用程序启动时的日期更改检测 - Android

android - 在 Android 中设置每月重复通知

android - 布局重力左右

android - 使用 Firebase 上传更新进度条

java - 如何将点击监听器添加到 Android/Java Textview 中的字符串中?

android - 试图将图片保存到尚未创建的特定图片文件夹

android - 如何将值从 Activity 传递到 Android 中的服务?

android - 在android中的特定时间后停止后台服务