Services In Android

Services-In-Android.png

5th February, 2023

A Service is a special type of Android component used to perform long-running operations in the background. You can play music, handle network transactions and many background operations using this magical Android component. So let’s quick dive into the service.

Android Service
→ Even if user switch to other application, the service will run in background
→ Operating System will only force stop the service when memory is low
→ Service doesn’t provide User Interface (UI)

Types of Android Services

There are three types of Android Services.

Types-of-Android-Service.png

Foreground

Services that notify the user about its ongoing operations are called Foreground services. e.g. Downloading a file. If you want to use foreground services, you must have to display a notification so that the user is aware that the service is running.

Background

Background Service doesn’t notify the user about its ongoing operations. User also cannot access them. e.g. data syncing, data storing

Bound

If any component of application is bind with the service, the service is called Bound. You can also binds multiple components. bindService() method is used to bind an application component with a service.

Android Services Lifecycle

The following diagram shows the lifecycle of Android Services. Service have two possible path to complete their lifecycle. Unbounded (Started) and Bounded.

Android-Services-Lifecycle.png
Android Services Lifecycle

Unbounded Service (Started Service)
A service is started by calling the startService() method using a component. Now the service can run continuously in the background, even if the component that started the service is destroyed.
Unbounded Service (Started Service) can be stopped in two ways:
→ A service can stop itself by calling the stopSelf() method.
→ By calling the stopService() method.

Bounded Service
A component of an application binds itself to a service, it is known as a Bounded service. A component can bind itself to a service by calling the bind() method. Multiple components can bind to a service.

An example of a bounded service is downloading a file from a server. A component starts a service that can be paused, resumed by another component. It is similar to the server-client scenario where the client sends requests and the server responds to the client’s requests.

→ To stop the execution of a Bounded service, all the components must be unbind from the service by calling the unbindService() method.

Android Services Callback Methods

Method Description
onCreate() It is required for One-time-Setup. The Android system calls this method when a service is created using onStartCommand() or onBind().
onStartCommand() Android Service calls this method when an activity (a component) starts a service by calling the startService() method. It can be stopped by calling stopSelf() or stopService() methods.
onBind() Whenever an application component binds itself to a service using the bindService() method, the onBind() method is invoked. The onBind() method is mandatory to implement in an Android Service. You must provide a User Interface (UI) to communicate with the service by returning an IBinder object, or return null if you don't want binding.
onUnbind() The system calls this method when all clients have disconnected from a particular service interface.
onRebind() When all clients have disconnected from the interface of the service and new clients have to connected to the service, The system calls this method.
onDestroy() When a service is no longer used and being destroyed, The system calls onDestroy() method. Your service must implement onDestroy() method to clean up resources (e.g. register listeners, threads, receivers).
KotlinJava
content_copy light_mode remove
package com.androidchunk.androidserviceexample
 
import android.app.Service
import android.content.Intent
import android.os.IBinder
 
class MyService : Service() {
 
    // The service is being created
    override fun onCreate() {
        super.onCreate()
    }
 
    // Service is ready to start, if you call to startService()
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return super.onStartCommand(intent, flags, startId)
    }
 
    // A client is binding to the service by calling bindService()
    override fun onBind(intent: Intent): IBinder? {
        return null
    }
 
    // when all clients unbound with unbindServices()
    override fun onUnbind(intent: Intent?): Boolean {
        return super.onUnbind(intent)
    }
 
    // when a client is bind to the service by calling bindService()
    // after onUnbind has already been called
    override fun onRebind(intent: Intent?) {
        super.onRebind(intent)
    }
 
    // The service is no longer used and is being destroyed
    override fun onDestroy() {
        super.onDestroy()
    }
}
package com.androidchunk.androidserviceexample;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import androidx.annotation.Nullable;

class MyService extends Service {

    // The service is being created
    @Override
    public void onCreate() {
        super.onCreate();
    }

    // Service is ready to start, if you call to startService()
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    // A client is binding to the service by calling bindService()
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    // when all clients unbound with unbindServices()
    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    // when a client is bind to the service by calling bindService()
    // after onUnbind has already been called
    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
    }

    // The service is no longer used and is being destroyed
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

Create Android Service using Android Studio

Open the project tool window and expand go to the directory app ⇒ java and right click on the package (or where you want to create a service class), select New ⇒ Service ⇒ Service.

Create-a-Service-in-Android-Studio.png

Fill the details of new service class and click the Finish button.
Exported: Other app will use this service if it is true.
Enabled: Indicates that the system can initiate the service or not.

Create-Service-Fill-details.png
KotlinJava
content_copy light_mode remove
package com.androidchunk.androidserviceexample

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

class MyService : Service() {

    override fun onBind(intent: Intent): IBinder? {
        return null
    }
}
package com.androidchunk.androidserviceexample;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import androidx.annotation.Nullable;

class MyService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

Woohoo! You have successfully created a service.

Register a Service in Manifest File

After creating the service, we have to register it to the androidmanifest.xml file. Luckily Android Studio already accomplished this task for us.

XML
content_copy light_mode remove
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application>
         ...
         ...

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true" />

        <activity/>
         ...
         ...
    </application>

</manifest>
package com.androidchunk.androidserviceexample;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import androidx.annotation.Nullable;

class MyService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

Start a Service

Call startService() method from the Android component (e.g. Activity) to start the Android Service. Have a look at the following code snippet.

KotlinJava
content_copy light_mode remove
var intent = Intent(this, MyService::class.java)
startService(intent)
Intent intent = new Intent(this, MyService.class);
startService(intent);

Bounded Service vs Unbounded Service vs Intent Service

Unbounded Service (Started Service) Bounded Service Intent Service
Starts by calling the startService() method Starts by calling the bindService() method Starts by calling the startService() method
Stopped or destroyed explicitly by calling stopService() method Unbind or destroy by calling unbindService() Implicitly calls stopSelf() to Destroyed
Basically used to perform long running repetitive task Basically used to perform long running repetitive task Basically used to one time task
Independent of the component from which it starts Dependent of the component from which it starts Independent of the component from which it starts

Happy coding!

Leave a Reply