Повторение фоновой службы с использованием Alarm Manager - PullRequest
0 голосов
/ 29 мая 2020

В настоящее время я работаю над новым проектом android, который использует фоновую службу. Потому что android version> = Oreo автоматически убивает службу. Поэтому я использую AlarmManager. Мне нужно отображать уведомление о точном времени. Время для уведомления устанавливается в общих настройках. Мой обработчик аварийных сигналов следует

class AlarmHandler {
    private Context context;
    AlarmHandler(Context context){
        this.context=context;
    }
    void setAlarmManager(){
        Intent intent=new Intent(context,NotificationService.class);
        PendingIntent pendingIntent=PendingIntent.getBroadcast(context,2,intent,0);
        AlarmManager alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        if(alarmManager!=null){
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,5000,60000,pendingIntent);
        }
    }
    void cancelAlarmManager(){
        Intent intent=new Intent(context,NotificationService.class);
        PendingIntent pendingIntent=PendingIntent.getBroadcast(context,2,intent,0);
        AlarmManager alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        if(alarmManager!=null){
            alarmManager.cancel(pendingIntent);
        }
    }
}

Моя служба уведомлений следует

public class NotificationService extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String t1=timeFromsharedPreferences("t1");
        String t2=timeFromsharedPreferences("t2");
        String systemTime=getCurrentTime();
        if(systemTime.equals(t1)){
            notify();
        }else if(systemTime.equals(t2)){
            notify();
        }
    }
}

Я запускаю AlarmHandler, используя следующий код

AlarmHandler alarmHandler=new AlarmHandler(this);
alarmHandler.cancelAlarmManager();
alarmHandler.setAlarmManager();

Я также регистрирую приемник широковещательной передачи как показано ниже

<receiver android:name=".NotificationService" android:enabled="true" />

Моя проблема в том, что иногда я пропускаю мое уведомление. Время запланировано на 22:00 и 7:00. Уведомление приходит в 22:00 (обратите внимание, что я использую телефон в 22:00 или использую за несколько минут до 22:00). Но уведомление в 7:00 приходит не все время. Также обратите внимание, что мне нужно получать уведомления каждый день в одно и то же время. Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 29 мая 2020

У вас не может быть повторяющегося точного будильника. Если вам нужно, чтобы он повторялся с точными интервалами, вам необходимо установить точный будильник на 1-й интервал, затем повторно активировать будильник, когда он сработает, чтобы он был активирован на следующий интервал, и продолжайте повторять этот процесс.

Edit:

нужно сделать что-то вроде этого

1.- compute delta in millis to next interval
2.- set exact alarm to fire in delta millis
3.- when the alarm fires, handle the event and then go to step 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...