Я обычно делаю что-то более похожее на:
Intent i = new Intent(this, MyService.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.cancel(pi); // cancel any existing alarms
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_DAY,
AlarmManager.INTERVAL_DAY, pi);
Таким образом, вам не нужно беспокоиться о переустановке AlarmManager
в вашем Service
.
Я обычно запускаю этот бит кода, когда мое приложение запускается (onResume
в моей основной деятельности) и в BroadcastReceiver
, настроенном на получение BOOT_COMPLETED
.
Я написал руководствоо создании Service
s и использовании AlarmManager
, основанном на моем собственном опыте и нескольких советах и уловках, которые я выбрал при просмотре речи ввода-вывода Google.Если вам интересно, вы можете прочитать это здесь .
Чтобы ответить на ваш вопрос ниже, все, что я могу сделать, это процитировать документы :
public void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
Расписание повторяющегося сигнала тревоги, который имеет неточные требования ко времени запуска;например, сигнал тревоги, который повторяется каждый час, но не обязательно в начале каждого часа.Эти аварийные сигналы более энергоэффективны, чем строгие повторения, предоставляемые setRepeating (int, long, long, PendingIntent), поскольку система может регулировать фазу аварийных сигналов, чтобы они срабатывали одновременно, избегая более полного выхода устройства из спящего режима.
Первый триггер вашего будильника не будет раньше запрошенного времени, но он может не срабатывать в течение почти полного интервала после этого времени.Кроме того, хотя общий период повторяющейся тревоги будет соответствовать запросу, время между любыми двумя последовательными срабатываниями тревоги может варьироваться.Если ваше приложение требует очень низкого дрожания, используйте вместо него setRepeating (int, long, long, PendingIntent).
В заключение, это не очень понятно.В документах только сказано, что будильник «может отличаться».Однако вам важно знать, что первый триггер может не срабатывать в течение почти полного интервала после этого времени .