chrome.alarms

Descrição

Use a API chrome.alarms para programar a execução do código periodicamente ou em um horário especificado no futuro.

Permissões

alarms

Para usar a API chrome.alarms, declare a permissão "alarms" no manifesto:

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

Conceitos e uso

Para garantir um comportamento confiável, é útil entender como a API funciona.

Modo de espera do dispositivo

Os alarmes continuam tocando enquanto um dispositivo está em modo de espera. No entanto, um alarme não vai ativar um dispositivo. Quando o dispositivo for ativado, todos os alarmes perdidos serão disparados. Os alarmes recorrentes serão disparados no máximo uma vez e depois serão reagendados usando o período especificado a partir do momento em que o dispositivo é ativado, sem levar em consideração o tempo já decorrido desde que o alarme foi originalmente definido para ser executado.

Persistência

Os alarmes geralmente persistem até que uma extensão seja atualizada. No entanto, isso não é garantido, e os alarmes podem ser cancelados quando o navegador é reiniciado. Portanto, considere definir um valor no armazenamento quando um alarme for criado e verifique se ele existe sempre que o service worker for iniciado. Exemplo:

const STORAGE_KEY = "user-preference-alarm-enabled";

async function checkAlarmState() {
  const { alarmEnabled } = await chrome.storage.get(STORAGE_KEY);

  if (alarmEnabled) {
    const alarm = await chrome.alarms.get("my-alarm");

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

checkAlarmState();

Exemplos

Os exemplos a seguir mostram como usar e responder a um alarme. Para testar essa API, instale o exemplo da API Alarm no repositório chrome-extension-samples (link em inglês).

Definir um alarme

O exemplo a seguir define um alarme no service worker quando a extensão é instalada:

service-worker.js:

chrome.runtime.onInstalled.addListener(async ({ reason }) => {
  if (reason !== 'install') {
    return;
  }

  // Create an alarm so we have something to look at in the demo
  await chrome.alarms.create('demo-default-alarm', {
    delayInMinutes: 1,
    periodInMinutes: 1
  });
});

Responder a um alarme

O exemplo a seguir define o ícone da barra de ferramentas de ação com base no nome do alarme que disparou.

service-worker.js:

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

Tipos

Alarm

Propriedades

  • nome

    string

    Nome do alarme.

  • periodInMinutes

    number optional

    Se não for nulo, o alarme será recorrente e vai tocar novamente em periodInMinutes minutos.

  • scheduledTime

    número

    Hora em que o disparo do alarme foi programado, em milissegundos após a época (por exemplo, Date.now() + n). Por motivos de desempenho, o alarme pode ter sido atrasado em uma quantidade arbitrária além disso.

AlarmCreateInfo

Propriedades

  • delayInMinutes

    number optional

    Período em minutos após o qual o evento onAlarm deve ser disparado.

  • periodInMinutes

    number optional

    Se definido, o evento onAlarm será disparado a cada periodInMinutes minutos após o evento inicial especificado por when ou delayInMinutes. Se não for definido, o alarme vai tocar apenas uma vez.

  • quando

    number optional

    O momento em que o alarme deve disparar, em milissegundos após o período (por exemplo, Date.now() + n).

Métodos

clear()

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

Limpa o alarme com o nome especificado.

Parâmetros

  • nome

    string opcional

    O nome do alarme a ser desativado. O padrão é uma string vazia.

Retorna

  • Promise<boolean>

    Chrome 91+

clearAll()

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

Limpa todos os alarmes.

Retorna

  • Promise<boolean>

    Chrome 91+

create()

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

Cria um alarme. Perto dos horários especificados por alarmInfo, o evento onAlarm é acionado. Se houver outro alarme com o mesmo nome (ou sem nome, se nenhum for especificado), ele será cancelado e substituído por este.

Para reduzir a carga na máquina do usuário, o Chrome limita os alarmes a no máximo uma vez a cada 30 segundos, mas pode atrasá-los em uma quantidade arbitrária. Ou seja, definir delayInMinutes ou periodInMinutes como um valor menor que 0.5 não será aceito e vai gerar um aviso. when pode ser definido para menos de 30 segundos após "agora" sem aviso, mas não vai disparar o alarme por pelo menos 30 segundos.

Para ajudar você a depurar seu app ou extensão, quando ele é carregado descompactado, não há limite para a frequência com que o alarme pode ser acionado.

Parâmetros

  • nome

    string opcional

    Nome opcional para identificar o alarme. O padrão é uma string vazia.

  • alarmInfo

    Descreve quando o alarme deve ser acionado. O horário inicial precisa ser especificado por when ou delayInMinutes, mas não ambos. Se periodInMinutes estiver definido, o alarme vai se repetir a cada periodInMinutes minutos após o evento inicial. Se nem when nem delayInMinutes estiverem definidos para um alarme recorrente, periodInMinutes será usado como padrão para delayInMinutes.

Retorna

  • Promise<void>

    Chrome 111 ou mais recente

get()

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

Recupera detalhes sobre o alarme especificado.

Parâmetros

  • nome

    string opcional

    O nome do alarme a ser recebido. O padrão é uma string vazia.

Retorna

  • Promise<Alarm | undefined>

    Chrome 91+

getAll()

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

Recebe uma matriz de todos os alarmes.

Retorna

  • Promise<Alarm[]>

    Chrome 91+

Eventos

onAlarm

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

Disparado quando um alarme expira. Útil para páginas de eventos.

Parâmetros

  • callback

    função

    O parâmetro callback tem esta aparência:

    (alarm: Alarm) => void