Используйте alarmManager и службу для выполнения уведомления о расписании только в течение определенного периода времени

Я создаю приложение, которое будет запускать уведомления с определенными временными интервалами во время пробуждения пользователей.

У меня есть 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 с массивом ожидающих намерений для установки аварийных сигналов в определенное время в течение дня. Это гарантирует, что даже если телефон переведен в режим ожидания, уведомления (или все, что вы хотите сделать в это время) все равно будут выполнены.

Я думал переработать этот код, чтобы alarmManager был запущен в waketime и остановился в sleepTime, и все время внутри службы есть таймер, который запускает метод уведомления через определенные промежутки времени? Есть ли лучший способ сделать это?

На мой взгляд, забывайте думать о «лучшем» способе, это единственный способ. Использование таймера для управления (включение / выключение) другого таймера не так странно и имеет для меня полный смысл.