Je souhaite implémenter une fonction de planification dans mon projet. J'ai donc recherché un programme de gestion des alarmes sur Google, mais je ne trouve aucun exemple.
Quelqu'un peut-il m'aider avec un programme de gestion d'alarmes de base?
java
android
kotlin
alarmmanager
Rajamohan Sugumaran
la source
la source
Réponses:
C'est du code qui fonctionne. Il réveille le processeur toutes les 10 minutes jusqu'à ce que le téléphone s'éteigne.
Ajoutez à Manifest.xml:
Code dans votre classe:
Régler l'alarme du service:
Si vous souhaitez définir la répétition de l'alarme au démarrage du téléphone:
Ajoutez l'autorisation et le service à Manifest.xml:
Et créez une nouvelle classe:
la source
am.setInexactRepeating(...)
afin que le téléphone ne soit pas réveillé inutilement à cause du service. Les autres programmeurs devraient prendre note de ce fait. 2. Au lieu de créer un nouveauAlarm
dansAutoStart
la réception de l'RECEIVE_BOOT_COMPLETED
intention, il serait plus logique de commencer àYourService
partirAutoStart
, comme indiqué ici: stackoverflow.com/a/5439320/198348WakefulBroadcastReceiver
à partir deAndroid O
J'ai essayé la solution de XXX et alors qu'elle fonctionnait initialement, à un moment donné, elle a cessé de fonctionner. Le
onReceive
n'a jamais été rappelé. J'ai passé des heures à essayer de comprendre ce que cela pouvait être. Ce que j'ai réalisé, c'est queIntent
pour une raison mystérieuse, on ne l'appelait plus. Pour contourner cela, j'ai découvert que vous devez vraiment spécifier une action pour le récepteur dans le manifeste. Exemple:Notez que le nom est
".Alarm"
avec le point. Dans lasetAlarm
méthode XXX , créez leIntent
comme suit:Le
START_ALARM
message peut être ce que vous voulez qu'il soit. Je viens de lui donner ce nom à des fins de démonstration.Je n'ai pas vu de récepteurs définis dans le manifeste sans filtre d'intention qui spécifie l'action. En les créant comme XXX l'a spécifié, cela semble un peu faux. En spécifiant le nom de l'action, Android sera obligé de créer une instance de l'
BroadcastReceiver
utilisation de la classe qui correspond à l'action. Si vous comptez sur le contexte, sachez qu'Android a plusieurs objets différents qui sont TOUS appelés contexte et peuvent ne pas entraîner laBroadcastReceiver
création de votre objet . Forcer Android à créer une instance de votre classe en utilisant uniquement le message d'action est bien mieux que de se fier à un contexte incertain qui pourrait ne jamais fonctionner.la source
PendingIntent.getBroadcast
documentation,For 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"
nécessaire pour que cela fonctionne?Voici un exemple assez autonome. Il devient rouge après 5 secondes.
N'oubliez pas cependant que AlarmManager se déclenche même lorsque votre application n'est pas en cours d'exécution. Si vous appelez cette fonction et appuyez sur le bouton Accueil, attendez 5 secondes, puis revenez dans votre application, le bouton sera devenu rouge.
Je ne sais pas quel type de comportement vous obtiendriez si votre application n'était pas du tout en mémoire, alors faites attention au type d'état que vous essayez de préserver.
la source
RTC_WAKEUP
au lieu deELAPSED_REALTIME_WAKEUP
) ne semble pas déclencher le récepteur dans une application qui a apparemment été déchargée par le système pour économiser de l'énergie, bien que cela fonctionne peu de temps après que l'écran d'accueil a été mis au premier plan.MainActivity.java
MyBroadcastReceiver.java
AndroidManifest.xml
la source
•
AlarmManager
en combinaison avecIntentService
Je pense que le meilleur modèle d'utilisation
AlarmManager
est sa collaboration avec unIntentService
. LeIntentService
est déclenché par leAlarmManager
et il gère les actions requises via l'intention de réception. Cette structure n'a pas d'impact sur les performances comme l'utilisationBroadcastReceiver
. J'ai développé un exemple de code pour cette idée danskotlin qui est disponible ici:MyAlarmManager.kt
MyIntentService.kt
manifest.xml
Usage:
Si vous souhaitez annuler l'alarme programmée, essayez ceci:
la source
Ce code vous aidera à faire une alarme répétitive. Le temps de répétition peut être défini par vous.
activity_main.xml
MainActivity.java
Si vous n'avez besoin d'une alarme que pour une seule fois, remplacez-la
avec
la source
J'ai fait ma propre implémentation pour le faire de la manière la plus simple possible.
La seule étape suivante, l'implémenter.
J'aime travailler avec cette implémentation, mais un autre bon moyen possible, c'est de ne pas rendre la
AbstractSystemServiceTask
classe abstraite et de la construire via un Builder.J'espère que cela vous aidera.
MISE À JOUR Amélioré pour permettre plusieurs
BackgroundTaskListener
sur le mêmeBroadCastReceiver
.la source
Gestionnaire d'alarmes:
Ajouter à la mise en page XML (* initiez cette vue sur la création dans l'activité principale)
Ajouter au manifeste (étiquette d'application intérieure et activité extérieure)
Créez la classe AlarmBroadcastManager (héritez-la de BroadcastReceiver)
Dans l'activité principale (ajoutez ces fonctions):
la source
Voici un exemple avec Alarm Manager utilisant Kotlin:
la source