Schedule Alarms in Android

The Alarm Manager allows to schedule the alarms based on time. An alarms can be one-time or repeated. By using the alarms we can perform tasks at certain point of time

We need to create a broadcast receiver which will be executed when the alarm was triggered.

app/src/main/java/com/example/app/AlarmReceiver.kt

package com.example.app

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log

class AlarmReceiver : BroadcastReceiver()
{
    override fun onReceive(context: Context, intent: Intent)
    {
        Log.d("MY_APP", "Alarm triggered")
    }
}

A newly created broadcast receiver should be registered in the manifest file.

app/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <application>
        <!-- ... -->
        <activity android:name=".MainActivity">
            <!-- ... -->
        </activity>
        <receiver android:name=".AlarmReceiver" />
    </application>

</manifest>

In order to schedule an alarm we need to create a PendingIntent. This intent can point to BroadcastReceiver. It receives broadcast from the system alarm service when the alarm was triggered.

The AlarmManager object contains some methods which are used to schedule alarms. The setInexactRepeating() method can be used to schedule the alarm which will be repeated based on specified interval.

Starting from Android 4.4 (API level 19), all the alarms are inexact. It was done to minimize device wakeups and save battery life.

Starting from Android 5.1 (API level 22), there is a minimum interval of 1 minute for repeating alarms.

Starting from Android 6.0 (API level 23), alarms do not triggered when the device is idle in doze mode. In this case we can use the setAndAllowWhileIdle() or setExactAndAllowWhileIdle() method to allow the execution of alarms when the device is in doze mode. To prevent alarms to fire off too frequently, the system triggers alarm not more than once per 15 minutes. There is no method to wake up the device while in doze mode for a repeating alarm.

app/src/main/java/com/example/app/MainActivity.kt

package com.example.app

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity()
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val requestCode = 1

        val intent = Intent(this, AlarmReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            this,
            requestCode,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT
        )

        val triggerTime = System.currentTimeMillis()
        val repeatInterval = 60000L // 1 minute

        val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        alarmManager.setInexactRepeating(
            AlarmManager.RTC_WAKEUP,
            triggerTime,
            repeatInterval,
            pendingIntent
        )
    }
}

Leave a Comment

Your email address will not be published. Required fields are marked *