Globalcode – Open4education
Trilha – Universal Windows
Diego Castro | João Ronaldo
Evangelistas Técnicos
www.talkitbr.com
Globalcode – Open4education
Diego Castro
/dfdcastro
www.talkitbr.com
/talkitbr
João Ronaldo Cunha
/joaoronaldo.cunha
www.talkitbr.com
/talkitbr /joaocunhaeld
Globalcode – Open4education
Agenda
Live Tiles
Tiles
Tile Templates
Secondary Tiles
Adaptive Tile
Demo
Background Execution
Criando Background Tasks
Globalcode – Open4education
Tiles
Globalcode – Open4education
Live State
Plate
App Icon
Short Name
Badge
Content
Plate
Short Name
Badge
App Icon
Content
Anatomia
Semi-Live State
Plate
App Logo
Short Name
Badge
Plate
App Logo
Short Name
Badge
Basic State
Plate
App Logo
Short Name
Plate
App Logo
Short Name
Globalcode – Open4education
Atualizando
Programado
Configurar com “ScheduledTileNotification”
Periódico
Pull URL 30m / 60m / 6h / 12h / 24h
Local
Update em foreground/background
Push
Push services
Globalcode – Open4education
Responsive Tiles
Tiles não são sempre dos
mesmos tamanhos
Se adaptam de acordo
com a densidade do
dispositivo
Alta densidadeBaixa densidade
Globalcode – Open4education
Tile Templates
Globalcode – Open4education
Basic Templates
Globalcode – Open4education
Templates Legados
O template que você precisa já
existe?
Templates anteriores ainda
são válidos!
Globalcode – Open4education
Secondary Tiles
Globalcode – Open4education
O que é
Deep-link no seu app
Separação de conteúdo
Conteúdo relevante para o
usuário
Globalcode – Open4education
Adaptive Tile
Globalcode – Open4education
XML
<tile>
<visual>
<binding template="TileSmall">
<text>Small</text>
</binding>
<binding template="TileMedium">
<text>Medium</text>
</binding>
<binding template="TileWide">
<text>Wide</text>
</binding>
<binding template="TileLarge">
<text>Large</text>
</binding>
</visual>
</tile>
Globalcode – Open4education
O que podemos fazer
Globalcode – Open4education
Demo
Globalcode – Open4education
Background Tasks
Globalcode – Open4education
O que é
Tarefa que executa em plano de fundo
(background)
Permite executar código da aplicação mesmo
quando ela não estiver em execução.
Usado para:
Atualização de Live Tiles;
Notificações;
Atualização de banco de dados;
Entre outros.
Globalcode – Open4education
Criando Background Task
Analisar custo
O SO está sobrecarregado? Vale a pena executar o
background task num determinado momento?
Tratar o cancelamento da task
Toda background task pode ser cancelada
Executar em deferral
Background task não pode executar de forma
assíncrona.
Indicar progresso
Globalcode – Open4education
Criando Background Task
public async void Run(IBackgroundTaskInstance taskInstance)
{
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
if (cost == BackgroundWorkCostValue.High)
{
return;
}
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = taskInstance.GetDeferral();
try
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
taskInstance.Progress = (uint)i * 10;
await Task.Delay(2000);
}
}, cancel.Token);
}
finally
{
deferral.Complete();
}
}
Analisar Custo
Globalcode – Open4education
Criando Background Task
public async void Run(IBackgroundTaskInstance taskInstance)
{
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
if (cost == BackgroundWorkCostValue.High)
{
return;
}
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = taskInstance.GetDeferral();
try
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
taskInstance.Progress = (uint)i * 10;
await Task.Delay(2000);
}
}, cancel.Token);
}
finally
{
deferral.Complete();
}
}
Tratar cancelamento
Globalcode – Open4education
Criando Background Task
public async void Run(IBackgroundTaskInstance taskInstance)
{
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
if (cost == BackgroundWorkCostValue.High)
{
return;
}
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = taskInstance.GetDeferral();
try
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
taskInstance.Progress = (uint)i * 10;
await Task.Delay(2000);
}
}, cancel.Token);
}
finally
{
deferral.Complete();
}
}
Executar em deferral
Globalcode – Open4education
Criando Background Task
public async void Run(IBackgroundTaskInstance taskInstance)
{
var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
if (cost == BackgroundWorkCostValue.High)
{
return;
}
var cancel = new System.Threading.CancellationTokenSource();
taskInstance.Canceled += (s, e) =>
{
cancel.Cancel();
cancel.Dispose();
};
var deferral = taskInstance.GetDeferral();
try
{
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
taskInstance.Progress = (uint)i * 10;
await Task.Delay(2000);
}
}, cancel.Token);
}
finally
{
deferral.Complete();
}
}
Indicar progresso
Globalcode – Open4education
Criando Background Task
No Windows 10 uma aplicação pode ter muitas
background tasks.
Seja consciente! Executar várias background tasks
pode prejudicar a experiência do usuário.
Globalcode – Open4education
Requisitando Acesso
A aplicação precisa requisitar acesso para rodar
Background Tasks
O Windows 10 não exibe mais a caixa de diálogo,
assim como já era no Windows Phone 8.1.
BackgroundAccessStatus allowed = await BackgroundExecutionManager.RequestAccessAsync();
switch (allowed)
{
// allowed
case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity: break;
case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity: break;
// denied
case BackgroundAccessStatus.Denied: break;
// cancelled
case BackgroundAccessStatus.Unspecified: break;
}
Globalcode – Open4education
Registrando
Registramos a Background Task usando o
BackgroundExecutionManager.
Neste momento definimos o trigger e as condições
para rodar a background task.
var task = new BackgroundTaskBuilder
{
Name = nameof(MyBackgroundTask),
CancelOnConditionLoss = false,
TaskEntryPoint = typeof(MyBackgroundTask).ToString(),
};
task.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
task.AddCondition(new SystemCondition(SystemConditionType.userPresent));
task.Register();
Globalcode – Open4education
Especificando no manifest
No manifest da aplicação registramos uma
extensão da aplicação definindo nossa Task.
Atenção para os tipos definidos para o Background
Task.
<Applications>
<Application Id="App"
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="SampleApp.Tasks.MyBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
<!-- <Task Type="timer" /> -->
</BackgroundTasks>
</Extension>
</Extensions>
</Application>
</Applications>
Globalcode – Open4education
Demo
Globalcode – Open4education
Executando a Task
A execução de um Background Task é
determinada:
Por trigger.
Por zero ou mais condições.
Posso registrar uma task com diferentes triggers e
diferentes condições.
Globalcode – Open4education
Windows8.1
SystemTrigger
TimeTrigger
MaintenanceTrigger
DeviceUseTrigger
DeviceServicingTrigger
PushNotificationTrigger
Phone8.1
CachedFileUpdaterTrigger
DeviceConnectionChangeTrigger
GattCharacteristicNotificationTrigger
RfcommConnectionTrigger
LocationTrigger
Windows10
AppointmentStoreNotificationTrigger
ContactStoreNotificationTrigger
EmailStoreNotificationTrigger
BluetoothLEAdvertisementWatcherTrigger
BluetoothLEAdvertisementPublisherTrigger
DeviceWatcherTrigger
ActivitySensorTrigger
SensorDataThresholdTrigger
ToastNotificationHistoryChangedTrigger
ToastNotificationActionTrigger
ApplicationTrigger
MediaProcessingTrigger
SocketActivityTrigger
Executando a Task
Triggers
Globalcode – Open4education
Executando a Task
Triggers -Time Trigger
Time Trigger deve ter ao menos 15 minutos para
ser recorrente.
Definir trigger menor faz com que ele seja
executado somente uma vez.
// ...
task.SetTrigger(new TimeTrigger(15, false));
task.AddCondition(new SystemCondition(SystemConditionType.UserPresent));
task.Register();
// ...
Globalcode – Open4education
Executando a Task
Condições do Sistema
User Present
User Not Present
Internet Available
Internet Not Available
Session Connected
Session Disconnected
Free Network Available
Se a rede não tem taxa
para tráfego de dados
Work Cost Not High
Globalcode – Open4education
Tempo Execução da Task
Cancel
(5 seconds)
Memory
Run
(25 seconds)
Default tasks
Mínimo 25 segundos de
execução
5 segundos após receber
sinal de cancelamento.
Memory
Run
(no end)
End
(no warning, for now)
Long-running tasks
Inclui triggers: Application,
Maintenance e DeviceUse
Globalcode – Open4education
Restrições
Quiet hours
Somente quando não estiver sendo usado pelo usuário.
Não são emitidas notificações
Nenhuma background task é executada
Tarefas em andamento são canceladas
Globalcode – Open4education
Restrições
Economia de Bateria
Usuários definem as aplicações que podem executar em
Background
Número de tasks controlado
Identifica tasks abusivas
Globalcode – Open4education
Debug e Log
Visual Studio pode disparar background tasks.
Log é registrado em:
Application & Services Logs > Microsoft >
BackgroundTaskInfrastructure
Globalcode – Open4education
Dúvidas?
Globalcode – Open4education
Contatos
/dfdcastro
www.talkitbr.com
/joaoronaldo.cunha
/talkitbr
/talkitbr
Globalcode – Open4education
Obrigado!

TDC 2015 - Execução em Background e Live Tiles em Universal Apps

Notas do Editor

  • #3 Apresentação Pessoal
  • #4 Explicar agenda, o que vamos apresentar
  • #6 - Explicar como é formado um Tile Explicar os 3 tipos de tiles Basic State Semi-Live State Live State
  • #7 - Explicar os tipos de atualizações que são possíveis
  • #8 Explicar que é necessário se preocupar e testar em diversos devices De acordo com o tipo de tela disponível, o Tile vai ficar diferente. Se preocupe com as informações, ela vai estar legível para o usuário?
  • #10 Basic Templates Templates prontos, com posições dos elementos fixas
  • #11 Explicar que se o template que existe funciona para ele, é melhor usar. Os templates do Windows 8.1 ainda funcionam no 10 sem nenhum problema
  • #13 Explicar o que é o Secondary Live Tile Explicar quando deve usar esse recurso
  • #15 Mostrar como é o código incial de cada tamanho de tamplate disponível Falar que o Tile Large é exclusivo Desktop
  • #16 Mostrar exemplos de tiles Mostrar como é simples e fácil deixar um Tile customizado de acordo com as necessidades do aplicativo
  • #22 Pode ser causado por falta de recursos do SO.
  • #23 Ao executar uma tarefa assíncrona no Background Task, o SO pode considerar a task como finalizada e teminá-la. Usar deferral garante que a Task não será finalizada pelo SO. O deferral.Complete() sinaliza o SO que a background task terminou o que tinha para fazer.
  • #24 Ao executar uma tarefa assíncrona no Background Task, o SO pode considerar a task como finalizada e teminá-la. Usar deferral garante que a Task não será finalizada pelo SO. O deferral.Complete() sinaliza o SO que a background task terminou o que tinha para fazer.
  • #25 No Windows desktop podemos ter até 8 background tasks executando simultâneamente. Isso pode ser diferente no Windows Mobile.
  • #26 O usuário pode prevenir a execução de um background task (app or system level). Mas ele não pode impedir que a aplicação faça a requisição de acesso. Não é esse o caso aqui. O usuário pode negar a execução de background tasks, por exemplo, devido a problemas com a aplicação ou por causa do estado atual do SO.
  • #27 Para registrar o Background Task usamos o método: Task.register() Para tanto definimos a Task a partir do BackgroundTaskBuilder. Neste definimos as seguintes informações: - Name: deve ser único. Podemos usar o recurso novo do C#5 que é o nameof. O nome será depois usado para acompanhar a Background Task no event viewer. - CancelOnConditionLoss: Nós podemos executar a task mesmo quando perdermos a condição para executar a background task. - EntryPoint: O nome complete do background task.
  • #28 E importante especificar o type correto para a tarefa. Voce pode especificar mais de um element Task dentro do element BackgroundTasks, cada um especificando os tipos que devem corresponder com os triggers da task.
  • #35 Em Quite Hours ainda estão disponíveis Toast VOIP e Toast Alarm
  • #36 Em Quite Hours ainda estão disponíveis Toast VOIP e Toast Alarm