AlarmManager — är en Android-systemtjänst som låter appar utföra uppgifter vid en angiven tidpunkt, även om appen inte körs eller enheten är i viloläge. Till skillnad från JobScheduler eller WorkManager garanterar AlarmManager exakt utlösning, vilket gör den oumbärlig för alarm, kalenderpåminnelser och tidskritiska uppgifter. Enligt Android Developers, 2026, från och med Android 4.4 beter sig setRepeating som en inexakt upprepning, och för exakta alarm krävs setExact eller setAlarmClock.
Huvudpunkter
AlarmManager — är en Android-systemtjänst som tillhandahåller API för att schemalägga uppgifter med exakt eller ungefärlig utförandetid. Den har funnits sedan den första versionen av Android och är fortfarande det enda pålitliga sättet att utföra kod vid en given tidpunkt, oavsett appens och enhetens tillstånd.
Funktionsprincipen är enkel: appen skickar en PendingIntent till systemet med angivelse av utlösningstiden. När det önskade ögonblicket kommer skickar systemet en Intent till den registrerade BroadcastReceiver eller startar en Service. Även om enheten var i viloläge gör en WakeLock att processorn kan vakna och bearbeta händelsen.
Huvudanvändningsområdet för AlarmManager — uppgifter som kräver exakt tid: alarm, kalenderpåminnelser, start av långvariga operationer vid en viss tidpunkt. För uppgifter där precision inte är kritisk (synkronisering en gång om dagen) rekommenderar Google WorkManager eller JobScheduler eftersom de är mer energieffektiva.
AlarmManager tar emot från appen en PendingIntent och utlösningstiden. Systemet sparar denna begäran i sin interna schemaläggare och väcker processorn vid den angivna tiden för att leverera Intent. Utvecklaren måste i förväg registrera en BroadcastReceiver som kommer att bearbeta denna Intent.
AlarmManager stöder 4 alarmtyper: ELAPSED_REALTIME (tid sedan start, väcker inte), RTC (verklig tid, väcker inte), ELAPSED_REALTIME_WAKEUP (tid sedan start, väcker enheten) och RTC_WAKEUP (verklig tid, väcker). WAKEUP-versioner är nödvändiga om uppgiften måste utföras även när enheten sover.
| Typ | Tid | Väcker | Exempel |
|---|---|---|---|
| ELAPSED_REALTIME | sedan start | nej | driftstidstimer |
| RTC | Unix timestamp | nej | loggning |
| ELAPSED_REALTIME_WAKEUP | sedan start | ja | periodisk uppgift |
| RTC_WAKEUP | Unix timestamp | ja | alarm |
Från och med Android 12 (API 31) krävs behörigheten SCHEDULE_EXACT_ALARM för användning av exakta alarm (setExact). Användaren kan återkalla den via inställningarna. För appar som behöver ett exakt alarm med visning (till exempel klocka) används USE_EXACT_ALARM, som beviljas vid installation.
AlarmManager tillhandahåller tre huvudmetoder för att schemalägga uppgifter. Valet av metod bestämmer utlösningens precision och påverkan på enhetens energiförbrukning.
set — basmetoden för enstaka inexakt utlösning. Systemet kan flytta tiden med några minuter för gruppering med andra händelser. Lämplig för uppgifter där precision inte är kritisk: en påminnelse om att gå in i appen.
setRepeating — metoden för periodiska upprepningar. Från och med Android 4.4 (API 19) blev setRepeating inexakt — intervall kan variera. Systemet garanterar inte längre en konstant period. Istället för setRepeating rekommenderas setExact med manuell omplanering eller WorkManager med PeriodicWorkRequest.
setExact — metoden för exakt enstaka utlösning. Systemet väcker enheten så nära den angivna tiden som möjligt. setAlarmClock — ett specialfall av setExact, som även visar en alarmikon i statusfältet och har högst prioritet bland alla alarmtyper.
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// Exakt engångsalarm
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this, 0, intent,
PendingIntent.FLAG_IMMUTABLE
)
alarmManager.setAlarmClock(
AlarmManager.AlarmClockInfo(
targetTime, pendingIntent
),
pendingIntent
)
Typiskt scenario — skapa en daglig påminnelse vid en viss tidpunkt. För detta används RTC_WAKEUP med setExact. Vid utlösning startar BroadcastReceiver en notis eller Service. Efter bearbetning måste uppgiften omplaneras till nästa dag.
class ReminderReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE)
as NotificationManager
val notification = NotificationCompat.Builder(
context, "reminder_channel"
)
.setContentTitle("Påminnelse")
.setContentText("Det är dags att utföra uppgiften")
.setSmallIcon(R.drawable.ic_reminder)
.build()
notificationManager.notify(1001, notification)
}
}
För daglig upprepning används setExact med beräkning av nästa utlösning. I Intent kan flaggor skickas för identifiering av olika påminnelseyper. Se till att BroadcastReceiver är registrerad i AndroidManifest.xml med hantering av WAKEUP-åtgärden.
fun scheduleDailyReminder(context: Context, hour: Int, minute: Int) {
val calendar = Calendar.getInstance().apply {
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
if (before(Calendar.getInstance())) {
add(Calendar.DAY_OF_MONTH, 1)
}
}
val alarmManager =
context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
}
AlarmManager — ett kraftfullt men energikrävande verktyg. Varje WAKEUP-alarm väcker enheten från viloläge, vilket förbrukar batteri. Google rekommenderar att minimera användningen av exakta alarm och föredra setExactAndAllowWhileIdle på Android 6+ för att minska påverkan på Doze Mode. För periodiska uppgifter utan krav på precision, använd WorkManager med PeriodicWorkRequest, som inte kräver att enheten väcks och inte förbrukar batteri vid varje körning.
För att testa AlarmManager använder du TestAlarmManager från Android Test Framework. Det gör det möjligt att simulera alarmutlösning utan att vänta på verklig tid. I Robolectric finns ShadowAlarmManager tillgänglig, som fångar upp anrop till set, setExact och setRepeating och tillhandahåller metoder för tvångsutlösning och kontroll av antalet schemalagda uppgifter. För enhetstester av BroadcastReceiver använder du Robolectric.getForegroundScheduler(). Det finns även ett Espresso-test med IdlingResource tillgängligt som väntar på alarmutlösning i integrationstester.
Om appen använder AlarmManager för periodiska uppgifter som inte kräver exakt tid, överväg migrering till WorkManager. PeriodicWorkRequest med ett minimiintervall på 15 minuter ersätter setRepeating, medan WorkManager garanterar utförande efter omstart, hanterar Doze Mode och kräver inte behörigheten SCHEDULE_EXACT_ALARM. För tidskritiska uppgifter (alarm klockan 7 på morgonen) förblir AlarmManager det enda rätta valet. Den optimala strategin — använd AlarmManager endast för alarm med setAlarmClock och flytta alla andra bakgrundsuppgifter till WorkManager.
För periodiska uppgifter utan krav på precision använder du WorkManager med PeriodicWorkRequest. För uppgifter med exakt tid men inte kritiska för utlösning i viloläge — setExact utan WAKEUP. Och endast för alarm med obligatorisk väckning — setAlarmClock eller RTC_WAKEUP.
Det är också viktigt att kontrollera förekomsten av behörigheten SCHEDULE_EXACT_ALARM på Android 12+. Om behörigheten inte har beviljats kommer setExact att fungera som vanlig set (inexakt). Använd AlarmManager.canScheduleExactAlarms() för att kontrollera. Vid avsaknad av behörighet kan du föreslå att användaren går till inställningarna via Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM).
En kritisk viktig egenskap hos AlarmManager — alla schemalagda alarm återställs efter omstart av enheten. För att återställa dem måste du deklarera en BroadcastReceiver som bearbetar Intent.ACTION_BOOT_COMPLETED och omplanera alla aktiva alarm i onReceive-metoden. Utan detta kommer användaren att förlora alla påminnelser efter att ha stängt av och slagit på telefonen.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(
context: Context,
intent: Intent
) {
if (intent.action ==
Intent.ACTION_BOOT_COMPLETED
) {
val prefs =
context.getSharedPreferences("alarms", 0)
val savedTime =
prefs.getLong("next_alarm", 0L)
if (savedTime > System.currentTimeMillis()) {
scheduleReminder(context, savedTime)
}
}
}
}
I praktiken förblir AlarmManager den bästa lösningen för alarmappar, kalendrar, medicinpåminnelser och alla uppgifter där utlösningstiden är kritisk för användaren. För alla andra bakgrundsarbetsscenarier är WorkManager eller JobScheduler att föredra.
När du väljer mellan AlarmManager och WorkManager, följ regeln: om användaren uttryckligen har bett om en påminnelse klockan 14:30 — använd AlarmManager med setAlarmClock. Om uppgiften ska utföras “ungefär en gång i timmen” — WorkManager med PeriodicWorkRequest kommer att vara mer energieffektiv och pålitlig.
Vanliga frågor
Båda metoderna garanterar exakt utlösning, men setAlarmClock visar även en alarmikon i statusfältet och informerar systemet om att detta är ett alarm för användaren. På Android 6+ har setAlarmClock immunitet mot Doze Mode, medan setExact kan försenas.
Efter omstart återställs alla schemalagda alarm. För återställning måste du registrera en BroadcastReceiver för BOOT_COMPLETED-åtgärden och omplanera alla uppgifter i onReceive. Utan detta kommer inget alarm att fungera efter att enheten slagits på.
Från och med API 19 blev setRepeating inexakt — systemet kan flytta intervall för att spara energi. Använd istället setExact med manuell omplanering eller WorkManager med PeriodicWorkRequest, som ger mer förutsägbart beteende.
För setExact krävs behörigheten SCHEDULE_EXACT_ALARM, som användaren kan bevilja eller återkalla i inställningarna. För setAlarmClock med visning i klockgränssnittet används USE_EXACT_ALARM, som beviljas automatiskt vid installation från butiken.
Nej, AlarmManager fungerar alltid via PendingIntent. Det kan vara PendingIntent.getBroadcast för BroadcastReceiver, PendingIntent.getService för Service eller PendingIntent.getActivity för Activity. Utan PendingIntent kan systemet inte leverera händelsen till appen.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också