앞에서 설명했듯이 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밀리초 동안 대기한 후 타이머 이벤트를 한 번 트리거하도록 지시하는 매개 변수를 사용하여 변수가 인스턴스화되고,
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
이벤트에 대한 리스너로 등록할 메서드는 데이터 유형이 Event 클래스의 하위 클래스인 TimerEvent(flash.events.TimerEvent)로 설정된 하나의 매개 변수를 정의해야 합니다. 그러면 Timer 인스턴스에서 이벤트 리스너를 호출하는 경우 TimerEvent 인스턴스가 이벤트 객체로 전달됩니다.