Servicios en Android con Ejemplo

Los servicios en Android son un componente especial que facilita que una aplicación se ejecute en segundo plano para realizar tareas de operación de larga duración. El objetivo principal de un servicio es garantizar que la aplicación permanezca activa en segundo plano para que el usuario pueda operar varias aplicaciones al mismo tiempo. Una interfaz de usuario no es deseable para los servicios de Android, ya que está diseñada para operar procesos de ejecución prolongada sin la intervención del usuario. Un servicio puede ejecutarse continuamente en segundo plano incluso si la aplicación está cerrada o si el usuario cambia a otra aplicación. Además, los componentes de la aplicación pueden unirse al servicio para llevar a cabo la comunicación entre procesos (IPC) . Hay una gran diferencia entre los servicios y los subprocesos de Android, uno no debe confundirse entre los dos. Thread es una función proporcionada por el sistema operativo para permitir que el usuario realice operaciones en segundo plano. Si bien el servicio es un componente de Android que realiza una operación de ejecución prolongada de la que el usuario podría no ser consciente, ya que no tiene interfaz de usuario.

Tipos de servicios de Android

Types of Android Services

1. Servicios en primer plano:

Los servicios que notifican al usuario sobre sus operaciones en curso se denominan Servicios en primer plano. Los usuarios pueden interactuar con el servicio mediante las notificaciones proporcionadas sobre la tarea en curso. Por ejemplo, al descargar un archivo, el usuario puede realizar un seguimiento del progreso de la descarga y también puede pausar y reanudar el proceso.

2. Servicios en segundo plano:

Los servicios en segundo plano no requieren ninguna intervención del usuario. Estos servicios no notifican al usuario sobre las tareas en segundo plano en curso y los usuarios tampoco pueden acceder a ellos. El proceso como la sincronización programada de datos o el almacenamiento de datos se incluyen en este servicio.

3. Servicios Vinculados:

Este tipo de servicio de Android permite que los componentes de la aplicación como actividad se vinculen con ella. Los servicios vinculados realizan su tarea siempre que cualquier componente de la aplicación esté vinculado a ellos. Se permite que más de un componente se vincule con un servicio a la vez. Para vincular un componente de la aplicación con un servicio , se utiliza el método  bindService() .

El ciclo de vida de los servicios de Android

En Android, los servicios tienen 2 caminos posibles para completar su ciclo de vida, a saber, Iniciado y Limitado .

1. Servicio iniciado (servicio ilimitado):

Siguiendo esta ruta, un servicio se iniciará cuando un componente de la aplicación llame al método startService() . Una vez iniciado, el servicio puede ejecutarse continuamente en segundo plano incluso si se destruye el componente responsable del inicio del servicio. Hay dos opciones disponibles para detener la ejecución del servicio:

  • Al llamar al método stopService() ,
  • El servicio puede detenerse utilizando el método stopSelf() .

2. Servicio acotado:

Puede tratarse como un servidor en una interfaz cliente-servidor. Al seguir esta ruta, los componentes de la aplicación de Android pueden enviar requests al servicio y obtener resultados. Un servicio se denomina limitado cuando un componente de la aplicación se vincula con un servicio llamando al método bindService() . Para detener la ejecución de este servicio, todos los componentes deben desvincularse del servicio mediante el método unbindService() .

The life cycle of Android service

Para realizar una tarea de descarga en segundo plano, se llamará al método startService() . Mientras que para obtener información sobre el progreso de la descarga y pausar o reanudar el proceso mientras la aplicación aún está en segundo plano, el servicio debe estar vinculado con un componente que pueda realizar estas tareas.

Fundamentos de los servicios de Android

Se puede crear un servicio definido por el usuario a través de una clase normal que amplía la clase Servicio . Además, para llevar a cabo las operaciones de servicio en las aplicaciones, existen ciertos métodos de devolución de llamada que deben anularse . Los siguientes son algunos de los métodos importantes de los servicios de Android:

Métodos

Descripción

onStartCommand()

El servicio de Android llama a este método cuando un componente (por ejemplo: actividad) 

requests para iniciar un servicio usando startService(). Una vez iniciado el servicio,

se puede detener explícitamente usando los métodos stopService() o stopSelf().

onBind()

Este método es obligatorio para implementar en el servicio de Android y se invoca 

cada vez que un componente de la aplicación llama al método bindService() para

vincularse con un servicio. También se proporciona una interfaz de usuario para comunicarse 

con el servicio de manera efectiva devolviendo un objeto IBinder. 

Si no se requiere el enlace del servicio, el método debe devolver un valor nulo.

enDesvincular()

El sistema Android invoca este método cuando todos los clientes 

desconectarse de una interfaz de servicio en particular.

onRebind()

Una vez que todos los clientes están desconectados de la interfaz particular de servicio y

existe la necesidad de conectar el servicio con nuevos clientes, el sistema llama a este método.

enCrear()

Cada vez que se crea un servicio usando onStartCommand() o onBind(),

el sistema Android llama a este método. Este método es necesario para realizar 

una configuración de una sola vez.

en destruir()

Cuando un servicio ya no está en uso, el sistema invoca este método

 justo antes de que el servicio se destruya como una última llamada de limpieza. Los servicios deben

 implementar este método para limpiar recursos como oyentes registrados,

 hilos, receptores, etc.

Ejemplo de servicios de Android

Reproducir música de fondo es un ejemplo muy común de servicios en android . Desde el momento en que un usuario inicia el servicio, la música se reproduce continuamente en segundo plano, incluso si el usuario cambia a otra aplicación. El usuario tiene que detener el servicio explícitamente para pausar la música. A continuación se muestra la implementación completa paso a paso de este servicio de Android utilizando algunos métodos de devolución de llamada.

Nota : Los siguientes pasos se realizan en Android Studio versión 4.0

Paso 1: Crear un nuevo proyecto

  1. Haga clic en Archivo, luego en Nuevo => Nuevo proyecto.
  2. Elija Actividad vacía
  3. Seleccionar idioma como Java/Kotlin
  4. Seleccione el SDK mínimo según su necesidad.

Paso 2: Modificar el archivo strings.xml

Todas las strings que se utilizan en la actividad se enumeran en este archivo.

XML

<resources>
    <string name="app_name">Services_In_Android</string>
    <string name="heading">Services In Android</string>
    <string name="startButtonText">Start the Service</string>
    <string name="stopButtonText">Stop the Service</string>
</resources>

Paso 3: trabajar con el archivo activity_main.xml

Abra el archivo activity_main.xml y agregue 2 botones que iniciarán y detendrán el servicio. A continuación se muestra el código para diseñar un diseño de actividad adecuado.

XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#168BC34A"
    tools:context=".MainActivity">
  
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0"
        tools:ignore="MissingConstraints">
  
        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="170dp"
            android:fontFamily="@font/roboto"
            android:text="@string/heading"
            android:textAlignment="center"
            android:textAppearance="@style/TextAppearance.AppCompat.Large"
            android:textColor="@android:color/holo_green_dark"
            android:textSize="36sp"
            android:textStyle="bold" />
  
        <Button
            android:id="@+id/startButton"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginStart="20dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="20dp"
            android:layout_marginBottom="20dp"
            android:background="#4CAF50"
            android:fontFamily="@font/roboto"
            android:text="@string/startButtonText"
            android:textAlignment="center"
            android:textAppearance="@style/TextAppearance.AppCompat.Display1"
            android:textColor="#FFFFFF"
            android:textStyle="bold" />
  
        <Button
            android:id="@+id/stopButton"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginStart="20dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="20dp"
            android:layout_marginBottom="20dp"
            android:background="#4CAF50"
            android:fontFamily="@font/roboto"
            android:text="@string/stopButtonText"
            android:textAlignment="center"
            android:textAppearance="@style/TextAppearance.AppCompat.Display1"
            android:textColor="#FFFFFF"
            android:textStyle="bold" />
  
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="80dp"
            app:srcCompat="@drawable/banner" />
    </LinearLayout>
  
</androidx.constraintlayout.widget.ConstraintLayout>

Paso 4: Crear la clase de servicio personalizada

Se creará una clase de servicio personalizada en el mismo directorio donde reside la clase MainActivity y esta clase extenderá la clase Service . Los métodos de devolución de llamada se utilizan para iniciar y destruir los servicios. Para reproducir música, se utiliza el objeto MediaPlayer . A continuación se muestra el código para llevar a cabo esta tarea.

Java

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.provider.Settings;
import androidx.annotation.Nullable;
  
public class NewService extends Service {
  
    // declaring object of MediaPlayer
    private MediaPlayer player;
  
    @Override
  
    // execution of service will start
    // on calling this method
    public int onStartCommand(Intent intent, int flags, int startId) {
  
        // creating a media player which
        // will play the audio of Default
        // ringtone in android device
        player = MediaPlayer.create( this, Settings.System.DEFAULT_RINGTONE_URI );
  
        // providing the boolean
        // value as true to play
        // the audio on loop
        player.setLooping( true );
  
        // starting the process
        player.start();
  
        // returns the status
        // of the program
        return START_STICKY;
    }
  
    @Override
  
    // execution of the service will
    // stop on calling this method
    public void onDestroy() {
        super.onDestroy();
  
        // stopping the process
        player.stop();
    }
  
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

Kotlin

import android.app.Service
import android.content.Intent
import android.media.MediaPlayer
import android.os.IBinder
import android.provider.Settings
  
class NewService : Service() {
  
    // declaring object of MediaPlayer
    private lateinit var player:MediaPlayer
  
    // execution of service will start
    // on calling this method
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
  
        // creating a media player which
        // will play the audio of Default
        // ringtone in android device
        player = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI)
  
        // providing the boolean
        // value as true to play
        // the audio on loop
        player.setLooping(true)
  
        // starting the process
        player.start()
  
        // returns the status
        // of the program
        return START_STICKY
    }
  
    // execution of the service will
    // stop on calling this method
    override fun onDestroy() {
        super.onDestroy()
  
        // stopping the process
        player.stop()
    }
  
    override fun onBind(intent: Intent): IBinder? {
        return null
    }
}

Paso 5: Trabajar con el archivo MainActivity

Ahora, se declararán los objetos de botón y se definirá el proceso a realizar al hacer clic en estos botones en la clase MainActivity. A continuación se muestra el código para implementar este paso.

Java

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
  
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  
    // declaring objects of Button class
    private Button start, stop;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
  
        // assigning ID of startButton
        // to the object start
        start = (Button) findViewById( R.id.startButton );
  
        // assigning ID of stopButton
        // to the object stop
        stop = (Button) findViewById( R.id.stopButton );
  
        // declaring listeners for the
        // buttons to make them respond
        // correctly according to the process
        start.setOnClickListener( this );
        stop.setOnClickListener( this );
    }
  
    public void onClick(View view) {
  
        // process to be performed
        // if start button is clicked
        if(view == start){
  
            // starting the service
            startService(new Intent( this, NewService.class ) );
        }
  
        // process to be performed
        // if stop button is clicked
        else if (view == stop){
  
            // stopping the service
            stopService(new Intent( this, NewService.class ) );
  
        }
    }
}

Kotlin

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
  
class MainActivity : AppCompatActivity(), View.OnClickListener {
  
    // declaring objects of Button class
    private var start: Button? = null
    private var stop: Button? = null
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // assigning ID of startButton
        // to the object start
        start = findViewById<View>(R.id.startButton) as Button
  
        // assigning ID of stopButton
        // to the object stop
        stop = findViewById<View>(R.id.stopButton) as Button
  
        // declaring listeners for the
        // buttons to make them respond
        // correctly according to the process
        start!!.setOnClickListener(this)
        stop!!.setOnClickListener(this)
    }
  
    override fun onClick(view: View) {
  
        // process to be performed
        // if start button is clicked
        if (view === start) {
  
            // starting the service
            startService(Intent(this, NewService::class.java))
        }
  
        // process to be performed
        // if stop button is clicked
        else if (view === stop) {
  
            // stopping the service
            stopService(Intent(this, NewService::class.java))
        }
    }
}

Paso 6: Modifique el archivo AndroidManifest.xml

Para implementar los servicios con éxito en cualquier dispositivo Android, es necesario mencionar el servicio creado en el archivo AndroidManifest.xml . No es posible que un servicio realice su tarea si no se menciona en este archivo. El nombre del servicio se menciona dentro de la etiqueta de la aplicación .

XML

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.services_in_android">
  
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" />
        
        <!-- Mention the service name here -->
        <service android:name=".NewService"/>
        
    </application>
  
</manifest>

Salida: ejecutar en el emulador

Publicación traducida automáticamente

Artículo escrito por RISHU_MISHRA y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *