对与开发android ,寻找开源框架并使用,是我们快速开发的途径。下边就带你走进广播的使用,第三方开源 EventBus
在as 上开发
一 在自己项目app build.gradle 加上
compile 'org.greenrobot:eventbus:3.0.0'
二 自定义一个消息类,生成构造方法。这个就是发布的事件
/**
* 消息事件类
*/
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
在需要接受广播消息的activity 的onCreate () 注册监听;在onDestroy()取消监听
// 注册事件
EventBus.getDefault().register(this);
//取消事件注册
EventBus.getDefault().unregister(this);
在需要发送广播的地方发送
// 发送消息
EventBus.getDefault().post(new MessageEvent(message));
//message 为要发送的消息类容
在需要接受消息的地方接受消息 (这里的方法名可以自己改,但方法必须用 public 修饰, 否则不会接收到消息
@Subscribe
public void onEventMainThread(MessageEvent messageEvent) {
messageEvent.getMessage();
}
下边是一个具体的小示例
有 前一个界面 跳转到 另一个界面,在第二 个界面点击按键发送一条广播到第一个界面。
第一 activity
public class BusActivity extends AppCompatActivity implements View.OnClickListener{
Button breakBTN;
TextView textTV;
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bus);
breakBTN= (Button) findViewById(R.id.breakBTN);
textTV= (TextView) findViewById(R.id.textTV);
// 注册事件
EventBus.getDefault().register(this);
breakBTN.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.sendBTN :
Intent intent=new Intent(BusActivity.this,ReceiveActivity.class);
startActivity(intent);
break;
}
}
// 接收消息的方法, 注意注解必须加上 必须用 public 修饰
@Subscribe
public void onEventMainThread(MessageEvent messageEvent) {
textTV.setText("我是ReceiveActivity 发来的:" + messageEvent.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消事件注册
EventBus.getDefault().unregister(this);
}
}
第二activity
public class ReceiveActivity extends AppCompatActivity {
Button itentBTN;
EditText showTV;
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_receive);
itentBTN= (Button) findViewById(R.id.itentBTN);
showTV= (EditText) findViewById(R.id.showTV);
itentBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = showTV.getText().toString();
if(TextUtils.isEmpty(message)) {
message = "默认消息";
}
// 发送消息
EventBus.getDefault().post(new MessageEvent(message));
}
});
}
}
消息事件类
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Sticky事件的使用
之前说的使用方法, 都是需要先注册(register), 再post,才能接受到事件;
如果你使用postSticky发送事件, 那么可以不需要先注册, 也能接受到事件.
首先,你可能需要声明一个方法:
//注意,和之前的方法一样,只是多了一个 sticky = true 的属性.
@Subscribe(threadMode = ThreadMode.MainThread, sticky = true)
public void onEvent(MsgEvent event){
}
其次, 你可以在没有register的情况下:(发送事件)
EventBus.getDefault().postSticky(new MsgEvent("With Sticky"));
之后, 再注册,这样就可以收到刚刚发送的事件了:
EventBus.getDefault().register(this);//注册之后,马上就能收到刚刚postSticky发送的事件
参数说明:
1》threadMode 表示方法在什么线程执行 (Android更新UI只能在主线程, 所以如果需要操作UI, 需要设置ThreadMode.MainThread)
2》 sticky 表示是否是一个粘性事件 (如果你使用postSticky发送一 个事件,那么需要设置为true才能接受到事件)
3》 priority 优先级 (如果有多个对象同时订阅了相同的事件, 那么优先级越高,会优先被调用.)
@Subscribe(threadMode = ThreadMode.MainThread, sticky = true, priority = 100)
public void onEvent(MsgEvent event){
}
注:注释后面可以添加3个参数 threadMode stick priority
ThreadMode.MAIN,事件接收函数执行在UI线程;
ThreadMode.POST,事件在哪个线程发布,接收函数就执行在哪个线程;默认
ThreadMode.ASYNC,事件执行在一个独立的异步线程中。强制在后台执行
ThreadMode.BackgroundThread,如果事件是在UI线程中发布出来的,那么就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么直接在该子线程中执行。
//如果由于事件的发布者是在子线程中,所以BACKGROUND与POSTING模式下订阅者与事件的发布者运行在同一个线程。
//而ASYNC模式下又重新开起一个线程来执行任务。Main模式则是在主线程中运行
priority:默认值为0。订阅了同一个事件的订阅函数,在ThreadMode值相同的前提下,收到事件的优先级,值越大优先级越高。