Sie sind auf Seite 1von 5

Servicios persistentes en Android

Las aplicaciones Android se programan en Java, y el entorno de desarrollo est enfocado al uso de Eclipse, por lo que es una plataforma bastante accesible para aquellos que estamos acostumbrados a trabajar con Java, ya sea web o en aplicaciones stand-alone. En la documentacin de desarrollo de Android se explica cmo instalar el plugin de Eclipse, adems de los pasos previos, como la instalacin de una versin soportada de Eclipse y el SDK de Android. Existen muchos recursos en Internet para empezar a programar aplicaciones, y dicha documentacin es uno de los ms importantes, porque adems contiene la referencia de la API para todas las versiones de la plataforma. Pero ciertas funcionalidades no estn tan bien documentadas, o puede ser necesario recopilar informacin de mltiples sitios y realizar muchas pruebas para conseguir implementarla. Un claro ejemplo de ello es la programacin de un servicio, no visual, que se inicie con el arranque del terminal. La arquitectura de Android tiene un buen nmero de entidades. Las Activity vienen a representar ventanas o pantallas con las que el usuario interacciona, y suelen contener gran parte del cdigo de las aplicaciones. Los Service estn enfocados a la realizacin de tareas a ms largo plazo, no necesariamente con la participacin directa del usuario. Aqu vamos a programar un servicio que localiza geogrficamente el terminal y hace algo con esa informacin. Otra pieza interesante del ciclo de vida de las aplicaciones Android son los BroadcastReceiver, clases que reciben todo tipo de eventos del sistema (la llegada de un SMS o de una llamada, la conexin o desconexin a una fuente de alimentacin, el enchufado de los auriculares,). En nuestro caso particular, usaremos el evento de arranque completo del terminal para iniciar nuestro servicio de localizacin.

Gran parte de la configuracin de las aplicaciones Android se realiza de forma declarativa en el fichero XML de manifiesto, AndroidManifest.xml. ste sera el manifiesto de nuestra aplicacin.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.javisjava.android.locator" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <receiver android:name="com.javisjava.android.locator.StartupIntentReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> <category android:name="android.intent.category.HOME"></category> </intent-filter> </receiver> <service android:name="com.javisjava.android.locator.LocatorService"> <intent-filter> <action android:name="com.javisjava.android.locator.LocatorService"></action> </intent-filter> </service> </application> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>

Podemos apreciar en la seccin en que se define el Receiver, que el evento que est preparado para gestionar es la finalizacin del arranque del sistema operativo del terminal (BOOT_COMPLETED), y que el tipo de actividad que lo gestionar puede ejecutarse en la home del sistema o Despus se define el servicio que queremos que se ejecute, y se le otorga un nombre, en este caso la cadena "com.javisjava.android.locator.LocatorService". Todava no hemos visto cmo el Receiver inicia el Service, ni qu hace ste. Vamos a ver el cdigo del primero.
package com.javisjava.android.locator; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent;

public class StartupIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(); serviceIntent.setAction("com.javisjava.android.locator.LocatorSer vice"); context.startService(serviceIntent); } }

Los BroadcastReceiver reciben el evento para el que estn configurados en el manifiesto en su mtodo onReceive. En eventos ms complejos, como la llegada de un SMS, hay un extra de informacin (como el remitente y el contenido del mensaje) que va contenida en el objeto de tipo Intent. En este caso no es necesaria ms informacin, sabemos que el sistema se ha arrancado porque ha llegado el evento. El servicio se inicia por su nombre, el mismo que se le asign en el manifiesto. El cdigo del servicio es el siguiente.
package com.javisjava.android.locator; import import import import import import import import import import android.app.Service; android.content.Context; android.content.Intent; android.location.Location; android.location.LocationListener; android.location.LocationManager; android.os.Bundle; android.os.IBinder; android.util.Log; android.widget.Toast;

public class LocatorService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Toast.makeText(this, "Service Created", Toast.LENGTH_LONG).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // Avoids service termination

startForeground(0, null); Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 50, locationListener); locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 5 * 60 * 1000, 50, locationListener); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); locationManager.removeUpdates(locationListener); Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); } LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { // Called when a new location is found by the location providers Log.i("Locator", location.toString()); } public void onProviderEnabled(String provider) { } public void onProviderDisabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } }; }

En el mtodo onCreate se puede incluir cdigo que se ejecuta cuando el servicio se crea (se instancia). Hemos utilizado la clase Toast en l y en otros para presentar mensajes rpidos en la pantalla del terminal. En el mtodo onStartCommand es donde se indica qu queremos que haga nuestro servicio. Son especialmente importantes la ejecucin de startForeground y la devolucin de START_STICKY para que el sistema no pare y deseche el servicio cuando relice labores de

recoleccin de memoria, y, en caso de que lo haga, lo vuelva a iniciar en el estado en el que se encontraba, respectivamente. Como se puede observar, el servicio registra un objeto de una clase interna annima que implementa el interfaz LocationListener para que reciba las actualizaciones de la posicin de los dos proveedores que soporta Android: el GPS y el clculo basado en las redes wifi que invent Google. En el ejemplo, se ha configurado para indicar (no es totalmente preciso) que reciba actualizaciones cada cinco minutos, y slo si la nueva posicin dista ms de 50 metros de la anterior que se envi al Listener. Si bajamos al ste ltimo, vemos que lo nico que hace es enviar los datos de la nueva posicin al log, que puede verse en la vista LogCat de Eclipse con el mvil conectado por USB (si previamente se ha activado el debugging USB en los ajustes de aplicaciones en el propio terminal). En un ejemplo ms complejo, estos datos podran enviarse por HTTP a un servidor, junto con la identificacin nica de terminal o el nmero de SIM. As funcionan algunas aplicaciones que permiten localizar terminales perdidos o robados, e incluso resetearlos a valores de fbrica borrando todos los datos de manera remota. Finalmente, en el mtodo onDestroy, liberamos al sistema de enviar ms actualizaciones al Listener. En nuestro caso, el servicio est pensado para apagarse slo cuando lo hace el terminal, pero tambin podra pararse desde el control de servicios activos en los ajustes del sistema, y adems es bueno acostumbrarse a liberar los recursos y a cerrar las conexiones que ya no se utilizan, en cualquier entorno, pero especialmente en dispositivos con memoria y procesador ms modestos que los ordenadores de escritorio o los servidores. Si volvemos una ltima vez al manifiesto, observamos que se definen dos permisos necesarios para que la aplicacin funcione, el de recepcin del evento de arranque del sistema, y el acceso a la geolocalizacin de forma precisa. Cuando una aplicacin se sube al Android Market, el usuario que la descarga es avisado y debe aceptar otorgar los permisos que sta necesita. Adjunto el proyecto Eclipse con el cdigo de la aplicacin Android.

Das könnte Ihnen auch gefallen