Nesta etapa, você vai aprender:
- Como ativar o app em intervalos especificados para executar tarefas em segundo plano.
- Como usar as notificações na tela para chamar a atenção para algo importante.
Tempo estimado para concluir esta etapa: 20 minutos. Para visualizar o que você concluirá nesta etapa, acesse a parte inferior desta página ↓.
Melhore seu app Todo com lembretes
Aprimore o app Todo adicionando funcionalidades para lembrar o usuário se ele tiver tarefas abertas, mesmo quando o app estiver fechado.
Primeiro, você precisa adicionar uma maneira de o app verificar regularmente se há tarefas não finalizadas. Em seguida, o app precisa mostrar uma mensagem para o usuário, mesmo que a janela do app Todo esteja fechada. Para isso, você precisa entender como os alarmes e as notificações funcionam nos Aplicativos do Google Chrome.
Adicionar alarmes
Use chrome.alarms para definir um intervalo de ativação. Enquanto o Chrome estiver em execução, o listener do alarme
é chamado aproximadamente no intervalo definido.
Atualizar as permissões de aplicativos
Em manifest.json, solicite a permissão "alarms":
"permissions": ["storage", "alarms"],
Atualizar scripts em segundo plano
Em background.js, adicione um listener onAlarm. Por enquanto, a função de callback só vai registrar
uma mensagem para o Console sempre que houver um item de tarefa:
chrome.app.runtime.onLaunched.addListener(function() {
chrome.app.window.create('index.html', {
id: 'main',
bounds: { width: 620, height: 500 }
});
});
chrome.alarms.onAlarm.addListener(function( alarm ) {
console.log("Got an alarm!", alarm);
});
Atualizar visualização HTML
Em index.html, adicione um botão Ativar alarme:
<footer id="info">
<button id="toggleAlarm">Activate alarm</button>
...
</footer>
Agora você precisa escrever o manipulador de eventos JavaScript para esse novo botão. Lembre-se da Etapa 2 que uma das não conformidades mais comuns de CSP é causada pelo JavaScript inline. Em index.html, adicione este para importar um novo arquivo alarms.js que você criará na etapa seguinte:
</footer>
...
<script src="js/app.js"></script>
<script src="js/alarms.js"></script>
</body>
Criar script de alarmes
Crie um novo arquivo na pasta js com o nome alarms.js.
Use o código abaixo para adicionar checkAlarm(), createAlarm(), cancelAlarm() e toggleAlarm()
, junto com um manipulador de eventos de clique para alternar o alarme quando o botão Ativar alarme for
clicado.
(function () {
'use strict';
var alarmName = 'remindme';
function checkAlarm(callback) {
chrome.alarms.getAll(function(alarms) {
var hasAlarm = alarms.some(function(a) {
return a.name == alarmName;
});
var newLabel;
if (hasAlarm) {
newLabel = 'Cancel alarm';
} else {
newLabel = 'Activate alarm';
}
document.getElementById('toggleAlarm').innerText = newLabel;
if (callback) callback(hasAlarm);
})
}
function createAlarm() {
chrome.alarms.create(alarmName, {
delayInMinutes: 0.1, periodInMinutes: 0.1});
}
function cancelAlarm() {
chrome.alarms.clear(alarmName);
}
function doToggleAlarm() {
checkAlarm( function(hasAlarm) {
if (hasAlarm) {
cancelAlarm();
} else {
createAlarm();
}
checkAlarm();
});
}
$$('#toggleAlarm').addEventListener('click', doToggleAlarm);
checkAlarm();
})();
Atualize seu app e aguarde alguns instantes para ativar (e desativar) o alarme.

Sempre que o alarme estiver ativado, você verá mensagens de registro impressas no console sempre que o alarme "tocar":

Você vai notar que:
- Mesmo quando você fecha a janela do app Todo, os alarmes continuam chegando.
- Em outras plataformas que não o ChromeOS, se você fechar completamente todas as instâncias do navegador Chrome, alarmes não serão acionadas.
Vamos examinar algumas partes em alarms.js que usam métodos chrome.alarms, um por um.
Criar alarmes
Em createAlarm(), use a API chrome.alarms.create() para criar um alarme quando Ativar
alarme for ativado.
chrome.alarms.create(alarmName, {delayInMinutes: 0.1, periodInMinutes: 0.1});
O primeiro parâmetro é uma string opcional que identifica um nome exclusivo para seu alarme, por exemplo,
remindme: Observação: é necessário definir um nome de alarme para que seja possível cancelá-lo por nome.
O segundo parâmetro é um objeto alarmInfo. As propriedades válidas para alarmInfo incluem when ou
delayInMinutes e periodInMinutes. Para reduzir a carga na máquina do usuário, o Chrome
limita os alarmes a uma vez por minuto. Estamos usando valores pequenos (0,1 de minuto) aqui para demonstração
para fins específicos.
Limpar alarmes
No cancelAlarm(), use a API chrome.alarms.clear() para cancelar um alarme quando a opção Cancelar
alarme for ativado.
chrome.alarms.clear(alarmName);
O primeiro parâmetro deve ser a string de identificação que você usou como nome do alarme
chrome.alarms.create():
O segundo parâmetro (opcional) é uma função de retorno de chamada que deve assumir o formato:
function(boolean wasCleared) {...};
Receber alarmes
No checkAlarm(), use a API chrome.alarms.getAll() para receber uma matriz de todos os alarmes criados.
para atualizar o estado da interface do botão ativar.
getAll() aceita uma função de callback que transmite uma matriz de objetos Alarm. Para acessar o que tem
um Alarm, você pode inspecionar alarmes em execução no Console do DevTools da seguinte maneira:
chrome.alarms.getAll(function(alarms) {
console.log(alarms);
console.log(alarms[0]);
});
Isso vai gerar um objeto como
{name: "remindme", periodInMinutes: 0.1, scheduledTime: 1397587981166.858}, conforme mostrado abaixo:

Prepare-se para a próxima seção
Agora que os alarmes estão prontos para consultar o app em intervalos regulares, use isso como base para adicionar notificações visuais.
Adicionar notificações
Vamos mudar a notificação de alarme para algo que o usuário possa notar facilmente. Usar
chrome.notifications para mostrar uma notificação na área de trabalho como esta:

Quando o usuário clica na notificação, a janela do app Todo aparece.
Atualizar as permissões de aplicativos
Em manifest.json, solicite a permissão "notifications":
"permissions": ["storage", "alarms", "notifications"],
Atualizar scripts em segundo plano
Em background.js, refatore o callback chrome.app.window.create() em um método autônomo.
para que você possa reutilizá-lo:
chrome.app.runtime.onLaunched.addListener(function() {
function launch() {
chrome.app.window.create('index.html', {
id: 'main',
bounds: { width: 620, height: 500 }
});
}
});
chrome.app.runtime.onLaunched.addListener(launch);
...
Atualizar listener de alarme
Na parte superior de background.js, adicione uma variável para o nome do banco de dados usado no alarme ouvinte:
var dbName = 'todos-vanillajs';
O valor de dbName é o mesmo nome de banco de dados definido na linha 17 do js/app.js:
var todo = new Todo('todos-vanillajs');
Criar uma notificação
Em vez de apenas registrar um novo alarme no console, atualize o listener onAlarm para que ele seja armazenado.
usando chrome.storage.local.get() e chame um método showNotification():
chrome.alarms.onAlarm.addListener(function( alarm ) {
console.log("Got an alarm!", alarm);
chrome.storage.local.get(dbName, showNotification);
});
Adicione este método showNotification() a background.js:
function launch(){
...
}
function showNotification(storedData) {
var openTodos = 0;
if ( storedData[dbName].todos ) {
storedData[dbName].todos.forEach(function(todo) {
if ( !todo.completed ) {
openTodos++;
}
});
}
if (openTodos>0) {
// Now create the notification
chrome.notifications.create('reminder', {
type: 'basic',
iconUrl: 'icon_128.png',
title: 'Don\'t forget!',
message: 'You have '+openTodos+' things to do. Wake up, dude!'
}, function(notificationId) {});
}
}
chrome.app.runtime.onLaunched.addListener(launch);
...
showNotification() vai verificar se há itens de tarefas abertos (não concluídos). Se houver pelo menos um
item de lista de tarefas, crie um pop-up de notificação em chrome.notifications.create().
O primeiro parâmetro é um nome de notificação de identificação exclusiva. É necessário ter um ID definido no pedido
para limpar ou processar interações com essa notificação específica. Se o ID corresponder a um ID
o create() limpa essa notificação antes de fazer outra.
O segundo parâmetro é um objeto NotificationOptions. Há muitas opções de renderização
o pop-up de notificação. Aqui, estamos usando uma com um ícone, um título e uma mensagem.
Outros tipos de notificação incluem imagens, listas e indicadores de progresso. Sinta-se à vontade para retornar a esta
quando concluir a Etapa 3 e teste outros recursos de notificação.
O terceiro parâmetro (opcional) é um método de callback que precisa assumir o formato:
function(string notificationId) {...};
Processar interações de notificação
Abra o app Todo quando o usuário clicar na notificação. No final de background.js, crie
Manipulador de eventos do chrome.notifications.onClicked:
chrome.notifications.onClicked.addListener(function() {
launch();
});
O callback do manipulador de eventos simplesmente chama o método launch(). chrome.app.window.create() ou
cria uma nova janela de aplicativo do Google Chrome, caso ainda não exista uma, ou coloca em foco a janela atual
janela aberta com o ID da janela main.
Iniciar o app Todo concluído
Você concluiu a Etapa 3! Atualize o app Todo agora com lembretes.
Verifique se estes comportamentos funcionam como esperado:
- Se você não tem itens de tarefas não concluídos, não há notificações pop-up.
- Se você clicar na notificação quando o app for fechado, o app Todo vai abrir ou entrar em foco.
Solução de problemas
O arquivo background.js final deve ficar assim. Se as notificações não estiverem aparecendo, Confirme se a versão do Google Chrome é a 28 ou superior. Se mesmo assim as notificações não forem exibidas, verifique o mensagens de erro no Console do DevTools na janela principal (clique com o botão direito do mouse > Inspecionar elemento) e a página de plano de fundo (clique com o botão direito do mouse > Inspecionar página de plano de fundo).
Mais informações
Para informações mais detalhadas sobre algumas das APIs introduzidas nesta etapa, consulte:
- Declarar permissões ↑
- chrome.alarms ↑
- chrome.alarms.onAlarm ↑
- chrome.alarms.create() ↑
- chrome.alarms.clear() ↑
- chrome.alarms.getAll() ↑
- chrome.notifications ↑
- chrome.notifications.create() ↑
- NotificationOptions ↑
- chrome.notifications.onClicked ↑
Tudo pronto para passar para a próxima etapa? Vá para a Etapa 4: abrir links externos com um WebView »