最近项目中需要实现一个功能,当用户要发布一条消息时,在当前activity堆栈中可能存在多个页面需要感知到这一事件,并将这条消息显示在最顶端。一开始想到用广播去实现,但是广播会让所有的应用都接收到广播,虽然可以过滤掉;后来寻找解决方案的过程中发现了EventBus,它提供的解决方案非常优雅,这里记录一下。(LocalBroadcastManager也可以实现,但是代码比起EventBus来说复杂一些)
实现上述功能所需代码示例如下:
1、定义一个事件
public class PublishDynamicEvent{
private Dynamic dynamic;
private Dynamic sendingDynamic;
public PublishDynamicEvent(Dynamic dynamic, Dynamic sendingDynamic) {
this.dynamic = dynamic;
this.sendingDynamic = sendingDynamic;
}
public Dynamic getDynamic(){
return dynamic;
}
public Dynamic getSendingDynamic() {
return sendingDynamic;
}
}
2、在需要感知该事件发生的activity中添加下述方法:
public void onEventMainThread(PublishDynamicEvent event) {
…//处理该事件
}
在onCreate方法中注册:
@Override
public void onCreate(Bundle savedInstanceState) {
...
EventBus.
getDefault().register(this);
}
在onDestroy方法中取消注册:
@Override
protected void onDestroy(){
super.onDestroy();
EventBus.
getDefault().unregister(this);
}
3、在发布该事件的地方添加下面一句话:
EventBus.
getDefault().post(new PrePublishDynamicEvent(dynamic));
是不是非常简单,可读性和灵活性都很高。EventBus应用的场景非常广泛,传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调等都可以用用它来替代,再举个常见的例子:你的某些页面需要在接收到某些推送通知时,在布局上发生相应变化,诸如显示小红点,新消息数之类的提醒,都可以使用EventBus。
参考: