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.
'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)? –
@Mr_and_Mrs_D - Ho finito per utilizzare la classe AlarmManager con una serie di intent in sospeso per farlo. – dell116