Search code examples
androidkotlinalarmmanagerrepeat

How to Repeat a function every Hour in Android Studio using Kotlin?


I want to repeat a function( or any action ) every one Hour ( for example ) even if the app is not running.


Solution

  • I've created a demo project so you can take a look at it :

    https://github.com/joancolmenerodev/BroadcastReceiverAndAlarmManagerInKotlin


    You first have to create a BroadcastReceiver, and then using AlarmManager you can decide the interval of time you want to be called.

    Create a BroadcastReceiver you can do it as follows :

    val broadCastReceiver = object : BroadcastReceiver() {
         override fun onReceive(contxt: Context?, intent: Intent?) {
             toast("This toast will be shown every X minutes")
         }
    }
    

    And then you have this method to start the job :

    val mIntent = Intent(context, broadCastReceiver)
    
    val mPendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, mIntent, 0)
    val mAlarmManager = context
        .getSystemService(Context.ALARM_SERVICE) as AlarmManager
    mAlarmManager.setRepeating(
        AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(),
        CHANGETOYOURDESIREDSECONDS, mPendingIntent
    )
    

    And then you'll be able to see the Toast even if the app is closed.

    Edit

    You can register your BroadcastReceiver using context.registerReceiver(receiver, IntentFilter("something")) and then adding to the mIntent and action for "something".

    If you don't like this way, you can create a new class named MyReceiver that extends BradcastReceiver as follows :

    class MyReceiver : BroadcastReceiver() {
    
        override fun onReceive(context: Context, intent: Intent) {
            Toast.makeText(context,"This toast will be shown every X minutes", Toast.LENGTH_SHORT).show()
        }
    }
    

    And then start the alarm doing this :

    val mIntent = Intent(this, MyReceiver::class.java)

    val mPendingIntent = PendingIntent.getBroadcast(this, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT)
            val mAlarmManager = this
                .getSystemService(Context.ALARM_SERVICE) as AlarmManager
            mAlarmManager.setRepeating(
                AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
                WHATEVERYOUWANT, mPendingIntent
            )
    

    Note: By default is set to 60000

    Value will be forced up to 60000 as of Android 5.1; don't rely on this to be exact