如前所述,AlarmClock 类实际提供的唯一功能与设置和触发闹铃有关。内置的 Timer 类 (flash.utils.Timer) 为开发人员提供了定义要在指定时间之后执行的代码的方法。AlarmClock 类使用 Timer 实例来确定何时触发闹铃。
import flash.events.TimerEvent;
import flash.utils.Timer;
/**
* The Timer that will be used for the alarm.
*/
public var alarmTimer:Timer;
...
/**
* Instantiates a new AlarmClock of a given size.
*/
public override function initClock(faceSize:Number = 200):void
{
super.initClock(faceSize);
alarmTimer = new Timer(0, 1);
alarmTimer.addEventListener(TimerEvent.TIMER, onAlarm);
}
AlarmClock 类中定义的 Timer 实例被命名为
alarmTimer
。
initClock()
方法执行 AlarmClock 实例的所需设置操作,使用
alarmTimer
变量执行两个任务。首先,使用指示 Timer 实例等待 0 毫秒且仅触发其 timer 事件一次的参数实例化变量。实例化
alarmTimer
后,代码调用变量的
addEventListener()
方法,指示它要监听该变量的
timer
事件。Timer 实例的工作方式是:在经过指定时间后调度其
timer
事件。AlarmClock 类需要了解何时调度
timer
事件,以便触发自己的闹铃。通过调用
addEventListener()
,AlarmClock 代码将自身作为侦听器在
alarmTimer
中进行注册。两个参数指示 AlarmClock 类要侦听
timer
事件(由常量
TimerEvent.TIMER
指示),并且当事件发生时,应调用 AlarmClock 类的
onAlarm()
方法以响应事件。
为了实际设置闹铃,代码调用了 AlarmClock 类的
setAlarm()
方法,如下所示:
/**
* Sets the time at which the alarm should go off.
* @param hour The hour portion of the alarm time.
* @param minutes The minutes portion of the alarm time.
* @param message The message to display when the alarm goes off.
* @return The time at which the alarm will go off.
*/
public function setAlarm(hour:Number = 0, minutes:Number = 0, message:String = "Alarm!"):Date
{
this.alarmMessage = message;
var now:Date = new Date();
// Create this time on today's date.
alarmTime = new Date(now.fullYear, now.month, now.date, hour, minutes);
// Determine if the specified time has already passed today.
if (alarmTime <= now)
{
alarmTime.setTime(alarmTime.time + MILLISECONDS_PER_DAY);
}
// Stop the alarm timer if it's currently set.
alarmTimer.reset();
// Calculate how many milliseconds should pass before the alarm should
// go off (the difference between the alarm time and now) and set that
// value as the delay for the alarm timer.
alarmTimer.delay = Math.max(1000, alarmTime.time - now.time);
alarmTimer.start();
return alarmTime;
}
此方法执行了几项操作,包括存储闹铃消息和创建一个 Date 对象 (
alarmTime
),该对象表示触发闹铃的实际时间。在该方法的最后几行中,与当前讨论最相关的操作是设置和激活了
alarmTimer
变量的计时器。首先,调用其
reset()
方法,如果计时器已运行,则将其停止并进行重置。接下来,从
alarmTime
变量值中减去当前时间(由
now
变量表示),以确定需要经过多少毫秒后才会触发闹铃。Timer 类并不会在某个绝对时间触发其
timer
事件,因此,分配给
alarmTimer
的
delay
属性的是该相对时间差。最后,调用
start()
方法以实际启动计时器。
一旦经过指定时间,
alarmTimer
将调度
timer
事件。由于 AlarmClock 类已将其
onAlarm()
方法注册为该事件的侦听器,因此发生
timer
事件时,将调用
onAlarm()
。
/**
* Called when the timer event is dispatched.
*/
public function onAlarm(event:TimerEvent):void
{
trace("Alarm!");
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage);
this.dispatchEvent(alarm);
}
注册为事件侦听器的方法必须使用适当的签名(即,方法的参数集和返回类型)来定义。若要侦听 Timer 类的
timer
事件,方法必须定义一个数据类型为 TimerEvent (flash.events.TimerEvent) 的参数,该参数是 Event 类的子类。当 Timer 实例调用其事件侦听器时,会传递一个 TimerEvent 实例作为事件对象。