Understanding Service and IntentService in Android with Kotlin

D I N E S H
4 min readJul 22, 2023

--

Introduction:
In the world of Android app development, services play a crucial role in executing background tasks without affecting the user interface. They provide a way to run long-running operations in the background, even if the app is not currently visible. Two commonly used types of services in Android are “Service” and “IntentService.”

In this blog, we will explore both of these services and discuss their differences with code examples in Kotlin.

Service: 🎼

A Service is an Android component that runs in the background without a user interface. It allows you to perform long-running tasks, such as network operations, database operations, and audio playback, even when the user switches to another app. Services are primarily used to handle tasks that do not require a user interface but should continue to run beyond the lifecycle of the hosting activity.

A Service can be started and stopped using the startService() and stopService() methods, respectively. Once started, a Service continues to run until explicitly stopped or until it completes its task.

When to use a Service:

  1. Downloading or uploading data from the internet.
  2. Playing music in the background.
  3. Handling long-running computations or data processing.

Creating a Service in Kotlin:
To create a Service in Android using Kotlin, follow these steps:

Step 1: Create a new Kotlin class that extends the `Service` class.
Step 2: Override the `onCreate()` method to initialize the service.
Step 3: Implement the `onStartCommand()` method, where you define the background task that the service should perform.

import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.util.Log

class BackgroundTaskService : Service() {
override fun onBind(intent: Intent?): IBinder? {
// Nah, not today. No binding here!
return null
}

override fun onCreate() {
super.onCreate()
log("BackgroundTaskService is ready to conquer!")
}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
log("BackgroundTaskService is performing a task! Don't disturb, please!")
performLongTask()
return START_STICKY // If the service is killed, it will be automatically restarted
}

private fun performLongTask() {
// Imagine doing something that takes a long time here
Thread.sleep(5000)
}

override fun onDestroy() {
super.onDestroy()
log("BackgroundTaskService says goodbye!")
}

fun log(str:String){
Log.d("TAG", "log: $str")
}
}

Here’s a brief explanation of the different return values from onStartCommand():

  1. START_STICKY: The system will try to recreate the Service and call onStartCommand() with a null intent if the Service was killed due to resource constraints.
  2. START_NOT_STICKY: The system will not try to recreate the Service, and the Service will remain stopped until an explicit start command is sent.
  3. START_REDELIVER_INTENT: The system will try to recreate the Service and redeliver the last intent that was passed to the Service through onStartCommand() if the Service was killed before it finished processing the intent.

IntentService: 🔔

An IntentService is a subclass of Service that provides a simplified way to handle asynchronous operations in the background. It handles each intent on a worker thread and stops itself automatically when the work is done.

Key features of IntentService:

  1. Sequential processing of Intents: Intents are queued and processed one by one, avoiding concurrent execution of tasks.
  2. Automatic termination: IntentService stops itself automatically when all the Intents are processed, which makes it convenient for one-off tasks.
  3. Simplicity: IntentService handles thread management and execution flow, allowing developers to focus on the task implementation.

When to use an IntentService:

  1. Performing multiple independent tasks sequentially.
  2. Offloading work to a background thread without managing threads explicitly.
  3. Background operations triggered by Intents (e.g., processing a downloaded file, handling push notifications).

Creating an IntentService in Kotlin:
To create an IntentService in Android using Kotlin, follow these steps:

Step 1: Create a new Kotlin class that extends the `IntentService` class.
Step 2: Override the `onHandleIntent()` method, where you define the background task that the service should perform for each incoming intent.

import android.app.IntentService
import android.content.Intent
import android.util.Log

class IntentTaskService : IntentService("IntentTaskService") {

override fun onHandleIntent(intent: Intent?) {
log("IntentTaskService is on a mission to conquer a task!")
performLongTask()
}

private fun performLongTask() {
// Imagine doing something that takes a long time here
Thread.sleep(5000)
}

override fun onDestroy() {
super.onDestroy()
log("IntentTaskService says farewell!")
}

fun log(str:String){
Log.d("TAG", "log: $str")
}
}

Using the Service and IntentService: Once you’ve created your Service and IntentService classes, you need to register them in the AndroidManifest.xml file:

<service android:name=".BackgroundTaskService" />
<service android:name=".MyIntentService" />

To start the Service or IntentService from an activity or any other component:

val serviceIntent = Intent(this, MyService::class.java)
startService(serviceIntent)

val intentServiceIntent = Intent(this, MyIntentService::class.java)
startService(intentServiceIntent)

Please note that I wrote this blog solely for Understanding purposes. If you are considering using IntentService, I recommend exploring WorkManager instead.

Check out my blog about periodic work manager — https://medium.com/optisol-datalabs/everything-about-periodic-work-manager-android-architecture-component-76ad8b29ff68

Conclusion:
In this blog, we explored two types of services in Android: Service and IntentService. While Service is suitable for long-running tasks that need to be explicitly stopped, IntentService is useful for executing short-lived background operations that automatically stop once their work is done. Understanding when to use each type of service is essential for building efficient and responsive Android applications.

--

--