Obecnie próbuję napisać menedżera alarmów, który wyłączy alarm w określonym czasie, codziennie. Najpierw należy sprawdzić, czy użytkownik miał Ustaw alarm na tym, że na dzień:Jak ustawić cykliczny menedżer alarmów do wykonywania kodu codziennie
if ((User.getReminderTime(Home.this) > 0)
&& (dt.getDate() != today.getDate() || dt.getDay() != today
.getDay())) {
AppointmentManager.setFutureAppointmentCheck(this
.getApplicationContext());
User.setLongSetting(this, "futureappts", today.getTime());
}
potem pójdę i określić rzeczywisty alarm zgaśnie między 12 a 12:10 następnego dnia:
public static void setFutureAppointmentCheck(Context con) {
AlarmManager am = (AlarmManager) con
.getSystemService(Context.ALARM_SERVICE);
Date futureDate = new Date(new Date().getTime() + 86400000);
Random generator = new Random();
futureDate.setHours(0);
futureDate.setMinutes(generator.nextInt(10));
futureDate.setSeconds(0);
Intent intent = new Intent(con, FutureAppointmentReciever.class);
PendingIntent sender = PendingIntent.getBroadcast(con, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
am.set(AlarmManager.RTC_WAKEUP, futureDate.getTime(), sender);
}
Teraz konfiguruję środowisko testowe, aby to się włączało co dwie minuty i wygląda na to, że działa dobrze, ale kiedy wdrażam urządzenie, urządzenie wydaje się nie odbierać alarmów. Pomyślałem, że może to być problem z uśpionym urządzeniem, więc dodałem menedżera zasilania. Ale to nadal nie działa:
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "keepAlive");
wl.acquire();
setFutureAppointments(context.getApplicationContext());
AppointmentManager.setFutureAppointmentCheck(context
.getApplicationContext());
User.setLongSetting(context.getApplicationContext(), "futureappts",
new Date().getTime());
wl.release();
ktoś widział cokolwiek robie rażąco błędne lub będę o tym niepoprawnie? dzięki za wszelką pomoc.
myślę, że usługa może być więcej niż muszę za to, co robię, ale Twój blog był dobry czytać! Czy zdajesz sobie sprawę z tego, ile zwykle ma offset SetInexactRepeating? – ninjasense
Edytowałem swoją odpowiedź, aby wyjaśnić problem 'setInexactRepeating'. – Felix
jako bonus, zamiast anulować przed ustawieniem nowego, można pobrać parametr PendingIntent z PendingIntent.FLAG_CANCEL_CURRENT jako ostatni parametr, który ma taki sam efekt. – nsL