前言:前几天给一个朋友聊天,“最近android开发都用EventBus了”,我当时问了句EventBus是什么?说笑到我们都落伍了。由于最近公司项目近尾声,元旦后要开始苦逼的魔都之旅,现在空闲时间还是比较多的,就研究下这个框架吧。在Github下载到源码,以及附带的demo还是不适合入门的,网络上大多都是框架设计的架构以及大致的用法。在自己的摸索下先写个入门的笔记吧。
一、 源码下载
该项目依然是托管在gitHub上,首先把源码下载下来。
项目地址
二、示例介绍
这里要实现的demo为简单的加法计算器,第一个Activity中有一个TextView和一个Button,
TextView用于记录第二个Activity计算的结果,第二个Activity有两个EditText和一个Button,EditText用于输入需要计算的数字,点击按钮后将计算的结果通过EventBus返回给第一个Activity并显示在TextView中。效果图如下:
三、实现过程
1. 架子搭建
先把界面以及点击第一个Activity的按钮跳转到第二个Activity,以及两个数的加法实现。
第一个Activity的布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:textSize="22sp"
android:id="@+id/main_act_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:hint="用于显示第二个activity计算的结果" />
<Button
android:id="@+id/main_act_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:text="开启第二个Activity" />
</RelativeLayout>
可以看到非常简单,只有一个TextView以及一个Button;
然后是MianActivity中的代码:
public class MainActivity extends Activity implements OnClickListener{
/** 上方文字 */
private TextView tv = null;
/** 开启第二个actvity的按钮 */
private Button btn = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidget(); // 初始化控件
initOnClickListener(); // 初始化点击事件
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.main_act_btn) {
this.startActivity(new Intent(getApplicationContext(), CalcActivity.class));
}
}
/** 初始化控件 */
private void initWidget() {
tv = (TextView)this.findViewById(R.id.main_act_tv);
btn = (Button)this.findViewById(R.id.main_act_btn);
}
/** 初始化点击事件 */
private void initOnClickListener() {
if(btn != null) {
btn.setOnClickListener(this);
}
}
}
可以看到有初始化控件以及绑定按钮的点击监听事件,以及在监听事件中打开第二个Activity。
第二个Activity的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="horizontal" >
<EditText
android:id="@+id/calc_act_et1"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:hint="第一个数" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+" />
<EditText
android:id="@+id/calc_act_et2"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:hint="第一个数" />
<Button
android:id="@+id/calc_act_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="计算结果" />
</LinearLayout>
</RelativeLayout>
同样也是灰常简单,两个输入框一个按钮。
在第二个Activity中,点击“计算结果”按钮的时候取出两个输入框的值进行相加。
public class CalcActivity extends Activity implements View.OnClickListener{
/** 第一个输入数字 */
private EditText et1 = null;
/** 第二个输入数字 */
private EditText et2 = null;
/** 计算按钮 */
private Button btn = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calc);
initWidget(); // 初始化控件
initOnClickListener(); // 初始化点击事件
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.calc_act_btn) { // 点击后的操作
int result = calculate();
}
}
/** 相加计算 */
private int calculate() {
return Integer.parseInt(et1.getText().toString().trim()) +
Integer.parseInt(et2.getText().toString().trim());
}
/** 初始化控件 */
private void initWidget() {
et1 = (EditText)this.findViewById(R.id.calc_act_et1);
et2 = (EditText)this.findViewById(R.id.calc_act_et2);
btn = (Button)this.findViewById(R.id.calc_act_btn);
}
/** 初始化点击事件 */
private void initOnClickListener() {
btn.setOnClickListener(this);
}
}
到目前为止实现的效果为:
2. 填入EventBus通信
第一、在第一个Activity的onCreat()中注册EventBus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidget(); // 初始化控件
initOnClickListener(); // 初始化点击事件
EventBus.getDefault().register(this); // 注册EventBus
}
在onDistory()中解除EventBus的注册:
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this); // 解除EventBus注册
}
第二、写一个AddEvent,在构造函数中给成员变量赋值,并且还有一个方法可以获取该成员变量的值。
public class AddEvent {
private int result;
public AddEvent(int result) {
this.result = result;
}
public int getResult() {
return result;
}
}
第三、在第二个Activity计算完成后发送消息;
@Override
public void onClick(View v) {
if (v.getId() == R.id.calc_act_btn) { // 点击后的操作
int result = calculate();
EventBus.getDefault().post(new AddEvent(result));
}
}
第四、在第一个Activity中接收消息并显示到界面
public void onEventMainThread(AddEvent event) {
int result = event.getResult();
tv.setText("计算结果为:" + result);
}
至此,一个最简单的EventBus的应用实例就结束了,是不是比startActivityForResult的方式更清爽呢?