既に説明したように、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 と呼ばれます。AlarmClock インスタンスに必要なセットアップ操作を実行する initClock() メソッドは、alarmTimer 変数を使用して 2 つの処理を行います。まず、Timer インスタンスが 0 ミリ秒待機し、タイマーイベントを 1 回だけトリガーするように指示するパラメーターを使用して、変数をインスタンス化します。 alarmTimer をインスタンス化した後、コードは変数の addEventListener() メソッドを呼び出し、変数の timer イベントを監視しようとしていることを示します。指定された時間が経過した後、timer イベントを送出することで、Timer インスタンスが動作します。AlarmClock クラスは、独自のアラームを鳴らすために、いつ timer イベントが送出されたかを知る必要があります。addEventListener() を呼び出すことで、AlarmClock コードは自分自身をリスナーとして alarmTimer に登録します。2 つのパラメーターは、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() メソッドが呼び出され、タイマーが停止され、既に実行されていた場合はリセットされます。次に、現在時刻(now 変数で表現)が alarmTime 変数の値から減算され、アラームを鳴らすまでに経過する時間がミリ秒単位で決定されます。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 イベントのリスナーとして使用するには、データ型が Event クラスのサブクラス TimerEvent(flash.events.TimerEvent)であるパラメーターを 1 つ定義する必要があります。Timer インスタンスはイベントリスナーを呼び出すときに、TimerEvent インスタンスをイベントオブジェクトとして渡します。