Estoy creando una aplicación que activará las notificaciones a intervalos de tiempo específicos durante las horas de trabajo del usuario.Use alarmManager y el servicio para realizar notificaciones de programación solo durante un período de tiempo específico
Tengo un AlarmManager ejecutándose dentro de un servicio. El servicio se inicia explícitamente con un clic en el botón de la actividad principal y tiene el AlarmManager ejecutando notificaciones durante inverciones de tiempo específicas. ¿Cómo voy a detener las notificaciones durante ciertas horas del día? No quiero que se activen estas notificaciones, por ejemplo, mientras el usuario está durmiendo.
Mi código que actualmente está disparando las notificaciones a intervalos definidos por el usuario se encuentra por debajo (importaciones removidos .... este es el tiempo suficiente ya):
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);
}
}
..... y mi aplicación receptor de radiodifusión aquí :
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);
}
}
estoy teniendo un poco de dificultad para envolver mi cerebro en torno a cómo se debería implementar.
estaba pensando volver a trabajar este código para que el AlarmManager se cuece a waketime y se detuvo en Sleeptime, a la vez dentro del servicio es un temporizador que activa el método de notificación a intervalos específicos? ¿Hay una mejor manera de hacerlo?
Cualquier entrada sería apreciada. He estado tratando de resolver esto en mi mente durante días.
Gracias
EDIT: @anyone que viene a través de esta intención de utilizar un temporizador para las notificaciones diarias:
un temporizador que se ejecuta dentro de un servicio será detenido por el tiempo de ejecución cuando el dispositivo se pone a dormir (es decir ... el usuario pone el teléfono en modo de espera). Por lo tanto, el uso de un temporizador para disparar notificaciones a intervalos de tiempo específicos no funcionará correctamente dentro de un servicio porque cuando Android hace una pausa en el servicio, también detiene el temporizador, lo que cancela el intervalo.
La forma correcta de hacer esto es usar AlarmManager con una serie de intentos pendientes para establecer alarmas en momentos específicos durante el día. Esto garantiza que, incluso si el teléfono se pone en modo de espera, las notificaciones (o lo que quiera que suceda en ese momento) se ejecutarán.
'mySharedPreferences.getBoolean' was missing -' 'TODO: ¿Acciones para realizar cuando se crea el servicio? Es necesario? (al menos en cuestión, el otro TODO está bien) ¿Por qué usar un servicio (de larga duración)? –
@Mr_and_Mrs_D - Terminé usando la clase AlarmManager con una matriz de intenciones pendientes para hacer esto. – dell116