Android Services with Kotlin

An Android Service, is an application component that can perform long-running operations in the background, and it doesn’t provide a user interface.

A few example uses for a service could be:

  • Network transactions
  • Play music
  • Perform file I/O operations
  • Interact with content providers
  • Background operations

I’ve recently implemented a service in one of my applications to start a sound triggered by a BroadcastReceiver when an alarm expires and here is how I implemented it with Kotlin.

AlarmService.kt

package com.isscroberto.powernap.util
import android.app.Service
import android.content.Context
import android.content.Intent
import android.media.Ringtone
import android.media.RingtoneManager
import android.os.IBinder
class AlarmService : Service() {
private lateinit var ringtone: Ringtone
override fun onBind(p0: Intent?): IBinder? {
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
playAlarm()
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
ringtone.stop()
}
fun playAlarm() {
val notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)
ringtone = RingtoneManager.getRingtone(this, notification)
if(!ringtone.isPlaying()) {
ringtone.play()
}
}
}

view raw

AlarmService.kt

hosted with ❤ by GitHub

Then, this is how it’s started from the BroadcastReceiver.

TimerExpiredReceiver.kt

package com.isscroberto.powernap
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.isscroberto.powernap.data.NapState
import com.isscroberto.powernap.util.NotificationUtil
import com.isscroberto.powernap.util.PrefUtil
import com.isscroberto.powernap.util.AlarmService
class TimerExpiredReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// Show notification of expiration.
NotificationUtil.showTimerExpired(context)
// Save status in preferences.
PrefUtil.setTimerState(NapState.Finished, context)
PrefUtil.setAlarmSetTime(0, context)
// Play alarm sound.
context.startService(Intent(context, AlarmService::class.java))
}
}

Finally don’t forget to add your reference to your app’s manifest file.

<service android:name=".util.AlarmService"/>

By using this service I’m able to stop it from anywhere within the application and stop the alarm sound when the user interacts with my app by calling stopService().

// Stop alarm.
context!!.stopService(Intent(context!!, AlarmService::class.java))

view raw

MainActivity.kt

hosted with ❤ by GitHub

I implemented this functionality in PowerNap, an app that will help you take efficient naps by controlling the time you sleep. You can find the source code in GitHub.

Posted in Dev

Leave a Reply