En sesiones anteriores de nuestro curso Android te hemos explicado cómo crear tu primera aplicación, así como la manera de optimizarla usando múltiples hilos de procesamiento; en esta ocasión te enseñaremos a recibir eventos del sistema y/o de otras aplicaciones.

En Android distinguimos dos tipos de eventos:

Los relacionados con la interfase gráfica, como por ejemplo los relacionados con el ciclo de vida de una actividad y/o los clics en los diferentes elementos que conforman una ventana, y que son programables mediante el propio lenguaje Java.

El resto de eventos, que no se refieren a la interfase gráfica, y que no son directamente tratables mediante las funciones y procedimientos estándar de Java, como por ejemplo la detección de la llegada de un nuevo mensaje de texto o del apagado de la pantalla.

Separador de apartados

Eventos de la aplicación

Como indicamos en el capítulo anterior, el lenguaje de programación Java permite a una clase incorporar las funciones y procedimientos de otra mediante la utilización de las directivas extends (extiende, hereda) o implements (implementa).

Las interfaces son clases abstractas que se usan para definir métodos de entrada (callbacks) que se codifican en la clase que los implementa.

Las interfaces son utilizadas por el sistema para implementar los eventos (generalmente los clics en botones, eventos de los temporizadores, etc), y pueden implementarse a través de una clase o de forma anónima, tal como se indica en los ejemplos que siguen.

Implementación a través de una clase

class MyClass implements OnClickListener
{
  MyClass()
  {
    Button button;
    ...
    button.setOnClickListener(this);
  }

  public void onClick(View view)
  {
    ...
  }
}

Implementación anónima

class MyClass implements OnClickListener
{
  MyClass()
  {
    Button button;
    ...
    button.setOnClickListener(new OnClickListener()
    {
      public void onClick(View view)
      {
        ...
      }
    });
  }
}

Otros eventos

Los eventos externos a la propia aplicación se implementan a través de una clase denominada BroadcastReceiver, la cual implementa el método onReceive, que es el punto de acceso a los objetos de dicha clase.

Si el programador desea que un evento concreto, por ejemplo el que se activa cuando el sistema acaba de iniciarse y está preparado para ejecutar programas, se active incluso si la aplicación que lo recibe no se está ejecutando, debe declararlo en el manifiesto, lo que indicará al sistema este hecho y lo preparará para ejecutarlo cuando sea necesario.

<manifest ...>
  <application ...>
    <receiver android:name=”.BootCompletedBroadcastReceiver”>
      <intent-filter>
        <action android:name=”android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
    </receiver>
  </application>
</manifest>

El programador es el encargado de incorporar a su proyecto las clases que implementan cada uno de los BroadcastReceiver que declare (en el ejemplo anterior habría que definir la clase BootCompletedBroadcastReceiver, que extendería las propiedades de la clase BroadcastReceiver).

Adicionalmente, debe tenerse en cuenta que algunos eventos son de acceso privilegiado, por lo que necesitan que el usuario suministre a la aplicación una serie de permisos cuando ésta se instala, y que también deben enumerarse en el manifiesto.

<manifest ...>
  <uses-permission android:name=”android.permission.RECEIVE_SMS” />
</manifest>

No obstante, también es posible definir un receiver que monitorice eventos sólo cuando la aplicación, o un determinado servicio o actividad, se encuentran en ejecución, para lo cual debe implementarse la correspondiente instancia de la clase BroadcastReceiver e instanciarse tal como se indica en el ejemplo.

class MyActivity extends Activity
{
  class MyActivityBroadcastReceiver extends BroadcastReceiver
  {
    public void onReceive(Context context, Intent intent)
    {
      ...
    }
  }

  private BroadcastReceiver iBroadcastReceiver = new MyActivityBroadcastReceiver();

  public void onResume()
  {
    super.onResume();
    registerReceiver(iBroadcastReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
  }

  public void onPause()
  {
    unregisterReceiver(iBroadcastReceiver);
    super.onPause();
  }
}

Nótese que los eventos empezarán a monitorizarse a partir de la llamada al procedimiento registerReceiver (presente en las clases Activity y Service) y dejarán de monitorizarse tras la llamada a unregisterReceiver (que debe realizarse forzosamente antes de que el objeto sea destruido, para evitar errores posteriores).

Recepción de parámetros

El procedimiento onReceive de la clase BroadcastReceiver se ejecuta cuando se activa el evento para el cual ha sido programado, recibiendo como parámetros el contexto de la aplicación en el que se ejecuta y un intent que contiene el tipo de evento activado (intent.getAction), así como el resto de parámetros asociados al mismo (accesibles usando las funciones intent.getBooleanExtra, intent.getIntExtra, etc).

La próxima semana os explicaremos cómo comunicar dos aplicaciones diferentes, para lo que usaremos parte de los conocimientos introducidos en esta sesión, concretamente las clases BroadcastReceiver e Intent.

En cuanto a la aplicación de éstos a nuestro programa de ejemplo, no hemos encontrado la posibilidad de aplicarlos, por lo que hemos creado un proyecto nuevo, en el que detectaremos cuándo se enciende o apaga la pantalla de nuestro dispositivo. Os recomendamos que hagáis un seguimiento del archivo de log, para lo cual podéis usar el comando “adb logcat.

Como siempre, os invitamos a visitar el Hilo oficial del Curso de Android de Foromóviles, donde podéis hacernos llegar vuestras dudas y comentarios.




Ingeniero en Informática por la Universidad Politécnica de Cataluña.Programador en perl, php, c++, Java,...Desarrollador reconocido del foro XDA-Developers.Usuario Android desde 2009, y actualmente también desarrollador de utilidades y ROMs para ese sistema.Mi primer smartphone fue un Qtek-S100, en 2005, y desde entonces ando buscando el dispositivo perfecto. Si no fuera por la crisis cambiaría de móvil varias veces al día :)

Sin comentarios

Deja una respuesta