Este artigo foi traduzido por máquina.

Windows 8,1

Construindo um App de alarme nas janelas 8.1

Champion Tony

Entre as centenas de novas funcionalidades no Windows 8.1 é o conceito de um app de alarme. Em poucas palavras, um app de alarme é um app Store do Windows que pode programar as notificações de brinde para o segundo. Devido os maneira Windows processos brindes, isto não é uma precisão oferecida-se para a maioria dos apps. Neste artigo, vou explorar o conceito de um app de alarme e olha para o que é preciso para desenvolver um dos seus próprios.

O que é um App de alarme?

Antes de olhar sob o capô de um app de alarme, é importante considerar que tipo de apps faria bom alarme apps. A chave é considerar a precisão de entrega de notificações. Por exemplo, não é necessário para um aplicativo de calendário notificar o usuário de aniversário de um amigo em um exato momento. No entanto, existem vários tipos de aplicativos que exigem esta precisão.

A escolha mais óbvia é um app bom despertador à moda antiga. Quando um usuário define um alarme, seu aplicativo precisa notificar o usuário naquele momento. Agora, você pode criar apps de gerenciamento de tempo mais precisos, como um app de Pomodoro, com um app de alarme. Um app de alarme também pode ser usado em treinos de intervalo curto, tais como Tabata, onde o timing de rondas e descansos é extremamente importante.

Todos os desenvolvedores de app Store do Windows devem estar familiarizados com o conceito de Windows 8 de aplicações de ecrã de bloqueio. Aplicativos que são colocados na tela do fechamento tem permissão para postar atualizações para a tela de bloqueio. Além disso, um aplicativo de tela de bloqueio tem acesso a recursos mais do que um aplicativo típico. Isto é importante quando seu aplicativo precisa fazer coisas como atualização de tela do fechamento ou executar muitas tarefas fundo disponível.

A necessidade dos recursos adicionais em aplicações de ecrã de bloqueio é um resultado direto das mudanças no Windows 8 para melhorar o desempenho e bateria de vida. Windows é projetado para impedir que aplicativos executem quando eles não estão sendo usados e consolidar as tarefas quando possível. Por este motivo, você encontrará eventos agendados, tais como tarefas em segundo plano e notificações, serão sempre executado em uma hora aproximada. Windows lotes essas atualizações e executa-los quando tem um processo pronto para fazer o trabalho.

No Windows 8, você pode definir até sete apps para ser na tela do fechamento a qualquer momento. Foi incluída nesses sete slots um slot especial para um app de status detalhado. Um dispositivo pode ter sete aplicações de ecrã de bloqueio que podem exibir emblemas ou texto, mas apenas um app que é capaz de fornecer uma interface do usuário personalizada para a tela de bloqueio. 8.1 Windows mantém essa configuração e adiciona o app do alarme como um novo tipo especial de bloqueio tela app. Figura 1 mostra os novo "bloquear tela apps" parte de configurações da tela de configurações do PC. Como o aplicativo de status detalhado, cada dispositivo só pode ter um único alarme app de cada vez.

Lock Screen Part of PC Settings
Figura 1 bloqueio tela parte das configurações do PC

A única diferença entre um aplicativo de alarme e outros aplicativos de tela de bloqueio é a capacidade de fornecer notificações de alarme brinde ao usuário dentro de um segundo o tempo de entrega programada. Como mencionado anteriormente, submeter ou programar um brinde em uma app Store do Windows não garante que quando o brinde será entregue. É entregue em um prazo aproximado, mas o tempo exato é até janelas. Se um aplicativo é identificado pelo usuário como o app de alarme, brindes regulares são entregues exatamente no tempo.

Criação de um App de alarme

Antes que um aplicativo pode ser selecionado como um app de alarme, o manifesto do aplicativo deve ser configurado corretamente. Se o manifesto não inclui os recursos necessários, em seguida, tentar definir o app como o app de alarme no código irá gerar um erro e o usuário não terá a opção para definir o aplicativo manualmente.

Porque um app alarme agenda brindes, você primeiro precisa habilitar brindes. Você pode fazer isso no designer de manifesto na aba aplicativo interface do usuário. Uma caixa de menu suspenso brinde-capaz encontram-se na seção notificações em Visual activos. A seção de notificações pode ser encontrada em todos os ativos de imagem, bem como o subgrupo emblema logotipo. Para habilitar os brindes para o app, você deve definir o dropdown brinde-capaz para Sim.

A outra propriedade na seção notificações é a capacidade de ativar as notificações de tela de bloqueio para o app. Como mencionado anteriormente, o app de alarme é um tipo especial de bloqueio tela app; Portanto, o aplicativo deve ser configurado para ser na tela do fechamento. Você deve definir o bloqueio tela notificações dropdown que distintivo ou emblema e texto de telha.

Uma vez que você habilitou o bloqueio notificações de tela em um aplicativo, o manifesto precisa ter alguns itens adicionais. Por exemplo, um logótipo distintivo deve ser atribuído ao app. O logotipo é necessário para ser uma imagem de 24 x 24 pixels, e como todos os logotipos em uma app Store do Windows, você pode especificar a escala de vários tamanhos para lidar com a escala de resolução de Windows. Figura 2 mostra um exemplo do manifesto designer com brindes e notificações de tela de bloqueio ativadas.

Notifications Section of the Manifest Designer
Figura 2 seção de notificações do manifesto Designer

Qualquer app que tem notificações de tela de bloqueio ativadas também deve declarar uma tarefa em segundo plano no manifesto do aplicativo. A parte interessante desta exigência é que você não precisa realmente implementar uma tarefa em segundo plano em um aplicativo de tela de bloqueio; Só tem que ser declarado.

Uma tarefa em segundo plano é declarada na seção declarações do designer de manifesto de aplicativo. Nas declarações disponíveis, selecione as tarefas em segundo plano e clique em Adicionar. A tarefa em segundo plano para um app de tela de bloqueio deve oferecer suporte a um dos seguintes tipos de tarefa: Canal de controle, temporizador, notificação Push ou localização. Na seção de configurações de aplicativo de tarefa em segundo plano, você deve definir o ponto de entrada ou valor de página inicial. Em um app XAML que está usando a tarefa em segundo plano, o ponto de entrada é definido como a classe que implementa a interface IBackgroundTask. Se o aplicativo não é na verdade implementando uma tarefa em segundo plano, o valor pode ser definido para qualquer coisa. Figura 3 mostra uma tarefa em segundo plano corretamente configurado para habilitar um aplicativo a ser adicionado à tela do fechamento.

Configuring a Background Task
Figura 3 Configurando uma tarefa em segundo plano

A etapa final em Configurando o manifesto de aplicativo é para identificar o aplicativo como um aplicativo de alarme. Faça isso adicionando uma extensão de alarme no manifesto. Infelizmente, não é possível adicionar esta extensão através do designer manifesto; deve ser feito à mão. Para fazer isso, você deve primeiro obter o XML subjacente do manifesto do pacote. Fazer isso clicando package.appxmanifest no Solution Explorer e selecionando Exibir código.

O XML em um manifesto de aplicativo do Windows 8.1 usará dois namespaces. O namespace primeiro (que é o padrão) contém os elementos definidos no Windows 8. O segundo espaço para nome deve ser adicionado e é identificado pelo prefixo m2. Inclui adições e alterações adicionadas no Windows 8.1. Porque a função de alarme de app é nova para Windows 8.1, você precisa adicionar uma extensão "8.1" para a coleção de extensões dentro do elemento do aplicativo. A categoria da nova extensão deve ser definida como windows.alarm. Aqui está um exemplo de como a coleção de extensões deve parecer com a nova extensão e tarefa em segundo plano declarada anteriormente:

<Extensions>
  <Extension Category="windows.backgroundTasks" 
      EntryPoint="App">
    <BackgroundTasks>
      <Task Type="timer" />
    </BackgroundTasks>
  </Extension>
  <m2:Extension Category="windows.alarm" />
</Extensions>

Solicitando acesso alarme

Uma vez que as declarações e configurações apropriadas foram feitas, seu aplicativo pode solicitar acesso a ser definido como o aplicativo para o dispositivo de alarme. O usuário pode fazer isso manualmente as configurações do PC; Entretanto, seu aplicativo pode solicitar acesso através do tempo de execução do Windows (WinRT).

O tempo de execução do Windows inclui uma classe estática de AlarmApplicationManager no namespace Windows.ApplicationModel.Background. Essa classe tem um método RequestAccessAsync que solicitará ao usuário permissão definir o aplicativo como o app de alarme do dispositivo, como mostrado em Figura 4. Se um app diferente atualmente é identificado como o app do alarme, ele será substituído pelo atual se o usuário selecionar Sim quando solicitado.

An Alarm App Permission Prompt
Figura 4 um alarme App permissão Prompt

O método RequestAccessAsync retorna um enum AlarmAccessStatus que tem três valores válidos: Negado, AllowedWithWakeup­capacidade e AllowedWithoutWakeupCapability. É importante­alarmes tant se você estiver criando aplicativos de alarme para coisas tais como acordar de manhã. Se o dispositivo está em modo de hibernação e ele não está configurado para permitir que as notificações de brinde para despertá-lo, em seguida, os alarmes não vão disparar.

É importante lembrar que o Windows 8 coloca o usuário no controle de um dispositivo. Como mostrado em Figura 1, um usuário pode alterar facilmente o app de alarme. Seu desafio é que cada app pode apenas solicitar acesso do AlarmApplicationManager uma vez. Se o app faz um segundo pedido de acesso — para este usuário e dispositivo — não solicitar o usuário e irá retornar apenas o atual status do alarme do app. Uma vez que o app foi negado, substituído por um app diferente ou removido manualmente pelo usuário, sua única opção é para informar ao usuário que o aplicativo precisa ser adicionado manualmente volta como o app de alarme para o dispositivo.

O AlarmApplicationManager também inclui um método GetAccessStatus que retorna o status do alarme atual da máquina. Tal como acontece com o método RequestAccessAsync, que retorna um enum AlarmAccessStatus e é uma ótima maneira de determinar o que está acontecendo com o dispositivo. Por exemplo, seu aplicativo pode informar ao usuário se as notificações não acordarem o dispositivo.

Programação de alarmes

Alarmes são na verdade apenas uma notificação de brinde agendada com um pouco mais forte. O processo de agendamento de um alarme é idêntico ao agendamento de uma notificação de brinde, a única diferença é a notificação de XML. O XML usado para definir uma notificação conterá informações sobre a sua aparência, bem como quaisquer recursos incluídos.

Um brinde pode ser apenas texto ou uma combinação de texto e uma imagem, tal como definido por um dos modelos fornecidos pelo Runtime do Windows. Existem atualmente oito modelos diferentes de XML que você pode escolher. Como desta escrita, 8.1 do Windows não suporta layouts de brinde personalizado, então você deve selecionar um dos modelos fornecidos.

O tipo e o layout de um brinde é definido em um bloco de XML. O XML identifica o modelo de brinde para usar, o texto e a imagem com que para preencher o modelo e várias outras opções que discutiremos mais tarde. Aqui está um exemplo de uma notificação de brinde básico:

<toast duration="long">
  <visual>
    <binding template="ToastText02">
      <text id="1">Sample Toast App</text>
      <text id="2">The is a sample message.</text>
    </binding>
  </visual>
</toast>

Existem várias maneiras de gerar o modelo de brinde. O tempo de execução do Windows criará um XmlDocument de cada modelo a ToastNotificationManager, que pode ser encontrada no namespace Windows.UI.Notification. O ToastNotificationManager tem um método estático de GetTemplateContent que leva um enum ToastTemplateType tem um valor para cada um dos modelos disponíveis. Aqui está um exemplo de como conseguir um XmlDocument do exemplo anterior:

XmlDocument content =
  ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
content.DocumentElement.SetAttribute("duration", "long");
var textLines = content.GetElementsByTagName("text");
textLines[0].InnerText = "Sample Toast App";
textLines[1].InnerText = "The is a sample message.";

Este é um excelente ponto de partida; no entanto, dependendo de seu uso, pode ser um pouco pesado. Por isso quaisquer adições ou modificações ao modelo serão normalmente feitas usando a API de XmlDocument. Isso pode levar a várias linhas de código para algumas adições simples. Com isto em mente, não é raro encontrar o XML construído como uma seqüência de caracteres e então carregado em um XmlDocument, uma vez que o modelo está completo. Figura 5 mostra como alcançar o equivalente do exemplo anterior, gerando o XML como uma seqüência de caracteres.

Figura 5-gerar XML como uma seqüência de caracteres

string textLine1 = "Sample Toast App";
string textLine2 = "This is a sample message.";
string contentString =
  "<toast duration=\"long\">\n" +
    "<visual>\n" +
      "<binding template=\"ToastText02\">\n" +
        "<text id=\"1\">" + textLine1 + "</text>\n" +
        "<text id=\"2\">" + textLine2 + "</text>\n" +
      "</binding>\n" +
    "</visual>\n" +
  "</toast>\n";
XmlDocument content = new Windows.Data.Xml.Dom.XmlDocument();
content.LoadXml(contentString);

Se você vai esta rota, você deve ter cuidado de duas coisas. Primeiro, você deve se certificar que você está gerando XML formatado corretamente — tome cuidado para escapar quaisquer caracteres especiais que podem ser incluídos na seqüência de caracteres. Em segundo lugar, certifique-se de que você seguir o esquema de notificação do brinde. O Windows Dev Center fornece as especificações completas para o esquema no bit.ly/172oYCO.

Todos os exemplos anteriores tem um elemento que não faz parte do modelo padrão. Você deve ter notado o duração atributo no elemento brinde foi definido muito tempo. Porque você está criando alarme brinde notificações, você não quer o alarme para aparecer e depois desaparecer sem interação do usuário. Configuração da duração de tempo vai manter o brinde na tela até 25 segundos.

Quando você tiver seu XML configurado e carregado em um XmlDocument, você poderá agendar seu brinde. O primeiro passo é criar uma instância de um ScheduledToastNotification. Você precisa de duas coisas para criar um ScheduledToastNotification: o XmlDocument contendo a definição de brinde e um tempo para o brinde a ser agendada.

O ScheduledToastNotification está marcada com um ToastNotifier. Uma instância de um ToastNotifier é criada a partir do ToastNotification­gerente classe usando o método estático de CreateToastNotifier. Uma chamada para o método de ToastNotifier AddToSchedule em seguida agendará seu brinde para ser entregue. Brindes normalmente são criados como resultado de alguma ação do usuário, como pressionar um botão, ou um evento que é gerado dentro do aplicativo. Aqui está um exemplo de criação e o agendamento de um brinde por 1 minuto do tempo atual:

ToastNotifier toastNotifier =
  ToastNotificationManager.CreateToastNotifier();
var scheduledToast = new ScheduledToastNotification(
  content, DateTime.Now.AddMinutes(1));
toastNotifier.AddToSchedule(scheduledToast);

O brinde resultante que é gerado pode ser visto em Figura 6. Aviso deve olhar como a maioria dos brindes que viste no Windows.

A Basic Toast Notification
Figura 6 básico brinde notificação

Uma notificação de brinde pode falhar por alguns motivos diferentes. O motivo mais freqüente é que o XML está formatado incorretamente. Isso pode ser causado por ter uma identificação de modelo incorreto ou não definir todos os atributos necessários, portanto, é importante certificar-se de que acertar o XML.

Se você tentar agendar um brinde por um tempo que já passou, uma exceção será lançada durante a chamada AddToSchedule. Se você está agendando um brinde por alguns segundos no futuro, certifique-se que o cálculo de tempo é uma das últimas coisas que você faz. Definir um tempo durante 2 segundos de agora e então, tendo 4 segundos para executar o código antes de realmente programar o brinde que lançará uma exceção.

Finalmente, seu app pode ter apenas 4.096 brindes programados de cada vez. Sei que seu primeiro pensamento é, "de jeito nenhum isso vai acontecer", mas para um app de alarme é mais fácil do que você imagina. Suponha que você tenha um aplicativo de alarme que permite ao usuário agendar um alarme diário. Se seu código agenda múltiplos alarmes diários para cada dia do ano que vem, então 12 alarmes diários pode max para sair. Isto significa que você precisa ter certeza de que seus algoritmos para o agendamento de alarmes são pensados e que você gerenciar os alarmes uma vez que elas são criadas.

Gerenciando e remoção de alarmes

Para construir com sucesso um alarme app, você precisa ter a capacidade de rever e remover quaisquer alarmes agendados. O ToastNotifier pode realizar ambas essas tarefas. Chamar o método GetScheduledToastNotifications retornará uma lista de somente leitura do ScheduledToastNotifications. A coleção conterá apenas notificações agendadas para o aplicativo atual.

Para remover uma notificação programada, a notificação a ser removido deve ser passada para o método de RemoveFromSchedule. Entre esses dois métodos, você pode manter suas notificações regulares. Uma vez que a notificação foi postada e depois demitida pelo usuário, ele não aparecerá mais na coleção do aplicativo de notificações e não conta para o número máximo de permitido notificações agendadas. Aqui é como limpar todas as notificações agendadas:

var toastNotifier = ToastNotificationManager.CreateToastNotifier();
var notifications = toastNotifier.GetScheduledToastNotifications();
// Remove each notification from the schedule
foreach (var notification in notifications)
{
  toastNotifier.RemoveFromSchedule(notification);
}

Você poderia colocar esse código em um manipulador de evento ou comando amarrado a um botão limpar tudo, por exemplo.

Adicionando comandos

Se seu aplicativo é atualmente o app de alarme para o dispositivo, então o exemplo anterior que gerou o brinde mostrado na Figura 6 exibirá no tempo, mas Figura 6parece muito parecido com um alarme, pois não? Principalmente, você está faltando um par de características comuns para um alarme: snooze e demitir. Por padrão, clicando na torrada ou swiping ele vai rejeitá-lo; no entanto, um alarme precisa ser um pouco mais intuitiva.

Além do brinde < > elemento de apoio visual < > elemento filho, ele também suporta comandos < > elemento. Esse elemento permite que você adicione comandos predefinidos para o brinde. O próprio elemento suporta um atributo único cenário opcional. O atributo de cenário pode ser definido como um alarme ou incomingCall. Para o meu propósito aqui, ele será sempre definido para alarme.

Os comandos de < > elemento contém uma coleção de indivíduo < comando > elementos. Cada comando deve ter um atributo id, identificando o tipo de comando é.... Para um alarme, este deve ser também soneca ou descartar. Adicionando uma seção de comandos para seu brinde anterior, seu brinde agora parece um pouco mais com um alarme e tem a capacidade de não só ser demitido mas to tirar uma soneca também. Aqui está o código recém-gerado brinde (você pode ver os resultados deste código no Figura 7):

<toast duration="long">
  <visual>
    <binding template="ToastText02">
      <text id="1">Sample Toast App</text>
      <text id="2">The is a sample message.</text>
    </binding>
  </visual>
  <commands scenario="alarm">
    <command id="snooze"/>
    <command id="dismiss"/>
  </commands>
</toast>

An Alarm Toast Notification
Figura 7 uma notificação de brinde alarme

Definindo o Snooze

Por padrão, o Windows define o tempo de soneca para um alarme em 9 minutos. No entanto, você pode definir a duração da soneca na classe ScheduledToastNotification. Essa classe tem um segundo construtor com dois parâmetros adicionais. O primeiro é o comprimento de tempo para a soneca. O intervalo de soneca é definido como um TimeSpan e pode variar em qualquer lugar de 1 a 60 minutos.

O novo segundo parâmetro é o número máximo de vezes que o usuário pode desligar o despertador o alarme. Definir esse valor como zero permitirá ao usuário desligar o despertador de um número ilimitado de vezes. Aqui está um exemplo de ajuste da frequência de soneca:

DateTime scheduledTime = DateTime.Now.AddMinutes(1);
TimeSpan snoozeInterval = TimeSpan.FromMinutes(5);
var scheduledToast = new ScheduledToastNotification(
  content, scheduledTime, snoozeInterval, 0);

Mudando o som do alarme

Se o usuário tiver habilitado o som para notificações, então cada brinde vai fazer o mesmo "ding" som quando é exibida uma mensagem de brinde. Isso causa alguns problemas quando se trata de criar um app de alarme. Primeiro, o usuário se acostuma a ouvir o mesmo som em todas as notificações. Isto significa que um alarme pode desvanecer-se para o ruído das outras notificações e não se destacam. A segunda questão é que, geralmente, um alarme continua a fazer som até que o usuário reconhece. Portanto, você quer um alarme de ter algum tipo de som em loop.

Felizmente, a definição de brinde também suporta um áudio < > elemento que permite que você personalize o som feito quando aparece o brinde. O áudio < > elemento tem dois atributos: src e loop. Antes que você se empolgue, o valor do atributo src deve ser um dos valores predefinidos fornecidos pelo Windows. Isto significa que você não pode fornecer áudio personalizado para suas notificações de brinde, mas você tem uma coleção decente de sons de que para escolher.

O valor de src deve ser uma das 25 valores predefinidos. Os sons são divididos em categorias de looping e non-loop. Os sons looping são construídos para executar um loop sem problemas e devem ser usados ao criar uma looping notificação áudio. Lá é 10 alarme loop sons e 10 entrada chamada loop sons fornecida. Uma lista completa dos valores predefinidos pode ser encontrada no bit.ly/16HV2xm.

Se você quiser reproduzir um som loop, o atributo loop deve ser definido como true. Além disso, o atributo de duração na torrada < > elemento deve ser definido como o tempo a fim de dar tempo ao som para jogar. Figura 8 mostra um exemplo de como definir um personalizado som audio loop para seu brinde.

Figura 8 definindo um costume Audio som em loop para um brinde

<toast duration="long">
  <visual>
    <binding template="ToastText02">
      <text id="1">Sample Toast App</text>
      <text id="2">The is a sample message.</text>
    </binding>
  </visual>
  <commands scenario="alarm">
    <command id="snooze"/>
    <command id="dismiss"/>
  </commands>
  <audio src="ms-winsoundevent:Notification.Looping.Alarm2"
     loop="true" />
</toast>

Se você não quer seu brinde para reproduzir qualquer som, você pode definir um atributo silencioso para true. Isto substituirá quaisquer configurações padrão na exibição de brindes. Figura 9 mostra como ele é usado.

Figura 9-configuração do atributo em silêncio, então um brinde não toca qualquer som

<toast duration="long">
  <visual>
    <binding template="ToastText02">
      <text id="1">Sample Toast App</text>
      <text id="2">The is a sample message.</text>
    </binding>
  </visual>
  <commands scenario="alarm">
    <command id="snooze"/>
    <command id="dismiss"/>
  </commands>
  <audio silent="true" />
</toast>

Pensando além da sua App

Você pode tomar um app de alarme em muitas direções diferentes. Porque cada dispositivo só pode ter um único alarme app, é importante pensar além do seu aplicativo. Se o escopo de seu app é muito limitado, então o usuário pode substituí-lo com um app diferente. Isto, claro, depende da finalidade para sua aplicação e seu público-alvo. Considere coisas como o uso de contrato de compartilhamento de destino para permitir que outros apps para agendar alarmes através de seu aplicativo.

Com a adição do recurso alarme app no Windows 8.1, agora você pode criar uma vasta gama de aplicações baseadas no tempo com a precisão esperada pelo usuário. Eu mostrei o que é preciso para você se levantar e correr com um app de alarme. Agora, não mais apertar o botão de soneca. Sair e criar a app de alarme seguinte incrível!

Tony Champion é presidente da DS campeão e é um Microsoft MVP. Ele é ativo na Comunidade como um alto-falante, blogueiro e autor. Ele mantém um blog em tonychampion.net e pode ser contatado via e-mail no tony@tonychampion.net.

Agradecemos ao seguinte especialista técnico pela revisão deste artigo: Pete Brown (Microsoft)
Pete Brown é gerente de programa na equipe de evangelismo de cliente e dispositivos, com foco em XAML e apps modernas em todos os dispositivos do Windows. Seu foco está em ajudar os desenvolvedores criar aplicativos bonitos e de alta qualidade, que permitem a criatividade. Ele está no twitter em @pete_brown e na web em 10rem.net.