Quando meu aplicativo é iniciado, quero verificar se um alarme específico (registrado pelo AlarmManager) já está definido e em execução. Os resultados do google parecem indicar que não há como fazer isso. Isso ainda está correto? Preciso fazer essa verificação para aconselhar o usuário antes que qualquer ação seja tomada para criar um novo alarme.
android
alarmmanager
Ron
fonte
fonte
Respostas:
Após o comentário publicado por Ron, aqui está a solução detalhada. Digamos que você registrou um alarme repetido com uma intenção pendente como esta:
A maneira como você verificaria se está ativo é:
A chave aqui é a
FLAG_NO_CREATE
que, conforme descrito no javadoc:if the described PendingIntent **does not** already exists, then simply return null
(em vez de criar um novo)fonte
alarmManager.cancel(pendingIntent)
ependingIntent.cancel()
para que esta solução retorne false.Para outras pessoas que possam precisar disso, aqui está uma resposta.
Usar
adb shell dumpsys alarm
Você pode saber que o alarme foi definido e quando eles vão alarmar e intervalo. Também quantas vezes esse alarme foi chamado.
fonte
adb shell dumpsys alarm | grep <e.g. package name of your app>
Também funciona em novos sistemas Windows (eu uso Win10)Exemplo de trabalho com o receptor (a resposta principal foi apenas com ação).
Vale mencionar:
Em resumo, seu PendingIntent deve ter os mesmos recursos (estrutura de operação e intenção) para assumir o controle sobre ele.
fonte
Observe esta citação dos documentos para o método definido do Gerenciador de alarmes:
Se você sabe que deseja definir o alarme, não precisa se preocupar em verificar se ele já existe ou não. Basta criá-lo sempre que seu aplicativo inicializar. Você substituirá todos os alarmes passados pelos mesmos
Intent
.Você precisa de uma abordagem diferente se estiver tentando calcular quanto tempo resta em um alarme criado anteriormente ou se realmente precisa saber se esse alarme existe. Para responder a essas perguntas, considere salvar dados pref compartilhados no momento em que você criou o alarme. Você pode armazenar o registro de data e hora do relógio no momento em que o alarme foi definido, a hora em que espera que o alarme seja disparado e o período de repetição (se você configurar um alarme repetido).
fonte
Eu tenho 2 alarmes. Estou usando intenção com extras em vez de ação para identificar os eventos:
o fato é que, com diff extras, a intenção (e o alarme) não serão únicos. Então, para identificar qual alarme está ativo ou não, tive que definir diff
requestCode
-s:e aqui está como o alarme foi criado:
fonte
PendingIntent.getService
Acabei de encontrar outra solução, parece funcionar para mim
fonte
Embora quase todo mundo aqui tenha dado a resposta correta, nenhum organismo explicou em que base os Alarmes funcionam
Você pode realmente aprender mais sobre
AlarmManager
e sobre como está funcionando aqui . Mas aqui está a resposta rápidaVocê vê
AlarmManager
basicamente programaçõesPendingIntent
em algum momento no futuro. Portanto, para cancelar o alarme programado, você precisa cancelar oPendingIntent
.Sempre anote duas coisas ao criar o arquivo
PendingIntent
PendingIntent
Agora, para verificar se o alarme já está agendado ou para cancelar o alarme, você só precisa ter acesso ao mesmo
PendingIntent
. Isso pode ser feito se você usar o mesmo código de solicitação e usarFLAG_NO_CREATE
como mostrado abaixoCom
FLAG_NO_CREATE
ele retornaránull
se oPendingIntent
já não existir. Se ele já existir, retornará referência ao existentePendingIntent
fonte
Eu criei um script bash simples (estúpido ou não), que extrai os longos do shell adb, os converte em carimbos de data e hora e mostra em vermelho.
tente ;)
fonte
FLAG_NO_CREATE não é criar intenção pendente, de modo a fornecer um valor booleano falso.
Depois que o AlarmManager verifica o valor de Intenção pendente, ele é verdadeiro porque o AlarmManager atualiza o sinalizador de Intenção pendente.
fonte
Estou com a impressão de que não há como fazer isso, seria bom.
Você pode obter um resultado semelhante tendo um Alarm_last_set_time gravado em algum lugar e tendo um On_boot_starter BroadcastReciever: BOOT_COMPLETED meio que.
fonte