EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。
这里介绍下 主线程发送消息、发送粘性事件。
布局展示:
点击任一个跳转到下面的activity
操作步骤如下:
主线程发送消息
1,注册
2,解注册
3,创建发送消息类
4,发布消息
5,接收消息
发送粘性事件:
1,创建发送消息类
2,发布消息
3,注册
4,解注册
5,接收消息
练习代码:
第一个activity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_one;
private Button btn_two;
private TextView tv_main;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_one=(Button)findViewById(R.id.btn_one);
btn_two=(Button)findViewById(R.id.btn_two);
tv_main=(TextView)findViewById(R.id.tv_main);
btn_two.setOnClickListener(this);
btn_one.setOnClickListener(this);
//注册广播
EventBus.getDefault().register(MainActivity.this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_one://主线程发送消息
intent=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
break;
case R.id.btn_two://发送粘性消息
EventBus.getDefault().postSticky(new StickyEvent("粘性消息"));
intent=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//解注册广播
EventBus.getDefault().unregister(MainActivity.this);
}
//主线程:接收消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void getEventMessage(EventBean bean){
tv_main.setText(bean.string);
}
}
第二个activity:
public class Main2Activity extends AppCompatActivity implements View.OnClickListener {
private Button btn_one;
private Button btn_two;
private TextView tv_main2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
btn_one=(Button)findViewById(R.id.btn_one);
btn_two=(Button)findViewById(R.id.btn_two);
tv_main2=(TextView)findViewById(R.id.tv_main2);
btn_two.setOnClickListener(this);
btn_one.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_one://主线程消息:发送消息
EventBus.getDefault().post(new EventBean("在吗?"));
finish();
break;
case R.id.btn_two://粘性消息:注册
EventBus.getDefault().register(Main2Activity.this);
break;
}
}
//接收粘性消息
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void getSticky(StickyEvent event){
tv_main2.setText(event.msg);
}
//解注册
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(Main2Activity.this);
}
}
有一点需要的注意的是:在第二个activity的注册粘性消息,如果按多次(二次)会出现奔溃?所以为了避免按多次,可以进行一个boolean判断,来判断是否需要执行注册代码