AlarmManager: nyckelbegrepp och arbete med alarm

Författare: IT Sectr Publicerad: 2026-03-28 Lästid: 8 min

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 för att utföra uppgifter vid exakt tid, som fungerar även i viloläge.
  • Alarmtyper inkluderar ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP och RTC_WAKEUP — med och utan väckning.
  • setExact garanterar exakt utlösning på Android 4.4+, men förbrukar mer batteri.
  • setAlarmClock — den enda metoden som systemet garanterat utför i tid på Android 6+.
  • Från och med Android 12 krävs behörigheten SCHEDULE_EXACT_ALARM för exakta alarm.

Vad är AlarmManager?

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.

Hur fungerar AlarmManager?

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.

Alarmtyper

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.

TypTidVäckerExempel
ELAPSED_REALTIMEsedan startnejdriftstidstimer
RTCUnix timestampnejloggning
ELAPSED_REALTIME_WAKEUPsedan startjaperiodisk uppgift
RTC_WAKEUPUnix timestampjaalarm

Behörigheter och rättigheter

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.

Metoderna set, setRepeating och setExact

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.

kotlin
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
)

Exempel på AlarmManager-användning

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.

kotlin
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.

kotlin
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
    )
}

Optimering och rekommendationer

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.

Testa AlarmManager i enhetstester

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.

Migrera från AlarmManager till WorkManager

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).

Hantera BOOT_COMPLETED för återställning av 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.

kotlin
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

Vad är skillnaden mellan setExact och setAlarmClock?

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.

Hur beter sig AlarmManager efter omstart av enheten?

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å.

Varför rekommenderas inte setRepeating på Android 4.4+?

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.

Vilken behörighet krävs för exakta alarm på Android 12+?

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.

Kan AlarmManager användas utan PendingIntent?

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

  • AlarmManager — Android-systemtjänst för att utföra uppgifter vid exakt tid med möjlighet att väcka enheten.
  • Fyra typer av alarm — ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP och RTC_WAKEUP — täcker olika scenarier.
  • setExact och setAlarmClock — de enda metoderna för exakt utlösning på moderna Android-versioner.
  • setRepeating är föråldrat på Android 4.4+ — använd setExact med manuell omplanering.
  • Behörigheten SCHEDULE_EXACT_ALARM är obligatorisk på Android 12+ för exakta alarm.
  • WorkManager eller JobScheduler är att föredra för inexakta bakgrundsuppgifter utan tidskrav.
  • Glöm inte att hantera BOOT_COMPLETED för återställning av alarm efter omstart av enheten.

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.

Diskutera projektet

Läs också