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
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() .
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
- Haga clic en Archivo, luego en Nuevo => Nuevo proyecto.
- Elija Actividad vacía
- Seleccionar idioma como Java/Kotlin
- 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