Я создаю приложение, которое будет запускать уведомления с определенными временными интервалами во время пробуждения пользователей.
У меня есть alarmManager, работающий внутри службы. Служба явно запускается с помощью нажатия кнопки на основном мероприятии и имеет alarmManager, выполняющий уведомления в течение определенных интервалов времени. Как я могу остановить уведомления в течение определенных часов дня? Я не хочу, чтобы это уведомление было запущено, например, пока пользователь спал.
Мой код, который в настоящее время запускает уведомления с установленными пользователем интервалами, ниже (импорт удален... это уже достаточно долго):
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);
}
}
..... и реализация моего широковещательного приемника здесь:
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);
}
}
У меня возникли трудности с переносом моего мозга вокруг того, как это должно быть реализовано.
Я думал переработать этот код, чтобы alarmManager был запущен в waketime и остановился в sleepTime, и все же внутри службы есть таймер, который запускает метод уведомления через определенные промежутки времени? Есть ли лучший способ сделать это?
Любой ввод будет оценен. Я пытался это сделать в голове уже несколько дней.
Спасибо
EDIT: @anyone, который сталкивается с этим, намереваясь использовать таймер для ежедневных уведомлений:
Таймер, который запускается внутри службы, приостанавливается во время выполнения, когда устройство укладывается в режим ожидания (то есть... пользователь помещает телефон в режим ожидания). Поэтому использование таймера для уведомления об ошибках в определенные промежутки времени не будет работать правильно в службе, потому что, когда Android приостанавливает обслуживание, он также приостанавливает таймер, который отбрасывает интервал.
Правильный способ сделать это - использовать AlarmManager с массивом ожидающих намерений для установки сигналов тревоги в определенное время в течение дня. Это гарантирует, что даже если телефон переведен в режим ожидания, уведомления (или все, что вы хотите сделать в это время) будут выполняться.