1

Je développe une application Android qui envoie toutes les 5 minutes un message à un serveur afin que le serveur puisse vérifier si le téléphone est connecté ou non. J'utilise AlarmManager, en envoyant une diffusion PendingIntent à un BroadcastReceiver qui envoie un message à un serveur.Le problème est que ce ne sont pas toujours en cours d'exécution:AlarmManager n'est pas toujours en cours d'exécution

Intent myIntent = new Intent(Inicio.this, NetworkStatusReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(Inicio.this, 
                 0, 
                 myIntent, 
                 0); 
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
int interval = 60000*5; 
manager.setRepeating(AlarmManager.RTC_WAKEUP, 
        System.currentTimeMillis(), 
        interval, 
        pendingIntent); 

est la classe AlarmManager la bonne façon de le faire?

Parce que j'ai fait des recherches sur les versions Android 5.0+ et la gestion de l'alimentation est différente des versions antérieures android. Peut-être que l'option AlarmManager.RTC_WAKEUP ne fonctionne pas sur les versions Android 5.0+.

+0

Est-il arrivé dans un téléphone spécifique? – Saveen

+0

@ Save L'application est utilisée sur différents appareils avec différentes versions Android. Principalement 5.0.2 ou 6. + (il y a quelques vieux appareils qui fonctionnent 4. +, avec ceux-là, il semble que ça marche!) –

Répondre

0

J'ai fait quelques recherches et j'ai trouvé quelque chose qui semble fonctionner. Depuis ce matin, je l'ai mis en place et le comportement s'est beaucoup amélioré. Je me suis rendu compte qu'avec un BroadcastReceiver je pourrais juste placer l'alarme une fois et placer une autre alarme encore sur le BroadcastReceiver lui-même quand l'alarme était déclenchée.

J'ai aussi utilisé le drapeau PendingIntent.FLAG_UPDATE_CURRENT pour la PendingIntent (puisque l'alarme PendingIntent peut être déclenché à partir de différentes activités)

Le code pour la Activity serait quelque chose comme ceci:

Intent myIntent = new Intent(context, NetworkStatusReceiver.class); 
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    final AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    manager.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + timeInMillis, pendingIntent); 

Et le code pour la méthode BroadcastReceiver.OnReceive() serait le même code de sorte que l'alarme déclenche à nouveau tous les System.currentTimeMillis() + timeInMillis (créant ainsi la méthode)

De cette façon, il semble que l'alarme est toujours déclenchée depuis (je pense) set() méthode de AlarmManager fonctionne très bien avec une version Android.