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 createdest-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