@weidong
2017-07-16T10:48:45.000000Z
字数 4413
阅读 416
Android课程
http://www.jianshu.com/p/acfe78296bb5
http://www.cnblogs.com/whoislcj/p/5595714.html
compile 'org.greenrobot:eventbus:3.0.0'
Activity或Fragment生命周期方法里面进行注册,页面关闭需要取消
EventBus.getDefault().register(this);//注册
EventBus.getDefault().unregister(this);//解除注册
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
//接收一个String类型的消息
@Subscribe
public void onEvent(String msg){
Toast.makeText(this, "msg" + msg, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
发送成功后会执行MainActivity里面的onEvent方法
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//发送一个String类型的消息
EventBus.getDefault().post(new MainMessage("我是消息");
}
});
}
}
public class MainMessage{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainMessage message = new MainMessage();
message.setMessage("我是消息");
EventBus.getDefault().post(message);
}
});
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
//接收自定义消息
@Subscribe
public void onMainMessage(MainMessage message) {
Toast.makeText(this, "msg" + message.getMessage(), Toast.LENGTH_SHORT).show();
}
}
上面演示的代码都用了@Subscribe注解,该注解标识了当前方法为订阅方法,我们可以给方法设置几个属性:
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
public void onMainMessage(MainMessage message) {
Log.e(TAG, "msg" + message.getMessage());
}
事件的优先级类似广播的优先级,优先级越高优先获得消息
@Subscribe(threadMode = ThreadMode.MAIN, priority = 100) //在ui线程执行 优先级100
public void onMainMessage(MainMessage message) {
Log.e(TAG, "msg" + message.getMessage());
}
另外,发送有序广播可以终止广播的继续往下传递,EventBus也实现了此功能
EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递
关于粘性事件,可以参考Android的广播机制,其中有一个粘性广播,粘性广播的意思是:
该广播发送后,会保存在内存中,如果后来有注册的Receiver与之匹配,那么该Receiver便会接收到该广播。那么粘性事件同理,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)。
注意:只会接收到最近发送的一次粘性事件,之前的会接收不到。
需要注解中添加sticky = true
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true) //在ui线程执行,订阅事件为粘性事件
public void onSticky(StickyEvent event) {
Log.e(TAG, "收到粘性事件");
}
public class SecondActivity extends Activity implements View.OnClickListener {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button button1 = findViewById(R.id.sendStickyMessageBtn1);
Button button2 = findViewById(R.id.sendStickyMessageBtn2);
Button button3 = findViewById(R.id.sendStickyMessageBtn3);
Button button4 = findViewById(R.id.sendRegisterBtn);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sendStickyMessageBtn1:
EventBus.getDefault().postSticky(new StickyEvent("粘性事件1"));
Log.e(TAG, "发送粘性事件1...");
break;
case R.id.sendStickyMessageBtn2:
EventBus.getDefault().postSticky(new StickyEvent("粘性事件2"));
Log.e(TAG, "发送粘性事件2...");
break;
case R.id.sendStickyMessageBtn3:
EventBus.getDefault().postSticky(new StickyEvent("粘性事件3"));
Log.e(TAG, "发送粘性事件3...");
break;
case R.id.sendRegisterBtn:
Log.e(TAG, "注册,接收粘性事件...");
EventBus.getDefault().register(this);
break;
}
}
@Subscribe(sticky = true)
public void onEvent(StickyEvent messageEvent) {
Log.d("cylog", "接受到了来自EventBus的事件:" + messageEvent.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
依次点击按钮,执行结果如下: