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.

By:

Posted in:

tags:


Leave a Reply

%d bloggers like this: