Android EventBus發布/訂閱事件總線
做過Android開發都會陸續用到這個開源庫EventBus。EventBus是一款針對Android優化的發布/訂閱事件 總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點 是開銷小,代碼更優雅。以及將發送者和接收者解耦。下載EventBus的類庫源碼:https://github.com/greenrobot/EventBus。下面說說簡單用法。
本文項目資源下載:
一、先定義一個消息實體類MainSendEvent
package com.example.eventbusdemo;/**
- 事件消息實體類
@author mmxs / public class MainSendEvent { protected String mstrMsg;
public MainSendEvent(String msg) {
mstrMsg = msg;
}
public String getStringMsgData(){
return mstrMsg;
} }</pre>二、MainActivity
package com.example.eventbusdemo;
import de.greenrobot.event.EventBus; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.app.Activity; import android.content.Intent;
public class MainActivity extends Activity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//事件注冊
EventBus.getDefault().register(this);
InitUI();
}
private void InitUI() {
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setClass(MainActivity.this, TwoActivity.class);
startActivity(intent);
break;
default:
break;
}
}
//事件接受
public void onEventMainThread(MainSendEvent event){
if(event != null){
Toast.makeText(getApplicationContext(),
"MainActivity接受數據" + event.getStringMsgData(),
Toast.LENGTH_LONG).show();
TextView textView = (TextView)findViewById(R.id.textView1);
textView.setText(event.getStringMsgData());
}
}
@Override
public void onDestroy() {
//取消注冊
EventBus.getDefault().unregister(this);
super.onDestroy();
}
}</pre>三、TwoActivity
package com.example.eventbusdemo;import de.greenrobot.event.EventBus; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /**
- 第二個TwoActivity發送事件
- @author mmsx / public class TwoActivity extends Activity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
//事件發送
EventBus.getDefault().post(new MainSendEvent("from TwoActivity msg"));
break;
default:
break;
}
}
}</pre>四、兩個activity的布局
1、activity_main
<LinearLayout xmlns:android="<Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="第二個activity" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" />
</LinearLayout></pre>2、activity_two
<LinearLayout xmlns:android="<Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="MainActivity" />
</LinearLayout></pre>在這上面總體上實踐就是在activity間消息傳遞。我們先進去的是MainActivity。然后按button進入第二個 activity。在第二個activity按一下button發送數據到MainActivity,用Toat彈出以及settext。返回 MainActivity后能看到settext效果。
五、效果圖
![]()
六、簡單來說的流程
1、事件注冊或者訂閱
EventBus.getDefault().register(this);2、事件注冊或者訂閱后的接受public void onEventMainThread(MainSendEvent event){ if(event != null){ Toast.makeText(getApplicationContext(), "MainActivity接受數據" + event.getStringMsgData(), Toast.LENGTH_LONG).show(); TextView textView = (TextView)findViewById(R.id.textView1); textView.setText(event.getStringMsgData()); } }3、事件注冊或者訂閱取消
EventBus.getDefault().unregister(this);這上面3點是一起,同一個頁面。4、事件的發送者
EventBus.getDefault().post(new MainSendEvent("from TwoActivity msg"));七、參考文章