chrome.alarms

说明

使用 chrome.alarms API 可安排代码在指定时间或未来某个时间定期运行。

权限

alarms

如需使用 chrome.alarms API,请在清单中声明 "alarms" 权限:

{
  "name": "My extension",
  ...
  "permissions": [
    "alarms"
  ],
  ...
}

概念和使用

为确保可靠的行为,了解 API 的行为方式很有帮助。

设备睡眠

设备处于休眠状态时,闹钟会继续运行。不过,闹钟不会唤醒设备。当设备唤醒时,所有错过的闹钟都会响铃。 重复闹钟最多会响一次,然后会根据指定的周期重新安排闹钟,从设备唤醒时开始计算,不考虑自最初设置闹钟运行以来已经过去的时间。

持久性

您可以使用 persistAcrossSessions 标志在创建时控制闹钟的持久性。此值可以设置为 true(持续存在,直到扩展程序更新)或 false(在扩展程序重新加载或浏览器重启时以及每次扩展程序更新时清除)。

其他浏览器和旧版 Chrome

其他浏览器(问题)或 Chrome 150 之前的 Chrome 版本不支持此属性,在这些浏览器或版本中,此属性的行为可能无法预测。因此,最好确保每次 Service Worker 启动时都有重要 alarm。例如:

async function checkAlarmState() {
  const alarm = await chrome.alarms.get("my-alarm");

  if (!alarm) {
    await chrome.alarms.create("my-alarm", { periodInMinutes: 1 });
  }
}

checkAlarmState();

如果闹钟是根据用户操作动态创建的,您可能需要在其他位置存储闹钟创建信息,以便在需要时重新创建闹钟。

示例

以下示例展示了如何使用和响应闹钟。如需试用此 API,请从 chrome-extension-samples 代码库中安装 Alarm API 示例

设置闹钟

以下示例在安装扩展程序的新版本时,在 Service Worker 中设置 alarm:

service-worker.js

chrome.runtime.onInstalled.addListener(async ({ reason }) => {
  // Create an alarm so we have something to look at in the demo
  await chrome.alarms.create('demo-default-alarm', {
    delayInMinutes: 1,
    periodInMinutes: 1,
    persistAcrossSessions: true
  });
});

响应闹钟

以下示例根据响铃闹钟的名称设置操作工具栏图标

service-worker.js

chrome.alarms.onAlarm.addListener((alarm) => {
  chrome.action.setIcon({
    path: getIconPath(alarm.name),
  });
});

类型

Alarm

属性

  • name

    字符串

    相应闹钟的名称。

  • periodInMinutes

    number 可选

    如果不为 null,则表示闹钟为重复闹钟,将在 periodInMinutes 分钟后再次触发。

  • persistAcrossSessions

    布尔值

    Chrome 150 及更高版本

    闹钟是否应在会话(浏览器重启)之间保持不变。

  • scheduledTime

    数值

    相应闹钟计划触发的时间,以自纪元以来的毫秒数表示(例如 Date.now() + n)。出于性能方面的考虑,闹钟可能会延迟任意时长。

AlarmCreateInfo

属性

  • delayInMinutes

    number 可选

    在多少分钟后触发 onAlarm 事件。

  • periodInMinutes

    number 可选

    如果设置了该值,则在 whendelayInMinutes 指定的初始事件之后,每隔 periodInMinutes 分钟应触发一次 onAlarm 事件。如果未设置,闹钟将仅响铃一次。

  • persistAcrossSessions

    布尔值 (可选)

    Chrome 150 及更高版本

    闹钟是否应在会话(浏览器重启)之间保持不变。在 Chrome 中,此值默认为 true,以匹配历史行为,但您应明确设置此值,以最大限度地提高跨浏览器的兼容性。

  • 什么时候

    number 可选

    闹钟应响铃的时间,以自纪元以来的毫秒数表示(例如 Date.now() + n)。

方法

clear()

chrome.alarms.clear(
  name?: string,
)
: Promise<boolean>

清除具有指定名称的闹钟。

参数

  • name

    字符串 可选

    要清除的闹钟的名称。默认为空字符串。

返回

  • Promise<boolean>

    Chrome 91 及更高版本

clearAll()

chrome.alarms.clearAll(): Promise<boolean>

清除所有闹钟。

返回

  • Promise<boolean>

    Chrome 91 及更高版本

create()

chrome.alarms.create(
  name?: string,
  alarmInfo: AlarmCreateInfo,
)
: Promise<void>

创建闹钟。在 alarmInfo 指定的时间附近,系统会触发 onAlarm 事件。如果存在另一个同名(或未指定名称)的闹钟,则该闹钟将被取消并替换为此闹钟。

为了减少用户机器上的负载,Chrome 将闹钟限制为最多每 30 秒触发一次,但可能会将闹钟延迟任意时长。也就是说,将 delayInMinutesperiodInMinutes 设置为小于 0.5 的值将不会生效,并会导致警告。when 可以设置为“现在”之后的不到 30 秒,而不会发出警告,但实际上至少要过 30 秒才会触发闹钟。

为了帮助您调试应用或扩展程序,当您以未打包的形式加载应用或扩展程序时,闹钟的触发频率不受限制。

参数

  • name

    字符串 可选

    用于标识相应闹钟的可选名称。默认为空字符串。

  • alarmInfo

    描述闹钟应在何时响铃。必须通过 whendelayInMinutes(但不能同时通过两者)指定初始时间。如果设置了 periodInMinutes,闹钟将在初始事件发生后每隔 periodInMinutes 分钟重复一次。如果未为重复闹钟设置 whendelayInMinutes,则 periodInMinutes 会用作 delayInMinutes 的默认值。

返回

  • Promise<void>

    Chrome 111 及更高版本

    在闹钟创建后解析的 Promise。

get()

chrome.alarms.get(
  name?: string,
)
: Promise<Alarm | undefined>

检索指定闹铃的详细信息。

参数

  • name

    字符串 可选

    要获取的闹钟的名称。默认为空字符串。

返回

  • Promise<Alarm | undefined>

    Chrome 91 及更高版本

getAll()

chrome.alarms.getAll(): Promise<Alarm[]>

获取所有闹钟的数组。

返回

  • Promise<Alarm[]>

    Chrome 91 及更高版本

事件

onAlarm

chrome.alarms.onAlarm.addListener(
  callback: function,
)

当闹钟时间已过时触发。适用于活动页面。

参数

  • callback

    函数

    callback 参数如下所示:

    (alarm: Alarm) => void