Utilisation alarmManager et le service pour procéder à l'annexe de la notification uniquement pendant la période de temps spécifique
Je suis en train de construire une application qui va déclencher des notifications en temps spécifique à intervalles réguliers pendant les utilisateurs de leurs heures de veille.
J'ai un alarmManager d'exécution à l'intérieur d'un service. Le service est explicitement lancé via le bouton cliquez sur le principal de l'activité et a la alarmManager l'exécution des notifications lors de temps spécifiques invervals. Comment pourrais-je aller sur l'arrêt des notifications pendant certaines heures de la journée? Je ne veux pas de ces notification à feu, par exemple, lorsque l'utilisateur est en sommeil.
Mon code qui est actuellement de tir des notifications à l'utilisateur de définir les intervalles ci-dessous (les importations supprimé....c'est assez long déjà):
public class FartSmackinChunks extends Service {
public Notification scheduleNotification;
public AlarmManager alarmScheduleManager;
public PendingIntent alarmScheduleIntent;
private Boolean autoUpdateBoolean = true;
private int intervalsGoneByInt = 0;
private Notification notification;
public static final int NOTIFICATION_ID = 1;
@Override
public void onCreate() {
//TODO: Actions to perform when service is created.
int icon = R.drawable.icon;
String tickerText = "INTERVAL FIRED";
long when = System.currentTimeMillis();
scheduleNotification = new Notification(icon, tickerText, when);
alarmScheduleManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
String ALARM_ACTION;
ALARM_ACTION = ScheduleAlarmReceiver.ACTION_REFRESH_SCHEDULE_ALARM;
Intent intentToFire = new Intent(ALARM_ACTION);
alarmScheduleIntent = PendingIntent.getBroadcast(this, 0, intentToFire,
0);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
SharedPreferences mySharedPreferences =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
boolean autoUpdateBoolean =
mySharedPreferences.getBoolean("storedAutoUpdateBoolean", false);
String updateFreq =
mySharedPreferences.getString("storedInitialAverageTimeInterval", "00:00:00");
SimpleDateFormat dfInterval = new SimpleDateFormat("hh:mm:ss");
Date intervalTimeAsDateObject = null;
long updateFreqMilliLong;
try {
intervalTimeAsDateObject = dfInterval.parse(updateFreq);
} catch (ParseException e) {
e.printStackTrace();
}
updateFreqMilliLong = intervalTimeAsDateObject.getTime() - 18000000;
if (autoUpdateBoolean) {
int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
long timetoRefresh = SystemClock.elapsedRealtime() +
updateFreqMilliLong;
alarmScheduleManager.setInexactRepeating(alarmType,
timetoRefresh, updateFreqMilliLong, alarmScheduleIntent);
notifications();
} else alarmScheduleManager.cancel(alarmScheduleIntent);
return Service.START_NOT_STICKY;
};
private void notifications() {
**notification stuff in here***
}
@Override
public IBinder onBind(Intent intent) {
//TODO: Replace with service binding implementation.
return null;
}
@Override
public void onDestroy() {
this.alarmScheduleManager.cancel(alarmScheduleIntent);
}
}
.....et mon récepteur de radiodiffusion de mise en œuvre ici:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class ScheduleAlarmReceiver extends BroadcastReceiver {
public static final String ACTION_REFRESH_SCHEDULE_ALARM
= "com.application.ACTION_REFRESH_SCHEDULE_ALARM";
@Override
public void onReceive(Context context, Intent intent) {
Intent startIntent = new Intent(context, SmokerReducerService.class);
context.startService(startIntent);
}
}
Je vais avoir un peu de difficulté habillage de mon cerveau autour de la façon dont cela devrait être mis en œuvre.
Je pensais à retravailler ce code afin que le alarmManager est tiré à waketime et s'est arrêté à sleepTime, tous tandis que dans le service est un Timer qui déclenche la méthode de notification, à des intervalles spécifiques? Est-il une meilleure façon d'aller à ce sujet?
Toute entrée serait appréciée. J'ai essayé de faire ce travail dans ma tête depuis des jours maintenant.
Grâce
EDIT:
@toute personne qui vient à travers ce l'intention d'utiliser une Minuterie pour les notifications quotidiennes:
Une minuterie qui s'exécute à l'intérieur d'un service sera mis en pause par le moteur d'exécution lorsque l'appareil est mis en veille (c'est à dire...l'utilisateur met le téléphone en mode veille). À cet effet, à l'aide d'une Minuterie pour feu des notifications à des intervalles de temps ne fonctionne pas correctement à l'intérieur d'un service parce que quand Android suspend le service, il est également pause le chronomètre, qui jette hors de l'intervalle.
La bonne façon de le faire est d'utiliser AlarmManager avec un tableau d'attente des intentions de définir des alarmes à des moments précis au cours de la journée. De cette façon, même si le téléphone est mis en veille, les notifications (ou ce que vous voulez arriver à l'époque) seront toujours exécutées.
mySharedPreferences.getBoolean
manquait - le // TODO: Actions to perform when service is created
est-elle nécessaire ? (en question, au moins - de l'autre TODO est Ok) Aussi pourquoi utiliser une (longue course) service ?J'ai fini par utiliser la AlarmManager de classe avec un tableau de l'attente intentions pour ce faire.
OriginalL'auteur dell116 | 2011-01-19
Vous devez vous connecter pour publier un commentaire.
À mon esprit, oubliez la pensée d'une "meilleure" façon, il semble que le seul moyen. À l'aide d'une minuterie pour contrôler (activer/désactiver) un autre timer n'est pas si étrange et prend tout son sens pour moi.
Pas de problème, j'essaie d'aider quand je peux. Sur cette question, pour simplifier les choses, il vous suffit d'étendre (plutôt que de les retravailler) votre code pour utiliser AlarmManager à la fois démarrer/arrêter votre service et fonctionnent également comme l'intérieur "timer". AlarmManager est, après tout, juste un point d'accès pour le système/dispositif les services d'alarme - même les services d'alarme qui réveiller les gens dans la matinée, fournir des rappels d'anniversaire, etc
En gros, j'ai fait ce que vous avez dit. Au lieu d'avoir le alarmManager déclencher des notifications à l'intérieur du service, j'ai enlevé le AlarmManager du service et utilisé un Timer à l'intérieur du service d'incendie des notifications à des intervalles définis par l'utilisateur. Dans mes paramètres principaux de l'activité, j'utilise un bouton pour tirer, le service ET le début de la AlarmManager. Puis, avec l'aide de l'Agenda, j'ai l'AlarmManager arrêter le service du prochain Agenda de la journée instance de la sleepHour et sleepMinute. Il fonctionne exactement comme je le voudrais. Une fois encore, merci à vous pour votre aide!
C'est bon à entendre, et je suis content d'avoir été un peu d'aide. Cheers!
Après le test de l'application pour un jour, j'ai trouvé que l'utilisation d'un Timer pour tirer les notifications ne fonctionnent pas parce qu'Android pauses services lorsque le téléphone passe en mode veille. Sans parler de la consommation de la batterie en forçant le service pour rester en cours d'exécution. J'ai trouvé que le réglage de l'alarme à l'aide de AlarmManager pour tous les événements de notification être la meilleure solution pour cette application. Et comme toujours, merci pour votre apport.
OriginalL'auteur Squonk