Servicios o "Daemons" en Android

Los que llevamos un tiempo con Linux en general conocemos el termino de Daemon o demonio y la gente de Windows los conoce como servicios. Son programas que están en segundo plano ejecutándose, esperando algún tipo de llamada o evento para ser lanzados.

En Android como no podía ser de otra forma tenemos algo parecido con los servicios. Estos ofrecen una gran versatilidad a las aplicaciones ya que permiten que ciertas tareas se ejecuten en segundo plano sin tener que seguir en nuestra aplicación, por ejemplo un reproductor de música. Seleccionamos una canción y podemos abrir cualquier otra aplicación. El servicio se encargará de la reproducción de nuestra música.


Vamos a empezar con nuestro servicio, para ello deberéis crear una nueva clase que herede de Service.

public class ExampleService extends Service {
 private Timer mTimer = null; 
 @Override
 public IBinder onBind(Intent arg0) {
  return null;
 }
 
 @Override
 public void onCreate(){
  super.onCreate();
  this.mTimer = new Timer();
  this.mTimer.scheduleAtFixedRate(
    new TimerTask(){
     @Override
     public void run() {
      ejecutarTarea();
     }      
    }
    , 0, 1000 * 60);
 }
 
 private void ejecutarTarea(){
  Thread t = new Thread(new Runnable() {
   public void run() {
    NotifyManager notify = new NotifyManager();
    notify.playNotification(getApplicationContext(),
      HolaMundoActivity.class, "Tienes una notificación"
      , "Notificación", R.drawable.img_notify); 
    
   }
  });  
  t.start();
 }

}

El código del servicio es muy sencillo. En el onCreate es el punto de partida de nuestro servicio. Ahí es desde donde inicializamos todo. En nuestro ejemplo tenemos un Timer que cada 60 segundos se ejecutará. Lo pongo multiplicado por 1.000 para que veáis que se indica el tiempo en milisegundos.

A nuestro Timer le decimos que la tarea que ha de ejecutar cada 60 segundos es ejecutarTarea. Esta lo que va a hacer es simplemente lanzar una notificación mediante una clase que veremos ahora NotifyManager, en un hilo nuevo de ejecución. Esto se hace así para que este proceso no intervenga con el resto de procesos que se están ejecutando en el hilo actual. Todo el código de ejecutarTarea debe ir dentro del Thread.

En este hilo podéis hacer lo que queráis antes de lanzar la notificación, comprobaciones de cualquier tipo para saber si tenéis que avisar al usuario o no de algo. Vamos a ver nuestra clase NotifyManager.


public class NotifyManager {
 
public void playNotification(Context context, Class<?> cls, String textNotification, String titleNotification, int drawable){
   
 /*NOTIFICATION VARS*/
 NotificationManager mNotificationManager;
 int SIMPLE_NOTIFICATION_ID = 1; 
 Notification notifyDetails;
 /*NOTIFICATION INICIO*/
 mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
 notifyDetails = new Notification(drawable,titleNotification,System.currentTimeMillis());
 long[] vibrate = {100,100,200,300};
 notifyDetails.vibrate = vibrate;
 notifyDetails.defaults = Notification.DEFAULT_ALL;
 notifyDetails.flags |= Notification.FLAG_AUTO_CANCEL;
     
 /*NOTIFICATION FIN*/ 
  
 CharSequence contentTitle = titleNotification;
 CharSequence contentText = textNotification;
 
 Intent notifyIntent = new Intent(context, cls );
 
 notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     
 PendingIntent intent = PendingIntent.getActivity(context, 0, notifyIntent, android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
     
 notifyDetails.tickerText = textNotification;
 notifyDetails.setLatestEventInfo(context, contentTitle, contentText, intent);
    
 try{
    mNotificationManager.notify(SIMPLE_NOTIFICATION_ID, notifyDetails);     
 } catch(Exception e){
      
 }
}
 
}

Aquí lo que se hace es crear una notificación con la clase NotificationManager, como veis me lo llevo a una clase porque me será mucho más cómodo de manejar que poner directamente este código en el servicio. El método playNotification recibe la clase que va a poner en un PendintIntent y que se abrirá cuando el usuario vea la notificación, el texto del título y otro para la explicación. También le pasamos una imagen que mostrará en la notificación.


Igual que definimos en el AndroidManifest.xml una Activity, debemos definir también nuestro servicio, en el mismo sitio que están las Activity.


<service android:name=".ExampleService" />


Por último tenemos que lanzar nuestro servicio, para ello en la primera Activity que ejecute nuestra aplicación en el onCreate ejecutamos lo siguiente.


Intent service = new Intent(this, ExampleService.class);
startService(service);

Comments are closed.