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

3

我一直在开发一个应用程序,它应该每天在规定的时间运行,但周末除外。我使用了一个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,或者将日期向前调整一天,然后将时间设置为2:20并等待2:30时,代码就不再触发了。

我感觉我可能忽略了设置闹钟时间的一些简单事情,但我现在看不到它。

2个回答

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

1
不需要使用calendar.setTimeInMillis(System.currentTimeMillis());吗?因为Calendar.getInstance()已经完成了这个操作? - Amos
抱歉,看起来应该是Calendar.DATE而不是Calendar.DAY_OF_YEAR? - Amos

2
你需要设置一个BroadcastReceiver监听时间和日期的变化,并重新设置闹钟。为了让接收器始终触发,最好在清单文件中设置。将类创建在自己的文件中。
public class DateTimeChangeReceiver extends BroadcastReceiver {
    @Override 
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (action.equals(Intent.ACTION_TIME_CHANGED) ||
            action.equals(Intent.ACTION_TIMEZONE_CHANGED) ||
            action.equals(Intent.ACTION_DATE_CHANGED))
        { 
            resetAlarm(); 
        } 
    } 
} 

在清单文件中,需要添加以下内容:
<receiver android:name=".DateTimeChangeReceiver ">
    <intent_filter>
            <action android:name="android.intent.action.TIMEZONE_CHANGED" />
            <action android:name="android.intent.action.TIME_SET" />
            <action android:name="android.intent.action.DATE_CHANGED" />
    </intent_filter>
</receiver>

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - dbmitch
@dbmitch 我添加了你建议的代码。我曾经假设StackOverflow内部的链接总是有效或更新的。 - lionscribe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接