Hola a todos,

Gracias a que nuestro amigo Cristian estaba dando un taller de 20 horas en ITESM Toluca, y que no le quedaba claro para qué y cómo funciona un servicio, aprovecharé la oportunidad para explicarle y tratar de compartir lo poco que conozco sobre Servicios en Android SDK.

 

Servicio: Definición

Un servicio es un bloque de código que se ejecuta en un hilo distinto al de la interfaz de usuario y tiene la característica de existir por un largo periodo. Por ejemplo, cuando en tu Android device escuchas una canción, la actividad llamada Música conecta la canción seleccionada con un servicio que permite que el archivo de audio esté ejecutándose de manera independiente a la actividad que la invocó. Otro ejemplo claro es la aplicación de Android Market: cuando el usuario descarga una aplicación, se queda corriendo en background para evitar la interrupción de la operación y permitir que el usuario siga utilizando la pantalla para buscar más aplicaciones.

Un servicio puede tener dos estados:

Iniciado(started):

Un servicio está “iniciado” cuando un componente la inicia utilizando el método startService(). Una vez iniciado, el servicio corre en el fondo de manera indefinida, incluso cuando la actividad que inició el servicio haya sido destruída. Normalmente, un servicio iniciado realiza una sola operación y no regresa un resultado al componente que lo inicia.

Asociado(bound):

Un servicio está asociado a un componente si éste utiliza la instrucción bindService(). Un servicio asociado a una actividad por ejemplo, permite enviar peticiones y obtener resultados utilizando IPC(InterProcess Communication). Un servicio asociado corre únicamente mientras exista otro componente. En cuanto éste componente se disocia, el servicio es destruído.

Así como las Activities tiene métodos que hacen override, en los Services también existen ciertos métodos que nos permiten controlar el ciclo de vida de un Servicio:

 

onStartCommand()

El sistema llama éste método cuando otro componente, como una actividad pide que el servicio sea iniciado, utilizando el método startService(). Una vez que el método se ejecuta, el servicio es iniciado y puede correr en el background de manera indefinida. Si se implementa de esta forma, es tu responsabilidad parar el servicio cuando el trabajo esté hecho, utilizando el método stopSelf() o stopService().

 

onBind()

El sistema llama este método cuando otro componente quiere  asociarse con el servicio(similar a la técnica Remote Procedure Call), llamando el método bindService(). En tu implementación de este método, debes proveer una interfase que el usuario use para comunicar con el servicio, regresando un IBinder, el cuál es obligatorio implementar, aunque si no quieres permitir asociaciones, entonces deberá regresar nulo.

onCreate()

El sistema llama éste método cuando el servicio es creado por primera vez, para realizar procedimientos de inicialización. Si el servicio ya está corriendo, el método no es llamado.

onDestroy()

El sistema llama este método cuando el servicio deja de ser usado y entonces se destruye. El servicio puede implementarlo para limpiar cualquier recurso asociado como hilos, listeners, receivers, etc.

 

Implementando un Service

A continuación escribiremos un Servicio muy sencillo que permitirá entender las definiciones anteriores. Puedes descargar el código aquí.

Primeramente, debemos crear un nuevo proyecto en Eclipse SDK.

Ahora, debemos configurar nuestro nuevo proyecto con los siguientes parámetros:

Project Name: SimpleService

Target Name: 1.5

Application Name: SimpleService

Package Name: org.androidtitlan.simpleservice

Create Activity: SimpleService

Min SDK Version: 3

Damos click en Finish y abrimos nuestra clase llamada SimpleService.java, y copiamos lo siguiente:


public class SimpleService extends Activity implements OnClickListener {
Button Start, Stop;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Start = (Button) findViewById(R.id.startbutton);
Stop = (Button) findViewById(R.id.stopbutton);

Start.setOnClickListener(this);
Stop.setOnClickListener(this);
}

 

 

 

public void onClick(View src) {
switch (src.getId()) {
case R.id.startbutton:
Toast.makeText(getApplicationContext(), "Clicked: Starting service", Toast.LENGTH_SHORT).show();
startService(new Intent(this, MyService.class));
break;
case R.id.stopbutton:
Toast.makeText(getApplicationContext(), "Clicked: Stopping service", Toast.LENGTH_SHORT).show();
stopService(new Intent(this, MyService.class));
break;
}
}
}

 

Donde básicamente estamos creando dos botones start y stop, los cuáles asociaremos a un servicio llamado MyService por medio de un intent. y dentro de un OnClickListener.

Presiona CTRL + Shift + O para importar todas las clases y continúa al siguiente paso.

A continuación, debemos copiar el código de la clase MyService


public class MyService extends Service {
private static final String TAG = "MyService";
MediaPlayer player;

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

@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");

player = MediaPlayer.create(this, R.raw.nyan_cat);
player.setLooping(false); // Set looping
}

@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
player.stop();
}

 

@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
player.start();
}
}

Donde, por medio de la instancia player de la clase MediaPlayer podemos reproducir un archivo con extensión mp3 al cuál será infinito justo como el Nyan Cat original, por medio del método setLooping , pasándole true como valor.

 

Listo, ahora has creado un Nyan Cat infinito que corre mientras estás corriendo, leyendo las noticias con Excelsior para Android o jugando Angry Birds :) .

Fuentes:

http://developer.android.com/guide/topics/fundamentals/services.html

http://marakana.com/forums/android/examples/60.html

 



  1. Carlos Chacin

    Introducción a Servicios en Android SDK http://bit.ly/iRX8lF

  2. coders_vzla

    Introducción a Servicios en #Android SDK | AndroidTitlan.Org http://j.mp/ikatgc

  3. José Luis (Reply) on Viernes 1, 2011

    Que tal, recientemente he estado aprendiendo acerca de servicios. Me queda una duda, cuando el teléfono se queda sin batería, el servicio sigue funcionando, de tal forma que cuando se vuelve a cargar el teléfono el servicio continua como si nada, o se detiene?..bueno es todo saludos

  4. José Luis (Reply) on Viernes 1, 2011

    tengo otra duda y es mucho mas importante, al usar un taskkiller eh notado que es posible matar al servicio, eso no deberia ser por algo es un servicio. No se si existe la forma de hacer que el servicio no sea finalizado por un taskkiller?, agradeceria su respuesta saludos

  5. Oscar Vela (Reply) on Viernes 1, 2011

    Me aparece un error al iniciar la aplicación. Utilicé el SDK 2.2, me dice que la aplicación se ha detenido inesperadamente, ni si quiera me deja ver la interfaz

  6. [...] archivo APK utiliza un Servicio que corre en un hilo en segundo plano dentro del sistema operativo, el cuál puede interactuar con [...]


Current month ye@r day *