Slides usado na palestra "Execução em Background e Live Tiles em Universal Apps" na trilha "Universal Windows" do TDC 2015
http://www.thedevelopersconference.com.br/tdc/2015/saopaulo/trilha-universal-windows
2. Globalcode – Open4education
Diego Castro
/dfdcastro
www.talkitbr.com
/talkitbr
João Ronaldo Cunha
/joaoronaldo.cunha
www.talkitbr.com
/talkitbr /joaocunhaeld
5. 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
7. 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
18. 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.
19. 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
20. 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
21. 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
22. 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
23. 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
24. 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.
25. 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;
}
26. 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();
27. 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>
29. 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.
31. 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();
// ...
32. 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
33. 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
34. 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
36. Globalcode – Open4education
Debug e Log
Visual Studio pode disparar background tasks.
Log é registrado em:
Application & Services Logs > Microsoft >
BackgroundTaskInfrastructure
- Explicar como é formado um Tile
Explicar os 3 tipos de tiles
Basic State
Semi-Live State
Live State
- Explicar os tipos de atualizações que são possíveis
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?
Basic Templates
Templates prontos, com posições dos elementos fixas
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
Explicar o que é o Secondary Live Tile
Explicar quando deve usar esse recurso
Mostrar como é o código incial de cada tamanho de tamplate disponível
Falar que o Tile Large é exclusivo Desktop
Mostrar exemplos de tiles
Mostrar como é simples e fácil deixar um Tile customizado de acordo com as necessidades do aplicativo
Pode ser causado por falta de recursos do SO.
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.
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.
No Windows desktop podemos ter até 8 background tasks executando simultâneamente.
Isso pode ser diferente no Windows Mobile.
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.
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.
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.
Em Quite Hours ainda estão disponíveis Toast VOIP e Toast Alarm
Em Quite Hours ainda estão disponíveis Toast VOIP e Toast Alarm