WebAPI/AlarmAPI
Alarm API Specification
Goals
To provide DOM API access to the system alarm settings, which can schedule a notification or for an application to be started at a specific time. For example, some applications like Alarm Clock, Calendar or E-Mail might need to utilize the Alarm API to wake up the sytem and trigger particular behaviors at specified time points.
Contents
Status
See bug 749551 for the Alarm API implementation.
Proposers
Mounir Lamouri, Kan-Ru Chen and Jonas Sicking
Contributors
- Alarm API: Gene Lian (IRC: genelian)
- System Message Handler: Fabrice Desré
Features
The Alarm API supports the following features:
- Web applications can add multiple alarms and get a returned ID for each of them.
- The returned ID is unique and can be further used to specify and remove the added alarm.
- Web applications can pass a customized JSON object data to descirbe more details about each alarm setting.
- When the alarm goes off, an alarm message will be fired and can be handled by the System Message Handler.
- All the alarms that have been added can be automatically restored after rebooting the system.
- Alarm API actually does more than setTimeout because it can actively *wake up* the system from sleeping.
- Whenever the system clock or timezone is adjusted at run-time, all the saved alarms will be rescheduled.
Proposed API
There is an object in window.navigator
named mozAlarms
with the following interface:
partial interface Navigator { readonly attribute AlarmsManager mozAlarms; };
interface AlarmsManager { DOMRequest getAll(); DOMRequest add(in jsval date, in DOMString respectTimezone, [optional] in jsval data); void remove(in unsigned long id); };
- Regarding the
navigator.add(...)
, the first argumentdate
can be passed by a Date object and the second argumentrespectTimezone
can be passed by either"honorTimezone"
or"ignoreTimezone"
to specify if we need to ignore the timezone information of that Date object. When"honorTimezone"
is passed, we will alert that application when that time happens in that timezone. I.e. if someone passes a Date object which has the timezone set to US Pacific Time and time set to 7am, we will alert the application when the time is 7am in the US Pacific timezone, even if the user is in New York and thus in US Eastern Time and it's 10am for the user. When"ignoreTimezone"
is passed, we will ignore the timezone part of the passed in Date object. I.e. if someone passes a Date object which has the timezone set to US Pacific Time and time set to 7am, we will alert the application when the time is 7am in whatever timezone the user happens to be in. So if the user is in New York, we will alert the user when it's 7am in that timezone. The third argumentdata
can be optionally specified to pass the customized JSON object data, carrying more details about that alarm setting. Finally, a unique ID will be returned to specify the added alarm.
- We can use
navigator.remove(...)
to remove an alarm that has been added in the system with a unique ID.
- We can use
navigator.getAll()
to retrieve the information of each alarm that has been added in the system, including the unique ID, the customized JSON object data and the setting time (respects to the timezone or not)... etc.
Examples
Example use of the Alarm API for adding, getting and removing and listening to alarms in the applications:
- How to add an
"ignoreTimezone"
alarm?
var alarmId1; var request = navigator.mozAlarms.add(new Date("May 15, 2012 16:20:00"), "ignoreTimezone", { mydata: "bar" }); request.onsuccess = function (e) { alarmId1 = e.target.result; }; request.onerror = function (e) { alert(e.target.error.name); };
- How to add an
"honorTimezone"
alarm?
var alarmId2; var request = navigator.mozAlarms.add(new Date("June 29, 2012 07:30:00"), "honorTimezone", { mydata: "foo" }); request.onsuccess = function (e) { alarmId2 = e.target.result; }; request.onerror = function (e) { alert(e.target.error.name); };
- How to retrieve the information of added alarms?
var request = navigator.mozAlarms.getAll(); request.onsuccess = function (e) { alert(JSON.stringify(e.target.result)); }; request.onerror = function (e) { alert(e.target.error.name); };
- How to remove the added alarms?
navigator.mozAlarms.remove(alarmId1); navigator.mozAlarms.remove(alarmId2);
- How to listen to the
"alarm"
message and handle it with a callback function when the alarm goes off?
navigator.mozSetMessageHandler("alarm", function (message) { alert("alarm fired: " + JSON.stringify(message)); });
- How to know in advance if there exists any pending
"alarm"
messages?
navigator.mozHasPendingMessage("alarm");
FAQ
- Why the callback function set by
mozSetMessageHandler("alarm", function (message) { ... })
doesn't work when an alarm goes off?- You have to add a
messages
property in the application's manifest. Themessages
property is used to register the application as a potential target for catching certain types of messages, whilemozSetMessageHandler(...)
actually sets up the callback function that handles them. If you just callmozSetMessageHandler(...)
without registering the"alarm"
message previously, you won't receive it when an alarm goes off. Therefore, you have to add amessages
property for registering the"alarm"
message like below:
- You have to add a
"messages": [ { "alarm": "/index.html" } ]
- I've already added a
messages
property for registering the"alarm"
message and set the system message handler for handling that. Why can't I receive that when the alarm goes off?- Note that the Alarm API works in such a way that it can only deliver the
"alarm"
message to the page that called theadd(...)
. For example, if you calladd(...)
from path_1/index.html but set a system message handler for path_2/index.html, the path_2/index.html cannot receive the alarms added in path_1/index.html (bug 800431).
- Note that the Alarm API works in such a way that it can only deliver the
- Does the
getAll(...)
return the alarms that were not added by its belonging application? For example, if the Alarm Clock app calls thegetAll(...)
, will the alarms added by the Calendar app also be returned?- No, the
getAll(...)
only returns the alarms scheduled by the application.
- No, the
- Similarly, how about the
remove(...)
? Can an application delete the alarms added by other applications?- No, the Alarm API can only interact with alarms scheduled by the same app.
- Supposing an alarm is set at 8:00am, but the device shuts down from 7:00am to 9:00am. Will the Alarm API fire an
"alarm"
message for that when the device powers up next time?- Yes, it will fire as soon as the device powers up.
- Does the
getAll(...)
return the alarms that have already been fired? Or the back-end will keep them before theremove(...)
is explicitly called?- The back-end won't keep the fired alarms, which means only alarms that have not fired will be returned.
- Why?
- Answer.
Clients
Applications using the Alarm API:
Articles
Articles mentioning / discussing the Alarm API:
- mozilla.dev.webapi: Do we need an Alarm API?
- mozilla.dev.webapi: System Intents
Related
Android references:
Android sources:
- android_alarm.h
- AlarmManager.java
- AlarmManagerService.java
- com_android_server_AlarmManagerService.cpp
See Also
Other Web APIs related to the Alarm API:
- WebAPI
- WebAPI/CalendarAPI
- bug 755245 for the System Message Handler implementation.