Link

Servicios e hilos

En este ejemplo vamos a utilizar un sevicio que compruebe si la wifi está conectada no.

Antes de continuar visita https://developer.android.com/guide/components/services?hl=es-419 y revisa el contenido respecto a los tipos de servicios, ciclo de vida, métodos importantes, etc.

Para crear el programa se han seguido los siguientes pasos:

1. Creación de una interface gráfica con dos botones que lancen y paren el servicio.

Android

    public void arrancar(View v) {
        Intent intent = new Intent(this, WifiTest.class);
        startService(intent);
    }

    public void parar(View v) {
        Intent intent = new Intent(this, WifiTest.class);
        stopService(intent);
    }

Para crear y parar el servicio creamos un Intent y llamamos a startService() o stopService() respectivamente.

2. La clase WifiTest es el servicio, por lo que hereda de Service

public class WifiTest extends Service { ... }

No olvides declarar el componente en el fichero Manifest

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

3. Gestión del servicio:

public class WifiTest extends Service {
    private boolean enEjecucion = false;
    Tester tester;
    @Override
    public void onCreate() {
        Log.i("prueba", "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (!enEjecucion) {
            tester = new Tester();
            tester.start();
            enEjecucion = true;
            Log.i("prueba", "arrancando");
        }else {
            Log.i("prueba", "el sevicio ya estaba arrancado");
        }

        return START_STICKY;
    }

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

    @Override
    public void onDestroy() {
        if(enEjecucion)
            tester.interrupt();

        Log.i("prueba", "servicio destruido");
    }
  • onBind() devuelve nulo ya que es un servicio no enlazado.
  • onStartCommand() será el método que se ejecute al lanzar el servicio.
  • Con la variable enEjecucion controlamos si el servicio ya ha sido lanzado con anterioridad.
  • La clase Tester es un hilo que se lanzará a la vez del servicio.

4. La clase Tester es la que incorpora la funcionalidad propia del servicio.

        public boolean comprobarWifi() {
            ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext()
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo networkInfo = connectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (networkInfo.isConnected())
                return true;

            return false;
        }

Desde el servicio se instanciará la clase y se ejecutará el hilo. Al parar el servicio también se parará el hilo.

    @Override
    public void onDestroy() {
        if(enEjecucion)
            tester.interrupt();

        Log.i("prueba", "servicio destruido");
    }