android - O AlarmManager não funciona em vários dispositivos




(9)

A maioria dos dispositivos Android modernos vem com um aplicativo ou mecanismo, que tenta automaticamente descobrir como economizar bateria e, como resultado, pode matar certos aplicativos de terceiros. Isso pode resultar na remoção de tarefas e trabalhos agendados (por exemplo, alarmes não disparam, notificação por push não funciona, etc.). Em muitos casos, isso acontece de maneira completamente independente dos mecanismos de economia de bateria do Android. No meu caso, não pude fazer mais otimização da bateria ao detectar o modelo de alguns dispositivos, redireciono o usuário ao gerente de inicialização para colocar minha aplicação na lista de permissões.

Você encontrou neste link para cada modelo a intenção de invocar https://android-arsenal.com/details/1/6771

Meu aplicativo usa o AlarmManager e funciona há 4 anos. Mas notei que ele começou a falhar em alguns dispositivos.

Tenho certeza de que o código está correto (estou usando WakefulBroadcastReceiver e setExactAndAllowWhileIdle para dispositivos com Doze) porque está funcionando perfeitamente em dispositivos Nexus, mas falha em dispositivos de alguns fabricantes (Huawei, Xiaomi ...).

Os dispositivos Huawei, por exemplo, têm um tipo de gerenciador de bateria que mata aplicativos e, quando um aplicativo é interrompido, os alarmes programados são cancelados. Portanto, a configuração de um aplicativo como "protegido" no gerenciador de baterias da Huawei resolve o problema.

Mas recentemente notei que não está funcionando com mais dispositivos: Xiaomi, Samsung (talvez esteja relacionado ao novo "Smart Manager"?) ... Parece que esse comportamento está se tornando um padrão: matar aplicativos em segundo plano.

Alguém sabe algo sobre isso? Alguma maneira de garantir que o alarme seja disparado?

EDIT: Esse problema é causado por "economizadores de bateria" adicionados por diferentes fabricantes. Mais informações aqui: https://dontkillmyapp.com/


Atualmente, a maioria dos novos telefones vem com algum tipo de gerenciador de bateria / economia de energia, que faz a mesma coisa que você descreveu. sem contar duboosters e mestres limpos.

Acho que você precisa colocar um aviso de isenção de responsabilidade ou um FAQ na lista de aplicativos / lojas de aplicativos, informando que esse aplicativo precisa ser colocado em exceção do seu aplicativo gerenciador de bateria para funcionar corretamente.


Eu estava procurando uma resposta e depois de várias horas encontrei o seguinte:

https://.com/a/35220476/3174791

Em resumo, é uma maneira de saber se seu aplicativo foi morto por 'Aplicativos protegidos' e isso funciona apenas em dispositivos Huawei. deixe-me saber se há alguma solução para outros dispositivos (Samsung, Sony, Xiaomi, etc).


Eu também tenho um aplicativo que define alarmes. A solução é usar AlarmManager.setAlarmClock() em api> = 21. Isso não é afetado por cochilar e tem o bônus adicional de colocar um ícone de despertador na bandeja do sistema.


O problema é o Smart Manager. A Samsung possui um gerenciador de bateria que às vezes desabilita a execução de alguns aplicativos em segundo plano. Ele tentou "retomar" ao voltar para o aplicativo, mas desativa completamente o aplicativo ou pode ser retomado a cada 5 minutos (dependendo de como a Samsung o possui).

Isso funcionaria em versões de estoque do Android, pois não há o Samsung Manager. Você também pode instalar a versão personalizada do Android, que possui alguns recursos para ativar o SM (dependendo da ROM).


Para Xiaomi, pode ser necessário ativar o AutoStart para seu aplicativo. Estou tentando fazer uma lista de modificações do Android (geralmente do fabricante do telefone) que podem afetar um processo em segundo plano. Se você tem algo novo, adicione uma resposta aqui Lista de assassinos de tarefas do Android


Qual versão do Android esses dispositivos estão executando?

A partir da API 23, o próprio sistema operacional entrará no modo ocioso de baixa energia quando não for utilizado por um tempo e, nesse modo, os alarmes não serão entregues. No entanto, existe uma maneira de os aplicativos dizerem explicitamente "Eu preciso que este alarme seja acionado no momento, independentemente do uso da bateria"; os novos métodos AlarmManager chamados setAndAllowWhileIdle() e setExactAndAllowWhileIdle() .

Pela sua descrição, parece que isso pode não ser a causa específica dos seus problemas em determinados dispositivos de OEMs, mas isso é algo que todos os desenvolvedores que usam o Gerenciador de Alarmes devem conhecer.

Por fim, muitos usos do Gerenciador de alarmes são melhor abordados usando os mecanismos do Agendador de tarefas. Para compatibilidade com versões anteriores, o "GCM Network Manager" dos Serviços do Play é realmente muito próximo ao Job Scheduler em funcionalidade - ele usa o Job Scheduler internamente em versões mais recentes do Android - e não é necessariamente sobre rede, apesar do nome da classe.


Use o AlarmManager para dispositivos <5.0 e o JobScheduler para dispositivos 5.0+. Não posso ter certeza de que o JobScheduler não será afetado pelas travessuras dos fabricantes, mas parece muito menos provável para mim, já que o Android está tentando afastar as pessoas do AlarmManager e do JobScheduler.

EDIT: O Google lançou uma solução WorkManager para esse problema chamada WorkManager . Ele abstrai várias estruturas de agendamento e usa a mais apropriada para o dispositivo.


parei de usar o AlarmManager há um tempo atrás ... uma alternativa melhor e mais estável

  1. criar um serviço
  2. registrar um BroadcastReceiver para BOOT_COMPLETED
  3. demitir seu serviço do receptor
  4. inicie um novo manipulador dentro do seu serviço que faça um loop a cada X minutos ( Android - executando um método periodicamente usando a chamada postDelayed () )
  5. verifique se chegou a hora de executar a tarefa: agora - tempo de execução> 0 ( Como encontrar a duração da diferença entre duas datas em java? )
  6. se assim for .. execute a tarefa e pare o manipulador

sim .. é uma dor .. mas o trabalho é feito NÃO IMPORTA O QUE





alarmmanager