Utilice alarmManager y el servicio para realizar la notificación de planificación sólo durante un período de tiempo específico

Estoy creando una aplicación que activará notificaciones en intervalos de tiempo específicos durante las horas de vigilia de los usuarios.

Tengo un alarmManager que funciona dentro de un servicio. El servicio se inicia explícitamente a través de un botón de clic en la actividad principal y tiene el alarmManager ejecutando notificaciones durante los inversores de tiempo específicos. ¿Cómo haría para detener las notificaciones durante ciertas horas del día? No quiero que se disparen estas notificaciones, por ejemplo, mientras el usuario está durmiendo.

Mi código que está actualmente disparando notificaciones a intervalos definidos por el usuario está por debajo (las importaciones eliminadas … esto ya es suficiente):

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 implementación de receptor de difusió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 envolviendo mi cerebro sobre cómo esto debe ser implementado.

Yo estaba pensando en volver a trabajar este código para que el alarmManager se disparó a la hora de vigilia y se detuvo en sleepTime, todo mientras dentro del servicio es un temporizador que dispara el método de notificación en intervalos específicos? ¿Hay una mejor manera de hacer esto?

Cualquier entrada sería apreciada. He estado tratando de resolver esto en mi cabeza durante días.

Gracias

EDIT: @ alguien 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 en suspensión (es decir … el usuario pone el teléfono en modo de espera). Por lo tanto, usar un temporizador para disparar notificaciones a intervalos de tiempo específicos no funcionará correctamente en un servicio porque cuando Android hace una pausa en el servicio, también hace una pausa en el temporizador, lo que desactiva el intervalo.

La forma correcta de hacerlo es usar AlarmManager con una matriz de intentos pendientes para establecer alarmas en momentos específicos durante el día. Esto asegura que incluso si el teléfono se pone en espera, las notificaciones (o lo que quieras que suceda en ese momento) todavía se ejecutará.

Yo estaba pensando en volver a trabajar este código para que el alarmManager se disparó a la hora de vigilia y se detuvo en sleepTime, todo mientras dentro del servicio es un temporizador que dispara el método de notificación en intervalos específicos? ¿Hay una mejor manera de hacer esto?

A mi mente, olvidarse de pensar en una "mejor" manera, parece ser la única manera. Utilizar un temporizador para controlar (activar / desactivar) otro temporizador no es tan extraño y tiene sentido para mí.

  • ¿Android AlarmManager controla los cambios de horario de verano?
  • AlarmManager no funciona en varios dispositivos
  • AlarmManager cuando se cierra la aplicación
  • Cómo configurar la alarma en Android?
  • Cancelar un AlarmManager pendienteIntent en otro pendienteintent
  • Android AlarmManager - RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP
  • Cómo configurar múltiples alarmas usando el administrador de alarmas de android
  • La alarma de AlarmManager se activa inmediatamente
  • Desarrollador de Android - Alarm manager vs service
  • ¿Cómo comprobar si AlarmManager ya tiene un conjunto de alarmas?
  • ¿Cómo guardar la alarma programada después de que la aplicación fue asesinada por Android o asesino de tareas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.