3. Agregar EventBus Library
Descargue la última versión de la biblioteca EventBus como JAR de Maven Central y agregue el JAR en el directorio libs
su proyecto.
4. Crear clase de ChargingEvent
Los eventos en el bus de eventos no son más que objetos que contienen la información que necesita ser comunicada. Deje que ChargingEvent
sea el nombre de la clase que contiene la información transmitida desde BroadcastReceiver
a la Activity
. Esta es una clase simple que solo tiene una String
para representar la información. También tiene un constructor para establecer el valor de la cadena y un descriptor de acceso para obtener su valor.
Cree un nuevo archivo llamado ChargingEvent.java y agregue el siguiente código:
package
com.hathy.eventbussample;
class
ChargingEvent {
class
public
ChargingEvent {
String data;
private
String data;
public
ChargingEvent(String data){
this.data = data;
}
public
String getData(){
return
data;
}
}
5. Crear clase BroadcastReceiver
Cree una nueva clase llamada ChargingReceiver
que extienda BroadcastReceiver
. Esta clase usa el bus de eventos para publicar mensajes. Tiene una variable llamada bus
, que hace referencia al bus creado por la biblioteca EventBus. El bus es un singleton y debe usar el método getDefault
para referirse a él.
En el método onReceive
, creamos una nueva instancia de la clase ChargingEvent
y le agregamos nuestro mensaje. Aquí hay un mensaje de muestra:
1
@14:23:20 this device started charging.
Para generar este mensaje, debemos hacer lo siguiente:
- Use los métodos disponibles en la clase
Time
para establecer la hora a la que ocurrió el evento.
- Agregue la cadena "este dispositivo comenzó a cargar | descargar" en función de la acción recibida. Si la acción recibida es
Intent.ACTION_POWER_CONNECTED
, el dispositivo se está cargando. Si es Intent.ACTION_POWER_DISCONNECTED
, el dispositivo se está descargando.
Una vez que el objeto ChargingEvent
tiene la información correcta, se publica en el bus de eventos utilizando el método de post
. La implementación de la clase ChargingReceiver
ahora debería verse así:
package
com.hathy.eventbussample;
import
de.greenrobot.event.EventBus;
import
android.content.BroadcastReceiver;
import
android.content.Context;
import
android.content.Intent;
import
android.text.format.Time;
ChargingReceiver extends
class
public
ChargingReceiver extends
BroadcastReceiver {
EventBus bus = EventBus.getDefault();
private
EventBus bus = EventBus.getDefault();
@Override
public
void
onReceive(Context context, Intent intent) {
ChargingEvent event = null;
// Get current time
Time now = new
Time();
now.setToNow();
String timeOfEvent = now.format("%H:%M:%S");
String eventData = "@"
+ timeOfEvent + " this device started ";
if(intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)){
event=new
ChargingEvent(eventData+"charging.");
} else
if(intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)){
event=new
ChargingEvent(eventData+"discharging.");
}
// Post the event
bus.post(event);
}
}
Como puede ver, publicar mensajes en el bus de eventos solo requiere una sola línea de código. Además, el editor no necesita saber nada sobre los suscriptores.
6. Crear clase DisplayActivity
Cree una nueva clase llamada DisplayActivity
. Esta clase es responsable de mostrar los mensajes de los eventos publicados en el bus de eventos.
Esta clase también tiene una variable que hace referencia al bus de eventos. Como la biblioteca EventBus sigue el patrón singleton, la instancia del bus de eventos disponible para esta Activity
es la misma que la instancia disponible para BroadcastReceiver
.
Para permitir que una clase se suscriba a eventos en el bus, se invoca el método de register
. En nuestra Activity
, lo llamamos en el método onCreate
.
Del mismo modo, para dejar de recibir eventos, se invoca el método para unregister
el unregister
. Llamamos a este método en el método onDestroy
para asegurarnos de que se liberan todos los recursos.
La Activity
tiene un diseño muy básico, que contiene solo un TextView
que muestra los mensajes. Por lo tanto, no es necesario crear un diseño para ello. Simplemente usamos TextView
como la vista de contenido de la Activity
.
En este punto, la implementación de la clase DisplayActivity
debería verse así:
package
com.hathy.eventbussample;
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.TextView;
import
de.greenrobot.event.EventBus;
public
class
public
DisplayActivity extends
Activity {
EventBus bus = EventBus.getDefault();
private
EventBus bus = EventBus.getDefault();
TextView view;
private
TextView view;
@Override
void
protected
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new
TextView(this);
view.setTextSize(20f);
view.setPadding(20, 20, 20, 20);
view.setText("Waiting for events...");
setContentView(view);
// Register as a subscriber
bus.register(this);
}
@Override
void
protected
onDestroy() {
// Unregister
bus.unregister(this);
super.onDestroy();
}
}
Cada clase que tiene la intención de recibir eventos del bus de eventos debe contener un método onEvent
. El nombre de este método es importante, porque la biblioteca EventBus usa la API Java Reflection para acceder a este método. Tiene un solo parámetro que se refiere al evento. En nuestro caso, el parámetro será del tipo ChargingEvent
.
Todo lo que hacemos en este método es agregar el último mensaje recibido al contenido de TextView
. La implementación del método onEvent
se ve así:
public
void
onEvent(ChargingEvent event){
view.setText(view.getText() + "\n"
+ event.getData());
}
7. Ejecutar y probar
La aplicación ahora está lista para ser probada. Compile y ejecútelo en un dispositivo Android físico. Una vez que la aplicación haya terminado de iniciarse, conecte y desconecte el cable de alimentación un par de veces para ver cómo cambia el estado de carga.