Tutorial Aplikasi Alarm di Android Menggunakan Alarm Manager

Irfan Irawan Sukirman, S.Kom.
GITS Apps Insight
Published in
4 min readMay 18, 2019
Foto oleh Szűcs László di Unsplash

Assalaamu’alaykum, gaes. Semoga pada sehat semua, ya. Aamiin.

Sekarang saya akan membagikan tutorial sederhana tentang pembuatan aplikasi alarm di Android. Tipsnya untuk membuat alarm yang dapat berbunyi hanya sekali atau dapat berulang-ulang sesuai dengan waktu yang ditetapkan secara berkala.

Sebelum masuk ke dapur Android Studio masing-masing, alangkah baiknya kita pelajari dahulu sedikit tentang apa itu AlarmManager?

AlarmManager adalah sebuah kelas yang menyediakan akses untuk melayani pekerjaan yang berhubungan dengan alarm atau pengingat di aplikasi Android. Dengan menggunakan AlarmManager, kalian bisa menjalankan beragam pekerjaan secara terjadwal baik hanya sekali atau berkelanjutan. Misalnya, notifikasi adzan, notifikasi berbelanja, dan masih banyak lagi. Untuk lebih dalamnya, teman-teman bisa mengunjungi situs resmi Android yang membahas AlarmManager di sini.

Contoh Aplikasi yang Mengimplementasikan Alarm Manager (https://linktr.ee/yuksholat)

Alarm Sekali Jalan

Maksudnya, kita akan membuat sebuah alarm yang diset yang hanya akan muncul sekali saja. Pada contoh ini, kita akan membuka halaman baru setelah 5 detik alarm yang sudah dijadwalkan. Caranya cukup mudah. Teman-teman cukup menuliskan kode seperti berikut:

@TargetApi(Build.VERSION_CODES.M)
fun setScheduleNotification() {
// membuat objek intent yang akan menjadi target selanjutnya
// bisa untuk berpindah halaman dengan dan tanpa data
val
intent = Intent(this@MainActivity, AboutActivity::class.java)
intent.putExtra("key", "value")

// membuat objek PendingIntent yang berguna sebagai penampung intent dan aksi yang akan dikerjakan
val
requestCode = 0
val pendingIntent =
PendingIntent.getActivity(this@MainActivity, requestCode, intent, 0)

// membuat objek AlarmManager untuk melakukan pendaftaran alarm yang akan dijadwalkan
val
alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager

// kita buat alarm yang dapat berfungsi tepat waktu dan juga walaupun dalam kondisi HP idle
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + 5000,
pendingIntent
)
}

Kemudian, panggil fungsi tersebut di fungsi onCreate. Jika berhasil, maka alarm akan memicu perpindahan ke halaman baru 5 detik kemudian, sesuai pengaturan sebelumnya.

Alarm Berulang

Pada bagian ini, saya akan demonstrasikan alarm yang berbunyi secara berkala. Banyak cara yang dapat dilakukan jika ingin membuat alarm seperti ini. Misalnya hari ini saya set alarm pukul 19.30 dan akan kembali berbunyi pada jam yang sama di hari berikutnya dan seterusnya. Di sini, saya menggunakan sebuah BroadcastReceiver dan Service untuk mengelola pendaftaran alarm pada aplikasi yang dapat berjalan di background. Sehingga, kita tidak perlu untuk membuka aplikasi tetapi alarm akan tetap berjalan sesuai jadwal.

Pertama, kita harus buat satu buah kelas service (bebas teman-teman mau menamakannya apa). Buatlah sebuah timer dan timertask secara berkala, misalnya saya buat setiap satu jam akan mendaftarkan alarm. Jika sudah, buatlah satu fungsi alarm atau bisa juga menggunakan fungsi yang sudah ada, lalu teman-teman perlu menambahkan objek kalender yang sudah diset waktunya pada jam 19.30. Untuk kode utuhnya dapat dilihat seperti berikut:

class AlarmService : Service() {

private var timer: Timer? = null
private var
timerTask: TimerTask? = null

override fun
onCreate() {
super.onCreate()
setupTimer()
}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return START_STICKY
}

override fun onBind(intent: Intent?): IBinder? {
return null
}

private fun setupTimer() {
timer = Timer()

// menjadwalkan alarm per satu jam sekali
setupTimerTask()

timer?.schedule(timerTask, 1000, 3600000)
}

private fun setupTimerTask() {
timerTask = object : TimerTask() {
override fun run() {
setScheduleNotification()
}
}
}

private fun stopTimer() {
if (timer != null) {
timer?.cancel()
timer = null
}
}

@TargetApi(Build.VERSION_CODES.M)
fun setScheduleNotification() {
// membuat objek calendar dan inisialisasi parameter waktunya
val
calendar = Calendar.getInstance()
val hour = 19
val minute = 30
val second = 0

// lakukan konfigurasi berdasarkan waktu yang sudah ditetapkan sebelumnya
calendar.apply {
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, second)
}

// membuat objek intent yang mana akan menjadi target selanjutnya
// bisa untuk berpindah halaman dengan dan tanpa data
val
intent = Intent(applicationContext, AlarmBroadcastReceiver::class.java)
intent.putExtra("validationTime", "19:30:00")

// membuat objek PendingIntent yang berguna sebagai penampung intent dan aksi yang akan dikerjakan
val
requestCode = 0
val pendingIntent =
PendingIntent.getBroadcast(applicationContext, requestCode, intent, 0)

// membuat objek AlarmManager untuk melakukan pendaftaran alarm yang akan dijadwalkan
val
alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager

// kita buat alarm yang dapat berfungsi tepat waktu dan juga walaupun dalam kondisi HP idle alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
}

override fun onTaskRemoved(rootIntent: Intent?) {
super.onTaskRemoved(rootIntent)
stopTimer()
}

}

Setelah service dibuat, selajutnya buatlah sebuah class BroadcastReceiver. Gunanya untuk menangkap data dari alarm yang sudah didaftarkan. Kode utuhnya dapat dilihat seperti berikut:

class AlarmBroadcastReceiver : BroadcastReceiver() {

override fun onReceive(context: Context?, intent: Intent?) {
if (intent != null) {
// pengecekan dilakukan agar notifikasi tidak muncul berulang
if
(getTimeNow() == intent.getStringExtra("validationTime")) {
if (context != null) createNotificationChannel(context)
}

if (intent.action == "android.intent.action.TIME_SET") {
context?.stopService(Intent(context, AlarmService::class.java))

// langkah ini dilakukan untuk memicu ulang agar service kembali menyala
// setelah melakukan uji coba mengganti tanggal service mati
Handler().postDelayed({ context?.startService(Intent(context, AlarmService::class.java)) }, 1000)
}
}
}

private fun getTimeNow(): String {
val dateTimeMillis = System.currentTimeMillis()

val calendar = Calendar.getInstance()
calendar.timeInMillis = dateTimeMillis

return SimpleDateFormat("HH:mm:ss").format(calendar.time)
}

}

Setelah kita membuat BroadcastReceiver, jangan lupa untuk mendaftarkan Service dan BroadcastReceiver kita di file manifest seperti berikut:

<service
android:name=".AlarmService"
android:enabled="true"
android:exported="false"
android:stopWithTask="false" />

<receiver
android:name=".AlarmBroadcastReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.TIME_SET" />
</intent-filter>
</receiver>

Lalu, jika teman-teman ingin mencoba background alarm jangan lupa untuk menjalankan service dengan menggunakan Component startService() di class activity.

Kesimpulan

Di tutorial ini saya menggunakan tipe Alarm RTC_WAKEUP karena saya ingin alarm tetap berjalan bagimanapun kondisi HP saat ini (baik itu keadaan sleep atau lain sebagainya). Lalu, jika teman-teman ingin melakukan pembaruan data di alarm, gunakan flag PendingIntent.FLAG_UPDATE_CURRENT ketika melakukan pendaftaran alarm dan pengiriman data baru menggunakan sendBroadcast() berdasarkan id alarm yang akan diperbarui datanya. Untuk contoh aplikasi ini, teman-teman bisa masuk ke sini.

Sekian tutorial sederhana ini, semoga bermanfaat.

Wassalaamu’alaykum Warahmatullahi Wabarakatuh….

Irfan Irawan Sukirman adalah seorang android developer di GITS Indonesia. Irfan memiliki pengalaman kurang lebih 3 tahun sebagai android developer dan kini mempelajari Flutter. Selain mobile programming, dia juga tertarik menjadi CTO dan security engineer.

--

--