2011-01-19 12 views
11

Sto costruendo un'app che attiverà le notifiche a intervalli di tempo specifici durante le ore di attivazione degli utenti.Utilizzare alarmManager e il servizio per eseguire la notifica di pianificazione solo durante un periodo di tempo specifico

Ho un gestore di allarme in esecuzione all'interno di un servizio. Il servizio viene avviato esplicitamente tramite il clic del pulsante sull'attività principale e ha l'AlarmManager che esegue le notifiche durante invenzioni temporali specifiche. Come faccio ad arrestare le notifiche durante certe ore del giorno? Non voglio che queste notifiche vengano attivate, ad esempio, mentre l'utente sta dormendo.

Il mio codice che è attualmente sparando notifiche a intervalli impostati dall'utente è al di sotto (importazioni rimossi .... questo è abbastanza lungo già):

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); 
    } 
} 

..... e la mia implementazione ricevitore di broadcast qui :

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); 
    } 
} 

Sto avendo un po 'di difficoltà nel capire come dovrebbe essere implementato.

Stavo pensando di rielaborare questo codice in modo che l'AlarmManager sia attivato a waketime e fermato in sleepTime, mentre all'interno del servizio si trova un timer che attiva il metodo di notifica a intervalli specifici? C'è un modo migliore per fare questo?

Qualsiasi input sarebbe apprezzato. Ho cercato di risolverlo nella mia testa da giorni ormai.

Grazie

EDIT: @anyone chi si imbatte in questo con l'intenzione di utilizzare un timer per le notifiche giornaliere:

un timer che viene eseguito all'interno di un servizio verrà messo in pausa dal runtime quando il dispositivo è messo a dormire (cioè ... l'utente mette il telefono in standby). Pertanto, l'utilizzo di un timer per attivare notifiche a intervalli di tempo specifici non funzionerà correttamente all'interno di un servizio perché quando Android mette in pausa il servizio, mette anche in pausa il timer, che interrompe l'intervallo.

Il modo corretto per farlo è utilizzare AlarmManager con una serie di intenti in sospeso per impostare gli allarmi in momenti specifici durante il giorno. Ciò garantisce che anche se il telefono viene messo in standby, le notifiche (o qualsiasi altra cosa si voglia accadere in quel momento) verranno comunque eseguite.

+0

'mySharedPreferences.getBoolean' mancava - il' // TODO: Azioni da eseguire quando viene creato il servizio 'è necessario? (in questione almeno - l'altro TODO è Ok) Anche perché usare un servizio (di lunga durata)? –

+1

@Mr_and_Mrs_D - Ho finito per utilizzare la classe AlarmManager con una serie di intent in sospeso per farlo. – dell116

risposta

3

Stavo pensando a rielaborare il codice affinché l'AlarmManager è sparato a waketime e si fermò a sleepTime, il tutto mentre all'interno il servizio è un timer che spara il metodo di notifica a intervalli specifici? C'è un modo migliore per fare questo?

A mio parere, dimentica di pensare a un modo "migliore", sembra l'unico modo. Usare un timer per controllare (abilitare/disabilitare) un altro timer non è così strano e mi sembra completamente logico.

+0

Grazie per la risposta MisterSquonk. Non ho mai lavorato con AlarmManager, quindi questo è nuovo per me. Grazie per aver assicurato il mio pensiero. Penso che tu abbia risposto ad un altro mio thread. Grazie per essere stato utile. Il tuo contributo è molto apprezzato. – dell116

+0

@ dell116: Nessun problema, cerco di aiutare dove posso. In questo numero, per semplificare le cose, potresti semplicemente estendere (piuttosto che rielaborare) il tuo codice per utilizzare AlarmManager sia per avviare/interrompere il tuo servizio, sia per funzionare come "timer" interno. AlarmManager è, dopo tutto, solo un punto di accesso ai servizi di allarme del sistema/dispositivo - gli stessi servizi di allarme che svegliano le persone al mattino, forniscono promemoria di compleanno ecc. – Squonk

+0

Fondamentalmente ho fatto quello che hai detto. Invece di avere le notifiche di trigger AlarmManager all'interno del servizio, ho rimosso AlarmManager dal servizio e ho utilizzato un timer all'interno del servizio per attivare le notifiche agli intervalli definiti dall'utente. Nell'attività delle mie impostazioni principali, utilizzo un pulsante per attivare il servizio E l'avvio di AlarmManager. Quindi, con l'aiuto del Calandar, ho l'AlarmManager che interrompe il servizio alla prossima istanza del giorno Calandar di sleepHour e sleepMinute. Funziona esattamente come mi piacerebbe. Ancora una volta, grazie per il tuo aiuto! – dell116

Problemi correlati