Создание приложения для Android с несколькими активными компонентами, взаимодействующими друг с другом, может быть утомительным. Чтобы сэкономить время, разработчики часто используют тесно связанные компоненты в своих приложениях. EventBus — это популярная библиотека с открытым исходным кодом, созданная для решения этой проблемы с использованием шаблона издатель / подписчик .
Используя библиотеку EventBus, вы можете передавать сообщения из одного класса в один или несколько классов всего за несколько строк кода. Более того, все участвующие классы полностью отделены друг от друга, что приводит к тому, что код становится менее сложным, а его легче поддерживать и отлаживать.
В этом кратком совете вы узнаете, как использовать библиотеку EventBus, создав простое приложение для Android, отображающее состояние зарядки устройства. Поскольку изменения в статусе начисления платы являются системными событиями, приложение будет иметь Activity
которая должна получать информацию от BroadcastReceiver
— идеальный сценарий для использования шины событий.
Предпосылки
Убедитесь, что у вас установлена Eclipse ADT Bundle. Вы можете скачать его с сайта разработчика Android .
1. Создать новый проект
Запустите Eclipse и создайте новое приложение для Android. Назовите приложение EventBusSample
. Выберите уникальное имя пакета и установите Минимальный необходимый SDK для Android 2.2 и Target SDK для Android 4.4 .
Мы собираемся создать действие самостоятельно, поэтому отмените выбор « Создать действие» и нажмите « Готово» .
2. Редактировать Манифест
Это приложение имеет один BroadcastReceiver
который отвечает на следующие действия:
-
android.intent.action.ACTION_POWER_CONNECTED
-
android.intent.action.ACTION_POWER_DISCONNECTED
Назовите BroadcastReceiver
ChargingReceiver
и объявите его в файле AndroidManifest.xml
.
1
2
3
4
5
6
|
<receiver android:name=».ChargingReceiver»>
<intent-filter>
<action android:name=»android.intent.action.ACTION_POWER_CONNECTED» />
<action android:name=»android.intent.action.ACTION_POWER_DISCONNECTED» />
</intent-filter>
</receiver>
|
Приложение имеет одну Activity
для отображения статуса зарядки. Назовите его DisplayActivity
и объявите его, как показано ниже.
1
2
3
4
5
6
|
<activity android:name=».DisplayActivity»>
<intent-filter>
<action android:name=»android.intent.action.MAIN»/>
<category android:name=»android.intent.category.LAUNCHER» />
</intent-filter>
</activity>
|
3. Добавить библиотеку EventBus
Загрузите последнюю версию библиотеки EventBus в виде JAR из Maven Central и добавьте JAR в каталог libs
вашего проекта.
4. Создайте класс ChargingEvent
События на шине событий — это не что иное, как объекты, содержащие информацию, которая должна быть передана. Пусть ChargingEvent
будет именем класса, который содержит информацию, переданную из BroadcastReceiver
в Activity
. Это простой класс, который имеет только String
для представления информации. Он также имеет конструктор для установки значения строки и метод доступа для получения ее значения.
Создайте новый файл с именем ChargingEvent.java и добавьте в него следующий код:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
package com.hathy.eventbussample;
public class ChargingEvent {
private String data;
public ChargingEvent(String data){
this.data = data;
}
public String getData(){
return data;
}
}
|
5. Создайте класс BroadcastReceiver
Создайте новый класс с именем ChargingReceiver
который расширяет BroadcastReceiver
. Этот класс использует шину событий для публикации сообщений. У него есть переменная с именем bus
, которая ссылается на шину, созданную библиотекой EventBus. Шина является одиночной, и вы должны использовать метод getDefault
чтобы обратиться к ней.
В методе onReceive
мы создаем новый экземпляр класса ChargingEvent
и добавляем в него наше сообщение. Вот пример сообщения:
1
|
@14:23:20 this device started charging.
|
Чтобы сгенерировать это сообщение, нам нужно сделать следующее:
- Используйте методы, доступные в классе
Time
чтобы установить время, когда произошло событие. - Добавьте строку «это устройство начало заряжать | разряжать» в зависимости от полученного действия. Если получено действие
Intent.ACTION_POWER_CONNECTED
, устройство заряжается. Если этоIntent.ACTION_POWER_DISCONNECTED
, устройство разряжается.
Как только объект ChargingEvent
получает правильную информацию, он публикуется на шине событий с использованием метода post
. Реализация класса ChargingReceiver
теперь должна выглядеть следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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;
public class ChargingReceiver extends BroadcastReceiver {
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);
}
}
|
Как видите, публикация сообщений на шину событий занимает всего одну строку кода. Более того, издателю не нужно ничего знать о подписчике (-ах).
6. Создайте класс DisplayActivity
Создайте новый класс с именем DisplayActivity
. Этот класс отвечает за отображение сообщений о событиях, опубликованных на шине событий.
Этот класс также имеет переменную, которая ссылается на шину событий. Поскольку библиотека EventBus следует шаблону синглтона, экземпляр шины событий, доступной для этого Activity
совпадает с экземпляром, доступным для BroadcastReceiver
.
Чтобы позволить классу подписаться на события на шине, вызывается метод register
. В нашей Activity
мы вызываем это в методе onCreate
.
Аналогично, для прекращения получения событий вызывается метод unregister
. Мы вызываем этот метод в методе onDestroy
чтобы убедиться, что все ресурсы освобождены.
Действие имеет очень простой макет, содержащий только TextView
который отображает сообщения. Поэтому нет необходимости создавать макет для него. Мы просто используем TextView
как представление содержимого Activity
.
На этом этапе реализация класса DisplayActivity
должна выглядеть следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package com.hathy.eventbussample;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import de.greenrobot.event.EventBus;
public class DisplayActivity extends Activity {
private EventBus bus = EventBus.getDefault();
private TextView view;
@Override
protected void 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
protected void onDestroy() {
// Unregister
bus.unregister(this);
super.onDestroy();
}
}
|
Каждый класс, который намеревается получать события из шины событий, должен содержать метод onEvent
. Имя этого метода важно, потому что библиотека EventBus использует Java Reflection API для доступа к этому методу. У него есть один параметр, который относится к событию. В нашем случае параметр будет иметь тип ChargingEvent
.
Все, что мы делаем в этом методе — добавляем последнее полученное сообщение к содержимому TextView
. Реализация метода onEvent
выглядит следующим образом:
1
2
3
|
public void onEvent(ChargingEvent event){
view.setText(view.getText() + «\n» + event.getData());
}
|
7. Запустите и проверьте
Приложение теперь готово к тестированию. Скомпилируйте и запустите его на физическом устройстве Android. Как только приложение завершит запуск, подключите и отключите шнур питания пару раз, чтобы увидеть изменение состояния зарядки.
Вывод
В этом руководстве вы узнали, как использовать библиотеку EventBus и насколько она упрощает взаимодействие между классами. Библиотека оптимизирована для платформы Android и очень легкая. Это означает, что вы можете использовать его в своих проектах, не беспокоясь о размере вашего приложения. Чтобы узнать больше о библиотеке EventBus, посетите проект на GitHub .