在BroadcastReceiver重新安排之前,AlarmManager会立即触发警报

时间:2016-01-06 22:19:55

标签: android broadcastreceiver alarmmanager

我有一个BroadcastReceiver,可以重新安排启动和时间变化等事件的警报。但是当时间超过警报的触发时间时(例如,当用户手动更改设置的时间时),AlarmManager会在我添加一天重新安排警报之前立即触发警报。我怎么能避免这个?

我目前正在使用Calendar的设置和添加方法来安排闹钟。

        for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) {
            if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek >= nowDay &&
                    !(dayOfWeek == nowDay && alarm.timeHour < nowHour) &&
                    !(dayOfWeek == nowDay && alarm.timeHour == nowHour && alarm.timeMinute <= nowMinute)) {

                calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
                alarmSet = true;
                break;
            }
        }

        if (!alarmSet) {
            for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) {
                if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek <= nowDay) {
                    calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
                    calendar.add(Calendar.WEEK_OF_YEAR, 1);
                    break;
                }
            }
        }

文档中也说明了这一点:

  

如果声明的触发时间是过去的,则会触发警报   立即

如何改变这种行为?

3 个答案:

答案 0 :(得分:4)

这是有意的。参见例如Set a Repeating Alarm

  

触发时间。如果您指定的触发时间是过去的,则会立即触发警报。

或相同的here

  

如果规定的触发时间是过去的,则会立即触发警报。

为避免这种情况,您必须在添加警报之前手动检查警报,

get "fileName" "/user/Images/fileName"
如果日期是过去的话,请在接收方中忽略它们。

答案 1 :(得分:0)

正如David所说,在使用之前预先检查警报日期/时间;如果它是在过去,那么在将其提供给AlarmManager之前添加一秒或一分钟或其他任何内容。

如果用户输入日期/时间,则以相同方式预先检查输入。

答案 2 :(得分:0)

如何创建BroadcastReceiver来听取时间变化。

Manifest文件中,

 <receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="android.intent.action.TIME_SET"/>
            </intent-filter>
 </receiver>

和您的BroadcastReceiver文件

public class MyReceiver extends BroadcastReceiver{

    @Override 
    public void onReceive(final Context context, Intent intent) {
        Log.d("MyReceiver", "Time Changed");
        // The times have changed; so have their signs.
        updateYourAlarm();
    } 
}