Wie bereits erwähnt, bezieht sich die einzige tatsächlich mit der AlarmClock-Klasse bereitgestellte Funktionalität auf das Festlegen der Weckzeit und das Auslösen des Weckalarms. Die integrierte Timer-Klasse (flash.utils.Timer) ermöglicht es Entwicklern, Programmcode festzulegen, der nach Ablauf einer bestimmten Zeit ausgeführt wird. Die AlarmClock-Klasse verwendet eine Timer-Instanz, um zu ermitteln, zu welchem Zeitpunkt der Weckalarm ausgelöst werden muss.
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);
}
Die in der AlarmClock-Klasse definierte Timer-Instanz trägt die Bezeichnung
alarmTimer
. Mit der
initClock()
-Methode, durch die die erforderlichen Initialisierungsvorgänge der AlarmClock-Instanz vorgenommen werden, wird die Variable
alarmTimer
in zwei Schritten vorbereitet. Zunächst wird die Variable mit Parametern instanziiert, durch die in der Timer-Instanz festgelegt wird, dass 0 Millisekunden gewartet und das Timer-Ereignis nur einmal ausgelöst wird. Nach dem Instanziieren von
alarmTimer
wird die
addEventListener()
-Methode dieser Variablen aufgerufen, um anzugeben, dass auf das
timer
-Ereignis dieser Variablen gewartet werden soll. Timer-Instanzen senden das entsprechende
timer
-Ereignis, nachdem eine festgelegte Zeit vergangen ist. Die AlarmClock-Klasse benötigt eine Benachrichtigung, zu welchem Zeitpunkt das
timer
-Ereignis ausgelöst wird, um den Weckalarm auszulösen. Durch Aufrufen von
addEventListener()
wird AlarmClock als Listener bei
alarmTimer
registriert. Die beiden Parameter geben an, dass die AlarmClock-Klasse auf das
timer
-Ereignis warten soll (mithilfe der Konstanten
TimerEvent.TIMER
) und dass beim Eintreten des Ereignisses als Reaktion die
onAlarm()
-Methode der AlarmClock-Klasse aufgerufen werden soll.
Um den Weckalarm festzulegen, wird die
setAlarm()
-Methode der AlarmClock-Klasse wie folgt aufgerufen:
/**
* 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;
}
Mit dieser Methode werden mehrere Vorgänge durchgeführt, darunter Speichern der Meldung für den Weckalarm und Erstellen eines Date-Objekts (
alarmTime
), das den genauen Zeitpunkt angibt, an dem der Weckalarm ausgelöst werden soll. Von größter Bedeutung sind die Festlegung und Aktivierung des Timers der Variablen
alarmTimer
, die in den letzten Programmzeilen der Methode erfolgen. Zuerst wird die
reset()
-Methode der Variablen aufgerufen, um den Timer anzuhalten und zurückzusetzen, falls er bereits aktiviert ist. Anschließend wird die aktuelle Uhrzeit (angegeben durch die Variable
now
) vom Wert der Variablen
alarmTime
subtrahiert, um zu ermitteln, wie viele Millisekunden vergehen sollen, bevor der Weckalarm ausgelöst wird. Das
timer
-Ereignis der Timer-Klasse wird nicht zu einem absoluten Zeitpunkt ausgelöst. Deshalb wird der
delay
-Eigenschaft von
alarmTimer
diese relative Zeitdifferenz zugewiesen. Schließlich wird die
start()
-Methode aufgerufen, um den Timer zu starten.
Nachdem die angegebene Zeit vergangen ist, löst
alarmTimer
das
timer
-Ereignis aus. Da die
onAlarm()
-Methode der AlarmClock-Klasse als Listener für dieses Ereignis registriert ist, wird beim Eintreten des
timer
-Ereignisses
onAlarm()
aufgerufen.
/**
* 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);
}
Eine als Ereignis-Listener registrierte Methode muss mit der richtigen Signatur (Anzahl und Typ der Parameter sowie Rückgabetyp der Methode) definiert werden. Als Listener für das
timer
-Ereignis der Timer-Klasse muss für eine Methode ein Parameter des Datentyps „TimerEvent“ (flash.events.TimerEvent) definiert sein, einer Unterklasse der Event-Klasse. Wenn die Timer-Instanz die zugehörigen Ereignis-Listener aufruft, wird als Ereignisobjekt eine TimerEvent-Instanz übergeben.