2011-01-19 17 views
11

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.

+0

'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)? –

+1

@Mr_and_Mrs_D - Terminé usando la clase AlarmManager con una matriz de intenciones pendientes para hacer esto. – dell116

Respuesta

3

Estaba pensando en volver a trabajar este código para que el alarmManager se active en waketime y se detenga en sleepTime, mientras está dentro del servicio hay un temporizador que dispara el método de notificación a intervalos específicos. ¿Hay una mejor manera de hacerlo?

En mi opinión, olvídate de pensar en una "mejor" manera, parece la única manera. Usar un temporizador para controlar (activar/desactivar) otro temporizador no es tan extraño y tiene mucho sentido para mí.

+0

Gracias por la respuesta MisterSquonk. No he trabajado anteriormente con AlarmManager, así que esto es nuevo para mí. Gracias por volver a asegurar mi línea de pensamiento. Creo que has respondido a otro hilo mío. Gracias por ser útil. Su opinión es muy apreciada. – dell116

+0

@ dell116: No hay problema, trato de ayudar donde puedo. Sobre este tema, para simplificar las cosas, simplemente podría extender (en lugar de volver a trabajar) su código para usar AlarmManager tanto para iniciar como detener su servicio y también funcionar como el 'temporizador' interno. AlarmManager es, después de todo, solo un punto de acceso a los servicios de alarma del sistema/dispositivo: los mismos servicios de alarma que despiertan a las personas en la mañana, proporcionan recordatorios de cumpleaños, etc. – Squonk

+0

Básicamente hice lo que usted dijo. En lugar de tener el AlarmManager disparando notificaciones dentro del servicio, eliminé el AlarmManager del servicio y usé un temporizador dentro del servicio para disparar las notificaciones en los intervalos definidos por el usuario. En mi actividad de configuración principal, utilizo un botón para iniciar el servicio Y el inicio del AlarmManager. Luego, con la ayuda de Calandar, tengo el AlarmManager para detener el servicio en la próxima instancia del día Calandar de la hora de dormir y la hora de dormir. Está funcionando exactamente como me gustaría. Una vez más, ¡gracias por tu ayuda! – dell116

Cuestiones relacionadas