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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} | |
} | |
} |
Then, this is how it’s started from the BroadcastReceiver.
TimerExpiredReceiver.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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().
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Stop alarm. | |
context!!.stopService(Intent(context!!, AlarmService::class.java)) |
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.