Create Alarm with AlarmManager Android using Kotlin

In XML,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"    
android:layout_height="match_parent">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView            
          android:id="@+id/tv_title"            
          android:layout_width="wrap_content"            
          android:layout_height="wrap_content"    
          android:text="Set Alarm"          
         android:textSize="24sp" />

        <TimePicker     
          android:id="@+id/timepicker"     
          android:layout_width="match_parent"     
          android:layout_height="wrap_content"      
          android:layout_below="@+id/tv_title"
            >


        </TimePicker>


        <Button       
           android:id="@+id/btn_continue"       
           android:layout_width="wrap_content"          
           android:layout_height="wrap_content"       
           android:layout_below="@+id/timepicker"    
           android:background="@color/colorAccent"    
           android:text="Set"       
           android:layout_alignParentRight="true"
            />




    </RelativeLayout>

</LinearLayout>







SetAlarmManager.KT, complete code


import android.app.AlarmManager
import android.app.PendingIntent
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_alarm.*
import java.util.*


public class SetAlarmManager: AppCompatActivity() {


    /**     * Initialize variable     */      
     lateinit var alarmMgr:AlarmManager
      lateinit var alarmIntent:PendingIntent
      var hours:String?= null   
     var min:String?= null

     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_alarm)


        /*** set alarm with selected time on timepicker        
       * and enable receiver on button click  */     
         this.btn_continue.setOnClickListener{

            alarmMgr = getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val intent = Intent(this, AlarmReceiverKotlin::class.java)
            alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0)

            val calendar = Calendar.getInstance()
            calendar.timeInMillis = System.currentTimeMillis()
            calendar.set(Calendar.HOUR_OF_DAY, "$hours".toInt())
            calendar.set(Calendar.MINUTE, "$min".toInt())

            alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis,
                    (1000 * 60 * 2).toLong(), alarmIntent)

            val c_receiver = ComponentName(this, AlarmReceiverKotlin::class.java)
            val pm = packageManager            pm.setComponentEnabledSetting(c_receiver,
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP)

            Log.d("alarm_done", "alarm_set")

        }

        this.timepicker.setIs24HourView(true)
        this.timepicker.setOnTimeChangedListener { view, hourOfDay, minute ->
            var selected_hours = hourOfDay.toString()
            min = if(minute<10)"0"+minute else minute.toString()
            hours = if(hourOfDay<10)"0"+hourOfDay else selected_hours

        }


       }
    }




Create BroadcastReceiver,

import android.app.NotificationManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.media.RingtoneManager
import android.util.Log

import androidx.core.app.NotificationCompat


/** * Receiver */
class AlarmReceiverKotlin : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {

        Log.d("alarm_done", "alarm_call")


        val intents = Intent(context, MainActivity::class.java)
        intents.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        val pendingIntent = PendingIntent.getActivity(context, 0 /* Request code */, intents,
                PendingIntent.FLAG_ONE_SHOT)
        val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        
        val notificationBuilder = NotificationCompat.Builder(context)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Wake up")
                .setContentText("Wake up text")
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent)

        val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build())


    }
}



set receiver in AndroidManifest,
<receiver android:name=".AlarmReceiverKotlin"    
android:enabled="false"/>



Now to stop alarmManager,
/** * disable AlarmManager and receiver */
ComponentName c_receiver=new ComponentName(this, AlarmReceiverKotlin.class);
PackageManager pm=getPackageManager();
pm.setComponentEnabledSetting(c_receiver,
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP);






Comments