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)) |
|
|
|
} |
|
} |
view raw
TimerExpiredReceiver.kt
hosted with ❤ by GitHub
Finally don’t forget to add your reference to your app’s manifest file.
|
<service android:name=".util.AlarmService"/> |
view raw
AndroidManifest.xml
hosted with ❤ by GitHub
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.