Android Alaram Manager - How to create Background task with alarm manager using Kotlin.
Last updated Dec 23, 2021 In this android example tutorial, we will learn how to create background task with alarm manager in android studio using kotlin language.
AlarmManager: AlarmManager acts as a link between the application and the Android system alarm service. It can send a broadcast to your app (which the user can entirely discontinue) at a certain time, and your app can then conduct any task as a result. The system can postpone any alarm in order to improve device performance.
Task scheduling is occasionally necessary. For example, your apps may be required to perform a specific task on a daily basis at a time specified by the user. Then we may use Android's AlarmManager to do it. So let's get started.
Implementation:
Step 1. Create a new Project in android studio.
Go to File > New > New Project > Google Maps Activity > Next > Enter Name > Select Language Kotlin > Finish.
|
After creating the new project, Android Studio starts Gradle and builds your project, which may take a few seconds.
Step2. The following UI will be created within activity_main.xml file. We only have a TimePicker and a Button in this case.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="10dp"
android:orientation="vertical"
tools:context=".MainActivity">
<TimePicker
android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/buttonAlarm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Set Alarm" />
</LinearLayout>
|
TimePicker: The Android TimePicker is a user interface control that allows you to select the time in 24-hour format or AM/PM mode. It is utilised in our application to verify that users select the correct time for the day.
Above xml code will give you output like this.
Step 3. Create a new kotlin file in project name AlarmReceiver.
app > java > com.example.alarmmanager > right-click > new > Kotlin Class/File > Enter Name (AlarmReceiver) > Enter.
|
Step 4. Open AlarmReceiver.kt file and add the following code
class AlarmReciever : BroadcastReceiver() {
override fun onReceive(p0: Context?, p1: Intent?) {
//you can check the log that it is fired
//Here we are actually not doing anything
//but you can do any task here that you want to be done at a specific time everyday
Log.d("MyAlarm", "Alarm is just fired");
}
}
|
Broadcast Receivers merely reply to broadcast messages sent by other apps or the system. These signals are sometimes referred to as happenings or intentions. A broadcast receiver is implemented as a subclass of BroadcastReceiver class and overriding the onReceive() method where each message is received as a Intent object parameter.
Step 5. Registering BroadcastReceiver
This BroadcastReceiver must also be registered in the Manifest file. So, in the AndroidManifest.xml file, immediately before the tag.
<receiver
android:name=".AlarmReciever"
android:enabled="true"
android:exported="true" /> |
Step 6. Go to MainActivity.kt file and add the following code
Instantiate the views by its unique id of TimePicker and Button.
val timePicker = findViewById(R.id.timePicker)
val setAlarm = findViewById(R.id.buttonAlarm)
|
Attach onClick event on button
setAlarm.setOnClickListener(object : View.OnClickListener {
override fun onClick(view: View?) {
//We need a calendar object to get the specified time in millis
//as the alarm manager method takes time in millis to setup the alarm
val calendar: Calendar = Calendar.getInstance()
if (Build.VERSION.SDK_INT >= 23) {
calendar.set(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
timePicker.hour,
timePicker.minute,
0
)
} else {
calendar.set(
//Calculating the current year i.e. 2022
calendar.get(Calendar.YEAR),
// Calculating the current month i.e. Jan (01)
calendar.get(Calendar.MONTH),
// Day of month i.e. Thursday
calendar.get(Calendar.DAY_OF_MONTH),
// Current hour i.e. 10
timePicker.currentHour,
// Current minute i.e. 10:20
timePicker.currentMinute,
0
)
}
setAlarm(calendar.getTimeInMillis())
}
})
|
Build.VERSION>SDK_INT >= 23 (Check if we're running on Android 6.0 or higher)
Create a function setAlarm for setting up the alarm
private fun setAlarm(time: Long) {
//getting the alarm manager
val am = getSystemService(ALARM_SERVICE) as AlarmManager
//creating a new intent specifying the broadcast receiver
val i = Intent(this, AlarmReciever::class.java)
//creating a pending intent using the intent
val pi = PendingIntent.getBroadcast(this, 0, i, 0)
//setting the repeating alarm that will be fired every day
am.setRepeating(AlarmManager.RTC, time, AlarmManager.INTERVAL_DAY, pi)
Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show()
}
|
Step 7. Now run the app in your emulator or real device, you will get the following output:
OUTPUT:
Even if you close your application after setting the alarm. The method will be called at the time indicated. And as a scheduled task, you can perform whatever you want. Right now, it will do nothing and will output a message to the log, as shown below.
Complete Source Code of Alarm Manager Example:
activity_main.xml file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="10dp"
android:orientation="vertical"
tools:context=".MainActivity">
<TimePicker
android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/buttonAlarm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Set Alarm" />
</LinearLayout>
|
MainActivity.kt file
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import android.os.Build
import android.view.View
import android.widget.Button
import android.widget.TimePicker
import java.util.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Instantiate the views TimePicker and Button
val timePicker = findViewById(R.id.timePicker)
val setAlarm = findViewById(R.id.buttonAlarm)
//attaching clicklistener on setAlarm button
setAlarm.setOnClickListener(object : View.OnClickListener {
override fun onClick(view: View?) {
//We need a calendar object to get the specified time in millis
//as the alarm manager method takes time in millis to setup the alarm
val calendar: Calendar = Calendar.getInstance()
if (Build.VERSION.SDK_INT >= 23) {
calendar.set(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
timePicker.hour,
timePicker.minute,
0
)
} else {
calendar.set(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
timePicker.currentHour,
timePicker.currentMinute,
0
)
}
setAlarm(calendar.getTimeInMillis())
}
})
}
private fun setAlarm(time: Long) {
//getting the alarm manager
val am = getSystemService(ALARM_SERVICE) as AlarmManager
//creating a new intent specifying the broadcast receiver
val i = Intent(this, AlarmReciever::class.java)
//creating a pending intent using the intent
val pi = PendingIntent.getBroadcast(this, 0, i, 0)
//setting the repeating alarm that will be fired every day
am.setRepeating(AlarmManager.RTC, time, AlarmManager.INTERVAL_DAY, pi)
Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show()
}
}
|
AlarmReceiver.kt file
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
class AlarmReciever : BroadcastReceiver() {
override fun onReceive(p0: Context?, p1: Intent?) {
//you can check the log that it is fired
//Here we are actually not doing anything
//but you can do any task here that you want to be done at a specific time everyday
Log.d("MyAlarm", "Alarm is just fired");
}
}
|
AndroidManifest.xml file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.alarmmanagerandroid">
<uses-permission android:name="android.permission.SET_ALARM"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AlarmManagerAndroid">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".AlarmReciever"
android:enabled="true"
android:exported="true" />
</application>
</manifest>
|
Conclusion: In this article we have covered how to create Background task with alarm manager in Android apps using Kotlin language.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.alarmmanagerandroid">
<uses-permission android:name="android.permission.SET_ALARM"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AlarmManagerAndroid">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".AlarmReciever"
android:enabled="true"
android:exported="true" />
</application>
</manifest>
Conclusion: In this article we have covered how to create Background task with alarm manager in Android apps using Kotlin language.
-->