Iniciar un servicio en Android al encender el teléfono

Buenas,

En esta entrada voy a recordar cómo se crea e inicia un servicio en Android cuando arrancamos el sistema. Lo dejo por si a alguien le sirve y me vendrá muy bien para que no se me olvide.

Un servicio es un proceso que se ejecuta en segundo plano y no necesita de una interfaz para hacerlo. Lo que pretendemos es que se ejecute al iniciar el sistema Android.

Cuando un sistema Android se inicia hace una llamada a un procedimiento "broadcast" que avisa a todos los demás procesos de que el sistema se ha iniciado: android.intent.action.BOOT_COMPLETED. Lo que hacemos es crear una clase que "escuche" esta llamada e inicie nuestro servicio. La clase que es capaz de escuchar estas llamadas broadcast es BroadcastReceiver. Por tanto, lo primero es crear una clase que extienda de la clase anterior:
public class IniciadorServicio extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Intent servicio = new Intent();
        servicio.setAction("MiServicio");
        context.startService(servicio);
    }
}

Al método startService le pasamos el Intent servicio, que es el servicio que queremos ejecutar, cuyo nombre será MiServicio:

public class Servicio extends Service
{
    private static final String TAG = "EjemploServicio";
     private Timer timer;
 
    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }
 
    @Override
    public void onCreate()
    {
        super.onCreate();
        Log.d(TAG, "El servicio se ha creado");
        timer = new Timer();
    }
 
    @Override
    public void onStart(final Intent intent, final int startId)
    {
        super.onStart(intent, startId);
        timer.scheduleAtFixedRate(new TimerTask() 
        {
            @Override
            public void run() 
            {
                Log.i(TAG, "Ejecutando la tarea del servicio");
            }
        }, 0, 30000);
    }
}

Lo que hace nuestro servicio es sencillo, al crearse inicializamos un Timer para ejecutar una tarea cada cierto tiempo. Cuando comienza el servicio, en el método onStart configuramos el Timer creado indicando lo que debe hacer (en esta caso imprime en el log del emulador "Ejecutando la tarea del servicio") cada 30 segundos.

Finalmente, tenemos que configurar el manifiesto del servicio registrando el IniciadorServicio y el propio servicio MiServicio:

 <manifest android:versioncode="1" android:versionname="1.0" package="foo.bar"   
 xmlns:android="http://schemas.android.com/apk/res/android">  
   <application>  
     <service android:name=".MiServicio">  
       <intent-filter>  
         <action android:name="MiServicio">  
       </action></intent-filter>  
     </service>  
     <receiver android:name=".IniciadorServicio">  
       <intent-filter>  
         <action android:name="android.intent.action.BOOT_COMPLETED">  
       </action></intent-filter>  
     </receiver>  
   </application>  
   <uses-sdk android:minsdkversion="3">  
   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">  
 </uses-permission></uses-sdk></manifest>  

Lo que hacemos en el manifiesto es registrar el servicio MiServicio y registrar el tipo de señal que espera nuestro IniciadorServicio para ejecutarse. También indicamos que nuestro servicio requiere permisos para conocer cuando se ha iniciado el sistema (linea 15).
spacer

Cómo hacer VPN desde windows y no perder la conexión a Internet

Buenas a tod@s,

En Windows, cuando nos creamos una conexión VPN contra un servidor que no nos da acceso a Internet y nos conectamos a ella resulta que a pesar de que estamos conectados a nuestra red habitual con la que accedemos a Internet, nos quedamos sin conexión.

Voy a dejar la solución para continuar conectado a Internet estando conectados a la VPN que hemos creado:

Para ello, sobre tu conexión VPN le damos a Propiedades, buscamos Funciones de red --> Protocolo IPv4 --> Propiedades --> Opciones Avanzadas y debemos quitar el check que dice "Usar la puerta de enlace predeterminada en la red remota". De ese modo, usamos nuestra puerta de enlace para salir a Internet.

Y ya está, así de fácil (o de difícil).

Saludos.
spacer