Atualização da tela (Android)

Na minha aplicação eu uso uma notificação para mostrar o andamento do upload, e olhando no consumo de CPU durante o processo (através de um top no shell) constatei que o processo com.android.systemui é o que mais está consumindo recursos da CPU. Só há um detalhe: a tela está desligada, portanto não deveria haver processamento de UI.

O Android que não cuida disso (evitar processamento quando a tela não está ligada) e eu é que preciso evitar essas atualizações, ou é um bug do sistema operacional?

Acontece que no Android, o multi-tarefas é real.

A Activity tem alguns métodos que te avisam sobre o estado que ela vai se tornar.

De uma olhada no life-cycle nos docs dessa classe.

http://developer.android.com/reference/android/app/Activity.html

Mas o que a multi-tarefa tem a ver com a atualização da tela, se esta está desligada? Seria como deixar a cabeça de uma impressora indo pra lá e pra cá, mesmo sem ter nada pra imprimir.

Ao meu ver é um gasto desnecessário de bateria! Só deveria acontecer atualização de tela quando ela estivesse ligada.

Eu percebi isso e vou alterar minha aplicação para que não atualize a área de notificação se a tela estiver desligada, poupando recursos. Mas e todos os outros programas que tenho instalados e rodando, será que fazem o mesmo? Quanto de bateria eu ganharia se houvesse essa preocupação ou esse cuidado no próprio sistema operacional?

Boa pergunta, na verdade quando está sem ser exibido os métodos de desenho não deveriam ser chamados (e acho que realmente não são).

Talvez no seu caso voce esteja realmente processando o que precisa na UI Thread.

Seria? Atualização de tela consome energia, mas CPU?

Quando ao processamento, existe duas formas de pensar:

  1. multi-tarefa real, portanto desligar a tela não deveria reduzir em nada o processamento.

  2. e o estilo iOS de multi-tarefa onde o app é de fato suspenso e não faz uso do processador (apesar de haver algumas exceções são consideradas).

[quote=Marky.Vasconcelos]Boa pergunta, na verdade quando está sem ser exibido os métodos de desenho não deveriam ser chamados (e acho que realmente não são).
Talvez no seu caso voce esteja realmente processando o que precisa na UI Thread.[/quote]
Não tá não…tanto que quem está rodando é um serviço (android.app.Service) que tem como única interação com a tela (e com o usuário) a criação de uma notificação para mostrar o andamento do processo, exibida na área de notificação. Fiz o teste e se desabilito a atualização da notificação não ocorre processamento de UI alguma…já se deixo habilitado (apenas a sua atualização, pois criada ela é sempre) tá lá a UI processando (e consumindo).

Eu até concordaria em parte se fosse o caso da tela toda estar sendo alterada, pois assim se o usuário ligasse o aparelho a tela demoraria um pouco menos para ser apresentada, mas como se trata de uma notificação não vejo sentido! Sem contar que antes de exibir a tela é necessário passar pelo desbloqueio dela…tempo mais que suficiente para desenhá-la.

Seria? Atualização de tela consome energia, mas CPU?[/quote]
Alguém tem que mandar a tela se atualizar, não? E dizer exatamente com o que! :slight_smile:

[quote=malconL]Quando ao processamento, existe duas formas de pensar:

  1. multi-tarefa real, portanto desligar a tela não deveria reduzir em nada o processamento.[/quote]
    O processamento do programa não deveria ser reduzido, mas o processamento da tela sim (por que processar tela se ela está desligada?).

Essa comparação não é válida para o caso, pois não é uma aplicação que está rodando, mas um serviço (em segundo plano, sem interação com o usuário). Sem contar que no Android é assim também (ao suspender a aplicação, o processamento dela para também).

[quote=fenrir]
O processamento do programa não deveria ser reduzido, mas o processamento da tela sim (por que processar tela se ela está desligada?).[/quote]

Quem disse que o processo em questão é responsável por atualizar a tela?

Quem disse que o processo em questão é responsável por atualizar a tela?[/quote]
Tem razão…não é exatamente o processo responsável pela atualização de tela diretamente, mas por elementos que nela são apresentados, como a barra de notificação.

A tela em si pode não estar sendo atualizada, mas porque um elemento que só faz sentido quando ela está ligada é atualizado e fica consumindo recursos?

Vou tentar achar algo no bugtracker do Android…