Android - Servicios
UNA servicees un componente que se ejecuta en segundo plano para realizar operaciones de larga duración sin necesidad de interactuar con el usuario y funciona incluso si se destruye la aplicación. Un servicio puede tener esencialmente dos estados:
No Señor. | Estado y descripción |
---|---|
1 | Started Un servicio es startedcuando un componente de la aplicación, como una actividad, la inicia llamando a startService () . Una vez iniciado, un servicio puede ejecutarse en segundo plano indefinidamente, incluso si el componente que lo inició se destruye. |
2 | Bound Un servicio es boundcuando un componente de la aplicación se une a él llamando a bindService () . Un servicio vinculado ofrece una interfaz cliente-servidor que permite que los componentes interactúen con el servicio, envíen solicitudes, obtengan resultados e incluso lo hagan en todos los procesos con comunicación entre procesos (IPC). |
Un servicio tiene métodos de devolución de llamada de ciclo de vida que puede implementar para monitorear los cambios en el estado del servicio y puede realizar el trabajo en la etapa apropiada. El siguiente diagrama de la izquierda muestra el ciclo de vida cuando el servicio se crea con startService () y el diagrama de la derecha muestra el ciclo de vida cuando el servicio se crea con bindService (): (imagen cortesía: android.com)
Para crear un servicio, crea una clase Java que amplía la clase base de Servicio o una de sus subclases existentes. losServiceLa clase base define varios métodos de devolución de llamada y los más importantes se dan a continuación. No es necesario implementar todos los métodos de devolución de llamada. Sin embargo, es importante que comprenda cada uno e implemente aquellos que aseguren que su aplicación se comporte de la manera que esperan los usuarios.
No Señor. | Devolución de llamada y descripción |
---|---|
1 | onStartCommand() El sistema llama a este método cuando otro componente, como una actividad, solicita que se inicie el servicio, llamando a startService () . Si implementa este método, es su responsabilidad detener el servicio cuando termine su trabajo, llamando a los métodos stopSelf () o stopService () . |
2 | onBind() El sistema llama a este método cuando otro componente quiere vincularse con el servicio llamando a bindService () . Si implementa este método, debe proporcionar una interfaz que los clientes usen para comunicarse con el servicio, devolviendo un objeto IBinder . Siempre debe implementar este método, pero si no desea permitir el enlace, debe devolver un valor nulo . |
3 | onUnbind() El sistema llama a este método cuando todos los clientes se han desconectado de una interfaz en particular publicada por el servicio. |
4 | onRebind() El sistema llama a este método cuando nuevos clientes se han conectado al servicio, después de haber sido notificado previamente que todos se habían desconectado en su onUnbind (Intent) . |
5 | onCreate() El sistema llama a este método cuando el servicio se crea por primera vez utilizando onStartCommand () o onBind () . Esta llamada es necesaria para realizar una configuración única. |
6 | onDestroy() El sistema llama a este método cuando el servicio ya no se utiliza y se está destruyendo. Su servicio debería implementar esto para limpiar cualquier recurso como hilos, oyentes registrados, receptores, etc. |
El siguiente servicio de esqueleto demuestra cada uno de los métodos del ciclo de vida:
package com.tutorialspoint;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
/** indicates how to behave if the service is killed */
int mStartMode;
/** interface for clients that bind */
IBinder mBinder;
/** indicates whether onRebind should be used */
boolean mAllowRebind;
/** Called when the service is being created. */
@Override
public void onCreate() {
}
/** The service is starting, due to a call to startService() */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
/** A client is binding to the service with bindService() */
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** Called when all clients have unbound with unbindService() */
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
/** Called when a client is binding to the service with bindService()*/
@Override
public void onRebind(Intent intent) {
}
/** Called when The service is no longer used and is being destroyed */
@Override
public void onDestroy() {
}
}
Ejemplo
Este ejemplo lo llevará a través de sencillos pasos para mostrar cómo crear su propio servicio de Android. Siga los siguientes pasos para modificar la aplicación de Android que creamos en el capítulo Ejemplo de Hello World :
Paso | Descripción |
---|---|
1 | Utilizará Android StudioIDE para crear una aplicación de Android y nombrarla como Mi aplicación en un paquete com.example.tutorialspoint7.myapplication como se explica en el capítulo Ejemplo de Hello World . |
2 | Modifique el archivo de actividad principal MainActivity.java para agregar los métodos startService () y stopService () . |
3 | Cree un nuevo archivo java MyService.java bajo el paquete com.example.My Application . Este archivo tendrá la implementación de métodos relacionados con el servicio de Android. |
4 | Defina su servicio en el archivo AndroidManifest.xml usando la etiqueta <service ... />. Una aplicación puede tener uno o más servicios sin ninguna restricción. |
5 | Modifique el contenido predeterminado del archivo res / layout / activity_main.xml para incluir dos botones en diseño lineal. |
6 | No es necesario cambiar ninguna constante en el archivo res / values / strings.xml . Android Studio se encarga de los valores de cadena |
7 | Ejecute la aplicación para iniciar el emulador de Android y verifique el resultado de los cambios realizados en la aplicación. |
A continuación se muestra el contenido del archivo de actividad principal modificado MainActivity.java. Este archivo puede incluir cada uno de los métodos fundamentales del ciclo de vida. Hemos agregado los métodos startService () y stopService () para iniciar y detener el servicio.
package com.example.tutorialspoint7.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
String msg = "Android : ";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
}
public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
}
// Method to stop the service
public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
}
}
A continuación se muestra el contenido de MyService.java. Este archivo puede tener implementación de uno o más métodos asociados con el Servicio según los requisitos. Por ahora vamos a implementar solo dos métodos onStartCommand () y onDestroy () -
package com.example.tutorialspoint7.myapplication;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;
/**
* Created by TutorialsPoint7 on 8/23/2016.
*/
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
A continuación se muestra el contenido modificado del archivo AndroidManifest.xml . Aquí hemos agregado la etiqueta <service ... /> para incluir nuestro servicio -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
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>
<service android:name=".MyService" />
</application>
</manifest>
A continuación se mostrará el contenido de res/layout/activity_main.xml archivo para incluir dos botones -
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Example of services"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Start Services"
android:onClick="startService"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop Services"
android:id="@+id/button"
android:onClick="stopService"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_alignRight="@+id/button2"
android:layout_alignEnd="@+id/button2" />
</RelativeLayout>
Intentemos ejecutar nuestro modificado Hello World!aplicación que acabamos de modificar. Supongo que habías creado tuAVDmientras realiza la configuración del entorno. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar de la barra de herramientas. Android Studio instala la aplicación en su AVD y la inicia y, si todo está bien con su configuración y aplicación, se mostrará la siguiente ventana del emulador:
Ahora para iniciar su servicio, hagamos clic en Start Service, esto iniciará el servicio y según nuestra programación en el método onStartCommand () , aparecerá un mensaje Servicio iniciado en la parte inferior del simulador de la siguiente manera:
Para detener el servicio, puede hacer clic en el botón Detener servicio.