Eu quero implementar uma função de cronograma no meu projeto. Pesquisei no Google um programa de gerenciamento de alarmes, mas não consigo encontrar nenhum exemplo.
Alguém pode me ajudar com um programa básico de gerenciamento de alarmes?
java
android
kotlin
alarmmanager
Rajamohan Sugumaran
fonte
fonte
Respostas:
Este é um código de trabalho. Ele ativa a CPU a cada 10 minutos até o telefone desligar.
Adicione ao Manifest.xml:
Código na sua classe:
Definir alarme de serviço:
Se você deseja definir a repetição do alarme no momento da inicialização do telefone:
Adicione permissão e o serviço ao Manifest.xml:
E crie uma nova classe:
fonte
am.setInexactRepeating(...)
para que o telefone não seja desnecessariamente acordado por causa do serviço. Outros programadores devem observar esse fato. 2. Em vez de criar um novoAlarm
emAutoStart
cima de receber oRECEIVE_BOOT_COMPLETED
intento, pode fazer mais sentido para começarYourService
a partirAutoStart
, como mostrado aqui: stackoverflow.com/a/5439320/198348WakefulBroadcastReceiver
retirado deAndroid O
Tentei a solução do XXX e, embora funcionasse inicialmente, em algum momento parou de funcionar. O
onReceive
nunca foi chamado novamente. Passei horas tentando descobrir o que poderia ser. O que eu percebi é que,Intent
por alguma razão misteriosa, não estava mais sendo chamada. Para contornar isso, descobri que você realmente precisa especificar uma ação para o destinatário no manifesto. Exemplo:Observe que o nome está
".Alarm"
com o ponto final. NosetAlarm
método de XXX , crie oIntent
seguinte:A
START_ALARM
mensagem pode ser o que você quiser. Eu apenas dei esse nome para fins de demonstração.Não vi receptores definidos no manifesto sem um filtro de intenção que especifica a ação. Criá-los da maneira que o XXX especificou, parece meio falso. Ao especificar o nome da ação, o Android será forçado a criar uma instância do
BroadcastReceiver
uso da classe que corresponde à ação. Se você confiar no contexto, lembre-se de que o Android tem vários objetos diferentes, todos chamados de contexto e podem não resultar na suaBroadcastReceiver
criação. Forçar o Android a criar uma instância da sua classe usando apenas a mensagem de ação é muito melhor do que confiar em algum contexto duvidoso que talvez nunca funcione.fonte
PendingIntent.getBroadcast
documentaçãoFor security reasons, the Intent you supply here should almost always be an explicit intent, that is specify an explicit component to be delivered to through Intent.setClass
,.android:exported="true"
necessário para que funcione?Aqui está um exemplo bastante independente. Acende um botão vermelho após 5 segundos.
Lembre-se, porém, que o AlarmManager é acionado mesmo quando seu aplicativo não está sendo executado. Se você chamar essa função e pressionar o botão Início, aguarde 5 segundos e volte para o aplicativo, o botão ficará vermelho.
Não sei que tipo de comportamento você teria se seu aplicativo não estivesse na memória, portanto, tenha cuidado com o tipo de estado que você tenta preservar.
fonte
RTC_WAKEUP
vez deELAPSED_REALTIME_WAKEUP
) não aciona o receptor em um aplicativo que aparentemente foi descarregado pelo sistema para economizar energia, embora funcione logo após a tela inicial ter sido trazida para o primeiro plano.MainActivity.java
MyBroadcastReceiver.java
AndroidManifest.xml
fonte
•
AlarmManager
em combinação comIntentService
Eu acho que o melhor padrão para usar
AlarmManager
é a colaboração com umIntentService
. OIntentService
é acionado peloAlarmManager
e lida com as ações necessárias através da intenção de recebimento. Essa estrutura não tem impacto no desempenho como o usoBroadcastReceiver
. Eu desenvolvi um código de exemplo para essa ideia emkotlin disponível aqui:MyAlarmManager.kt
MyIntentService.kt
manifest.xml
Uso:
Se você deseja cancelar o alarme agendado, tente o seguinte:
fonte
Este código o ajudará a fazer um alarme repetido. O tempo de repetição pode ser definido por você.
activity_main.xml
MainActivity.java
Se você precisar de alarme apenas por uma única vez, substitua
com
fonte
Fiz minha própria implementação para fazer isso da maneira mais simples possível.
O único próximo passo, implemente-o.
Eu gosto de trabalhar com esta implementação, mas de outra maneira possível: não tornar a
AbstractSystemServiceTask
classe abstrata e construí-la através de um Builder.Espero que ajude você.
ATUALIZADO Melhorado para permitir vários
BackgroundTaskListener
no mesmoBroadCastReceiver
.fonte
Gerenciador de alarmes:
Adicionar ao layout XML (* inicie essas visualizações na criação na atividade principal)
Adicionar ao manifesto (tag do aplicativo interno e & atividade externa)
Criar classe AlarmBroadcastManager (herdá-la de BroadcastReceiver)
Na atividade principal (adicione estas funções):
fonte
Aqui está um exemplo com o Alarm Manager usando o Kotlin:
fonte