Sesión 8 - Servicios avanzados
Servicios en segundo plano
Los servicios en segundo plano, Service
s son similares a los demonios de los sistemas GNU/Linux. No necesitan una aplicación abierta para seguir ejecutándose. Sin embargo para el control de un servicio (iniciarlo, detenerlo, configurarlo) sí que es necesario programar aplicaciones con sus actividades con interfaz gráfica. En esta sección vamos a ver cómo crear nuestros propios servicios.
Los servicios heredan de la clase Service
e implementan obligatoriamente el método onBind(Intent)
. Este método sirve para comunicación entre servicios y necesita que se defina una interfaz AIDL (Android Interface Definition Language). Devolviendo null
estamos indicando que no implementamos tal comunicación.
Es muy importante declarar el servicio en AndroidManifest.xml
:
Si el servicio se encontrara declarado dentro de otra clase, el android:name
contendría: .MiOtraClase$MiServicio
.
El ciclo de vida del servicio empieza con la ejecución del método onCreate()
, después se invoca al método onStartCommand(...)
y finalmente al detener el servicio se invoca al método onDestroy()
.
En versiones anteriores a Android 2.0 los servicios se arrancaban con el método
onStart()
. Utilizar el métodoonStartCommand
y devolver la constanteService.START_STICKY
es similar a usar el meodoonStart()
. Esta constante se utiliza para servicios que se arrancan y detienen explícitamente cuando se necesitan.
Para arrancar y detener el servicio desde una aplicación se utilizan los métodos
El servicio también puede detenerse a sí mismo con el método selfStop()
.
Notificaciones
El típico mecanismo de comunicación con el usuario que los Servicios utilizan son las Notification
. Se trata de un mecanismo mínimamente intrusivo que no roba el foco a la aplicación actual y que permanece en una lista de notificaciones en la parte superior de la pantalla, que el usuario puede desplegar cuando le convenga.
Para trabajar mostrar y ocultar notificaciones hay que obtener de los servicios del sistema el NotificationManager
. Su método notify(int, Notification)
muestra la notificación asociada a determinado identificador.
El identificador sirve para actualizar la notificación en un futuro (con un nuevo aviso de notificación al usuario). Si se necesita añadir una notificación más, manteniendo la anterior, hay que indicar un nuevo ID.
Para actualizar la información de un objeto Notification
ya creado, se utiliza el método
donde contentIntent
es un Intent
para abrir la actividad a la cuál se desea acceder al pulsar la notificación. Es típico usar las notificaciones para abrir la actividad que nos permita reconfigurar o parar el servicio. También es típico que al pulsar sobre la notificación y abrirse una actividad, la notificación desaparezca. Este cierre de la notificación lo podemos implementar en el método onResume()
de la actividad:
A continuación se muestra un ejemplo completo de notificaciones usadas por una tarea AsyncTask
, que sería fácilmente integrable con un Service
. (Sólo haría falta crear una nueva MiTarea
en Service.onCreate()
, arrancarla con miTarea.execute()
desde Service.onStartCommand(...)
y detenerla con miTarea.cancel()
desde Service.onDestroy()
).
AppWidgets
Los widgets, que desde el punto de vista del programador son AppWidget
s, son pequeños interfaces de programas Android que permanecen en el escritorio del dispositivo móvil. Para añadir alguno sobra con hacer una pulsación larga sobre un área vacía del escritorio y seleccionar la opción "widget", para que aparezca la lista de todos los que hay instalados y listos para añadir.
Este es un ejemplo de widget, el del reloj, que viene con Android:
Los AppWidgets ocupan determinado tamaño y se refrescan con determinada frecuencia, datos que hay que declarar en el XML que define el widget. Se puede añadir como nuevo recurso XML de Android, y seleccionar el tipo Widget. Lo coloca en la carpeta res/xml/
. Por ejemplo, este es el res/xml/miwidget.xml
:
Este XML declara que el Layout del widget se encuentra en res/layout/miwidget_layout.xml
.
Los AppWidgets no necesitan ninguna actividad, sino una clase que herede de AppWidgetProvider
. Por tanto en el AndroidManifest.xml
ya no necesitamos declarar una actividad principal. Lo que tenemos que declarar es el widget:
También puede ser necesario declarar, además de los permisos que se requieran, el uso del servicio que actualice el widget o que realice alguna tarea en background. En el anterior manifest se declara el servicio UpdateService
dentro de la clase MiWidget
.
A continuación se muestra un ejemplo de clase MiWidget
que implementa un widget:
La actualización se realiza por medio de la clase RemoteViews
, con métodos como .setTextViewText(String)
, .setImageViewBitmap(Bitmap)
, etc, con el propósito de actualizar los valores del layout indicado en la creación del RemoteViews
, R.layout.miwidget_layout
en este caso.
Publicación de software
Para publicar nuestras aplicaciones primero tenemos que empaquetarlas. Antes de empaquetar debemos preparar el código y comprobar que todo esté correcto:
Nombre de la aplicación, icono y versión.
Deshabilitar debugging en el AndroidManifest.xml (atributo
android:debuggable="false"
del tag de application).Eliminar cualquier mensaje de Log.
Pedir sólo los permisos que de verdad la aplicación use, y no más de los necesarios.
Por supuesto, haber probado la aplicación en terminales reales, a ser posible en más de uno.
Los paquetes de aplicaciones Android se pueden generar fácilmente con el plugin de Eclipse, pulsando sobre el proyecto con el botón derecho y seleccionando la opción Android Tools / Export Signed Application Package. Esto nos generaría el paquete con extensión apk (android package).
Para distribuir nuestra aplicación el paquete debe ir firmado (la firma nos la pide el asistente de Eclipse al empaquetar). Una firma digital puede ir certificada por una entidad certificadora conocida, o bien sin autoridad certificadora, "self-signed". Se puede usar la herramienta keytool
para generar un certificado así.
Para firmar un .apk ya generado se puede utilizar la herramienta jarsigned
. Ambas herramientas vienen con el Android SDK.
Una vez firmado el paquete, ya está listo para ser publicado.
Si cambiamos de certificado en las versiones siguientes del programa, podemos tener el problema de que el terminal compruebe el certificado y no le coincida. En este caso hay que desinstalar por completo la aplicación y entonces instalar la nueva versión. Los updates de la aplicación asumen que el certificado no va a cambiar.
Otra opción es colgar la aplicación empaquetada en nuestro propio servidor. En este caso quien desee instalársela necesitará tener habilitada la instalación desde fuentes desconocidas en la configuración de su terminal Android.
Última actualización
¿Te fue útil?