EventBus事件总线分发库

谁说胖子不能爱 提交于 2019-12-09 17:13:21
本文围绕以下六个部分展开:  

一、事件总线管理  
二、EventBus  
三、EventBus与BroadcastReceiver的区别  
案例一  
案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据  
案例三:Activity和Service之间互相发布与接收事件  






一、事件总线管理  

         将事件放入队列里,用于管理和分发。  

         (1)保证应用的各个部分之间高效的通信及数据、事件分发。  

         (2)模块间解耦:通过事件的分发,可以让各个模块间关联程序变小。  

         当在开发一些庞大的的项目时,模块比较多,这个时候为了避免耦合度和保证 APP 的效率,会用到 EventBus 等类似的事件总线处理模型。这样可以简化一些数据传输操作,保证APP的简洁,做到高内聚、低耦合。  


二、EventBus  

         1. 概念  

         EventBus是一个发布/订阅的事件总线。它可以让两个组件相互通信,但是它们之间并不相互知晓。  

         EventBus模式,也被称为 Message Bus模式,或者 发布者/订阅者(publisher/subscriber)模式。  

         事件响应有更多的线程选择,EventBus 可以向不同的线程中发布事件。  

         EventBus 支持 Sticky Event。  

         2. 有3个主要的元素:  

         (1)Event:事件。  

         Event可以是任意类型的对象。  

         (2)Subscriber:事件订阅者,接收特定的事件。  

         在EventBus中,使用约定来指定事件订阅者以简化使用。即,所有事件订阅都是以onEvent开头的函数。具体来说,函数的名字是onEventMainThread,onEventPostThread,onEventBackgroundThread,onEventAsync这四个,onEvent是默认的接收数据处理的方法。这四个事件订阅函数,每个都与一个“ThreadMode”相关联,ThreadMode指定了会调用的函数。有以下4个ThreadMode:  

         1)PostThread:事件的处理和事件的发送在相同的进程。  

         事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。对应的函数名是onEvent。  

         2)MainThread:事件的处理会在UI线程中执行。  

         事件处理时间不应太长,长了会ANR的。对应的函数名是onEventMainThread。  

         3)BackgroundThread:事件的处理会在一个后台线程中执行。  

         虽然事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接执行事件。如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。对应的函数名是onEventBackgroundThread。  

         4)AsyncThread:事件处理会在单独的线程中执行。  

         主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。  

         根据事件订阅的函数名称的不同,会使用不同的ThreadMode。比如在后台线程加载了数据想在UI线程显示,订阅者只需把函数命名为onEventMainThread。  

         3. 基本用法  

         分 注册订阅发布取消注册 等步骤。使用时需先注册、订阅,然后向订阅者发布消息数据即可。  

         (1)注册(3个构造方法):  

         EventBus.getDefault().register(this);  

         EventBus.getDefault().register(new MyClass());  

         // 注册三个参数分别是:消息订阅者(接收者),接收方法名,事件类。          EventBus.getDefault().register(this,"setTextA",SetTextAEvent.class);  

         (2)注销注册:  

         EventBus.getDefault().unregister(this);  

         EventBus.getDefault().unregister(new MyClass());  

         (3)定义事件类型:  

         public class MyEvent {}  

         (4)订阅处理数据:  

         public void onEvent(AnyEventType event){}:默认的接收数据处理的方法  

         public void onEventMainThread{}  

         onEventPostThread  

         onEventBackgroundThread  

         onEventAsync  

         (5)发布:  

         EventBus.getDefault().postSticky(new SecondActivityEvent("Message from SecondActivity"));  

         EventBus.getDefault().post(new ChangeImgEvent(1));  


三、EventBus与BroadcastReceiver的区别  

         1. 二者类似。  

         在Android中广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。  

         广播:在一个地方注册广播,在另一个地方针对action发送广播、传递数据,对应注册的地方就可以收到广播。  

         EventBus:基于订阅/发布的模式。在需要接收数据的地方,进行注册与订阅,在需要发布数据的地方发布,则在注册的地方就可以收到了。  

         简单点说,就是两人约定好怎么通信,一人发布消息,另外一个约定好的人立马接收到你发的消息。EventBus就可以帮助减少做很多事,不管你在任何地方任何位置发布一个事件,接收者都能立马接收到你的消息,不用你考虑android子线程操作UI线程的问题。  

         2. 二者区别。  

         (1)EventBus 有三个主要的元素:事件、订阅和发布。广播两个元素:订阅和发布,但是广播是针对整个App而言的。  

         (2)BroadcastReceiver是组件,需要在功能清单中注册。而EventBus 不需要注册。  

         (3)BroadcastReceiver只能做一件事情,而EventBus多事件处理比较好。  

         (4)在不同场景中的适用性:  

             1)同一App内部的同一组件内的消息通信(单个或多个线程之间),实际应用中肯定是不会用到广播机制的(虽然可以用),无论是使用扩展变量作用域、基于接口的回调还是Handler-post/Handler-Message等方式,都可以直接处理此类问题,若使用广播机制,显然有些“杀鸡牛刀”的感觉。  

             2)同一app内部的不同组件之间的消息通信(单个进程),对于此类需求,在有些教复杂的情况下单纯的依靠基于接口的回调等方式不好处理,此时可以直接使用EventBus等,相对而言,EventBus由于是针对同一进程,用于处理此类需求非常适合,且轻松。  

             3)其他情形,由于涉及不同进程间的消息通信,此时根据实际业务使用广播机制会显得非常适宜。  


案例一  

         MainActivity  

Java代码   收藏代码
  1. public class MainActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.   
  8.         // 1. 注册  
  9.         EventBus.getDefault().register(this);  
  10.     }  
  11.   
  12.     /** 
  13.      * 3. 发送数据消息事件 
  14.      */  
  15.     private void postData() {  
  16.         String string = "我是消息";  
  17.         EventBus.getDefault().post(string);  
  18.     }  
  19.   
  20.     /** 
  21.      * 2. 接收数据消息事件 
  22.      */  
  23.     public void onEvent(String string) {  
  24.   
  25.     }  
  26.   
  27.     public void onEventMainThread(String string) {  
  28.   
  29.     }  
  30.   
  31.     public void onEventPostThread(String string) {  
  32.   
  33.     }  
  34.   
  35.     public void onEventBackgroundThread(String string) {  
  36.   
  37.     }  
  38.   
  39.     public void onEventAsync(String string) {  
  40.   
  41.     }  
  42.   
  43.   
  44.     @Override  
  45.     protected void onDestroy() {  
  46.         super.onDestroy();  
  47.         // 4. 取消注册  
  48.         EventBus.getDefault().unregister(this);  
  49.     }  
  50.       
  51. }  



案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据  


         1. activity_main.xml。写一个按钮和一个文本框。  

Xml代码   收藏代码
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity">  
  10.   
  11.     <Button  
  12.         android:id="@+id/btnSend"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="发送事件"/>  
  16.   
  17.     <TextView  
  18.         android:id="@+id/tvContent"  
  19.         android:layout_width="match_parent"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_below="@id/btnSend"  
  22.         android:gravity="center"  
  23.         android:textSize="20sp"/>  
  24.   
  25. </RelativeLayout>  


         2. MainActivity。声明和初始化两个控件。  

Java代码   收藏代码
  1. private TextView tvContent;  
  2. private Button btnSend;  


Java代码   收藏代码
  1. tvContent = (TextView) findViewById(R.id.tvContent);  
  2. btnSend = (Button) findViewById(R.id.btnSend);  



         3. MainActivity。onCreate()方法中注册。  

Java代码   收藏代码
  1. EventBus.getDefault().register(this);  


         4. MainActivity。onDestroy()方法中取消注册。  

Java代码   收藏代码
  1. @Override  
  2. protected void onDestroy() {  
  3.     super.onDestroy();  
  4.     EventBus.getDefault().unregister(this);  
  5. }  


         5. MainActivity。通过事件监听器设置按钮的点击事件。  

Java代码   收藏代码
  1. btnSend.setOnClickListener(new View.OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View v) {  
  4.   
  5.     }  
  6. });  


         6. 创建自定义的事件类:MyEvent。  

Java代码   收藏代码
  1. package com.android.eventbustwo;  
  2.   
  3. /** 
  4.  * 自定义的事件类 
  5.  */  
  6. public class MyEvent {  
  7.     private String type;  
  8.     private String content;  
  9.   
  10.     public String getType() {  
  11.         return type;  
  12.     }  
  13.   
  14.     public void setType(String type) {  
  15.         this.type = type;  
  16.     }  
  17.   
  18.     public String getContent() {  
  19.         return content;  
  20.     }  
  21.   
  22.     public void setContent(String content) {  
  23.         this.content = content;  
  24.     }  
  25. }  


         7. MainActivity。在按钮点击事件中,创建自定义事件类MyEvent的实例事件,并当点击按钮的时候,发送事件。  

Java代码   收藏代码
  1. btnSend.setOnClickListener(new View.OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View v) {  
  4.         MyEvent event = new MyEvent();  
  5.         event.setType("0");  
  6.         event.setContent("0内容");  
  7.         // 发送数据事件  
  8.         EventBus.getDefault().post(event);  
  9.     }  
  10. });  




         8. MainActivity。通过onEvent()订阅(接收)事件。  

Java代码   收藏代码
  1. public void onEvent(MyEvent event){  
  2.     if(event.getType().equals("0")){  
  3.         tvContent.setText(event.getContent());  
  4.     }  
  5. }  


         运行效果如下:  



         9. MainActivity。在按钮点击事件中,将事件类型和内容改变,并当点击按钮的时候,发送事件。  

Java代码   收藏代码
  1. btnSend.setOnClickListener(new View.OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View v) {  
  4.         MyEvent event = new MyEvent();  
  5.         event.setType("1");  
  6.         event.setContent("1内容");  
  7.         // 发送数据事件  
  8.         EventBus.getDefault().post(event);  
  9.     }  
  10. });  


         10. MainActivity。通过onEventMainThread()同样可以订阅(接收)事件。  

Java代码   收藏代码
  1. public void onEventMainThread(MyEvent event){  
  2.     if(event.getType().equals("1")){  
  3.         tvContent.setText(event.getContent());  
  4.     }  
  5. }  


         运行效果如下:  




         代码补充:  

         1. activity_main.xml  

         2. MainActivity  

Java代码   收藏代码
  1. package com.android.eventbustwo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.Menu;  
  6. import android.view.MenuItem;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. import de.greenrobot.event.EventBus;  
  12.   
  13. public class MainActivity extends Activity {  
  14.     // 2.  
  15.     private TextView tvContent;  
  16.     private Button btnSend;  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.         // 3.  
  23.         tvContent = (TextView) findViewById(R.id.tvContent);  
  24.         btnSend = (Button) findViewById(R.id.btnSend);  
  25.         // 6.  
  26.         btnSend.setOnClickListener(new View.OnClickListener() {  
  27.             @Override  
  28.             public void onClick(View v) {  
  29.                 // 8.  
  30.                 MyEvent event = new MyEvent();  
  31.                 event.setType("0");  
  32.                 event.setContent("0内容");  
  33.                 // 发送数据事件  
  34.                 EventBus.getDefault().post(event);  
  35.             }  
  36.         });  
  37.         // 4.  
  38.         EventBus.getDefault().register(this);  
  39.     }  
  40.   
  41.     /** 
  42.      * 9. 
  43.      * @param event 
  44.      */  
  45.     public void onEvent(MyEvent event){  
  46.         if(event.getType().equals("0")){  
  47.             tvContent.setText(event.getContent());  
  48.         }  
  49.     }  
  50.   
  51.     /** 
  52.      * 10. 
  53.      * @param event 
  54.      */  
  55.     public void onEventMainThread(MyEvent event){  
  56.         if(event.getType().equals("1")){  
  57.             tvContent.setText(event.getContent());  
  58.         }  
  59.     }  
  60.   
  61.     /** 
  62.      * 5. 
  63.      */  
  64.     @Override  
  65.     protected void onDestroy() {  
  66.         super.onDestroy();  
  67.         EventBus.getDefault().unregister(this);  
  68.     }  
  69.   
  70.     // -----------------------------------------------------------  
  71.     @Override  
  72.     public boolean onCreateOptionsMenu(Menu menu) {  
  73.         // Inflate the menu; this adds items to the action bar if it is present.  
  74.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  75.         return true;  
  76.     }  
  77.   
  78.     @Override  
  79.     public boolean onOptionsItemSelected(MenuItem item) {  
  80.         // Handle action bar item clicks here. The action bar will  
  81.         // automatically handle clicks on the Home/Up button, so long  
  82.         // as you specify a parent activity in AndroidManifest.xml.  
  83.         int id = item.getItemId();  
  84.   
  85.         //noinspection SimplifiableIfStatement  
  86.         if (id == R.id.action_settings) {  
  87.             return true;  
  88.         }  
  89.   
  90.         return super.onOptionsItemSelected(item);  
  91.     }  
  92. }  


         3. MyEvent  

Java代码   收藏代码
  1. package com.android.eventbustwo;  
  2.   
  3. /** 
  4.  * 7. 自定义的事件类 
  5.  */  
  6. public class MyEvent {  
  7.     private String type;  
  8.     private String content;  
  9.   
  10.     public String getType() {  
  11.         return type;  
  12.     }  
  13.   
  14.     public void setType(String type) {  
  15.         this.type = type;  
  16.     }  
  17.   
  18.     public String getContent() {  
  19.         return content;  
  20.     }  
  21.   
  22.     public void setContent(String content) {  
  23.         this.content = content;  
  24.     }  
  25. }  



案例三:Activity和Service之间互相发布与接收事件  

         主活动有4家公司名显示,当在文本框中输入“Amazon”,点击按钮后,将新的公司名显示在主活动界面上。  







         1. 创建一个Service: EventService。  

         2. EventService。将onBind中的异常去掉,改为 返回null。  

Java代码   收藏代码
  1. @Override  
  2. public IBinder onBind(Intent intent) {  
  3.     return null;  
  4. }  


         3. activity_main.xml。一个显示的文本框,用于显示Service发布的事件;一个可编辑文本框,用于输入字符串,并发布事件到Service;一个按钮,通过点击按钮,发布事件,然后Service进行订阅。  



Xml代码   收藏代码
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity">  
  10.   
  11.     <TextView  
  12.         android:id="@+id/tvCompany"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="@string/hello_world" />  
  16.   
  17.     <EditText  
  18.         android:id="@+id/txtCompany"  
  19.         android:layout_width="match_parent"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_below="@id/tvCompany"  
  22.         android:hint="@string/txt_company" />  
  23.   
  24.     <Button  
  25.         android:id="@+id/btnCompany"  
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:layout_below="@id/txtCompany"  
  29.         android:text="@string/btn_send_company" />  
  30.   
  31. </RelativeLayout>  


         4. EventService。重写onCreate()、onStartCommand()、onDestroy()方法。  

         5. EventService。声明一个 List 集合,用于放公司名的集合,并在onCreate()方法中创建实例(ArrayList类型)。  

Java代码   收藏代码
  1. private List<String> list;  


Java代码   收藏代码
  1. list = new ArrayList<>();  


         6. EventService。在onStartCommand()方法中,往List集合中添加元素(公司名)。销毁(onDestroy())的时候,集合设为null。  

Java代码   收藏代码
  1. list.add("Google");  
  2. list.add("Facebook");  
  3. list.add("Twitter");  
  4. list.add("Apple");  


Java代码   收藏代码
  1. list = null;  


         8. EventService。onCreate()中注册EventBus,onDestroy()销毁时注销注册。  

Java代码   收藏代码
  1. EventBus.getDefault().register(this);  


Java代码   收藏代码
  1. EventBus.getDefault().unregister(this);  


         9. MainActivity。onCreate()中同样注册EventBus,onDestroy()销毁时同样注销注册。  

         10. 新建一个目录:event,用来放事件类。  

         11. 在event目录下,新建一个用于从 Service 发布集合数据(公司名的集合)集合事件类:ListEvent。  

Java代码   收藏代码
  1. public class ListEvent {  
  2.     // 集合  
  3.     private List<String> list;  
  4.   
  5.     // 含参构造方法  
  6.     public ListEvent(List<String> list) {  
  7.         this.list = list;  
  8.     }  
  9.   
  10.     // getter方法(只需getter方法)  
  11.     public List<String> getList() {  
  12.         return list;  
  13.     }  
  14. }  


         12. 在event目录下,新建一个用于从 Activity 发布字符串(公司名)的集合事件类:CompanyEvent。  

Java代码   收藏代码
  1. public class CompanyEvent {  
  2.     // 字符串 company  
  3.     private String company;  
  4.   
  5.     // 含参构造方法  
  6.     public CompanyEvent(String company) {  
  7.         this.company = company;  
  8.     }  
  9.   
  10.     // getter方法(只需getter方法)  
  11.     public String getCompany() {  
  12.         return company;  
  13.     }  
  14. }  


         13. MainActivity。在按钮点击事件中,发布事件。  

Java代码   收藏代码
  1. @OnClick(R.id.btnCompany)  
  2. public void btnCompanyClick() {  
  3.     // 获得 在 txtCompany 文本框中输入的 company 字符串 的值  
  4.     String company = txtCompany.getText().toString();  
  5.     // Activity 发布事件 --- 将 在 txtCompany 文本框中输入的 company 字符串,  
  6.     //                          使用 CompanyEvent 发布过去  
  7.     EventBus.getDefault().post(new CompanyEvent(company));  
  8.     // 发布之后,将 文本框内容清空  
  9.     txtCompany.setText("");  
  10. }  


         14. EventService。Service订阅事件,将Activity发布的公司名加入List集合中。然后,再将最新的公司名List集合发布出去。  

Java代码   收藏代码
  1. /** 
  2.  * Service 订阅事件 
  3.  * @param event 
  4.  */  
  5. public void onEvent(CompanyEvent event){  
  6.     // 将 事件中传过来的、在 txtCompany 文本框中输入的 company 字符串,放入 list集合中  
  7.     list.add(event.getCompany());  
  8.     // 再将 list集合,发布给 Activity,  
  9.     // 这样,Activity订阅后,就可以在 控制台和界面上 显示最新的 list集合的值  
  10.     EventBus.getDefault().postSticky(new ListEvent(list));  
  11. }  


         15. MainActivity。Activity 订阅了ListEvent事件,所以接收到了Service发布的公司名List集合的值,然后将其显示在控制台和界面的文本上。  

Java代码   收藏代码
  1. /** 
  2.  * Activity 订阅事件 
  3.  * 
  4.  * @param event 
  5.  */  
  6. public void onEvent(ListEvent event) {  
  7.     // 从Service发布的事件中获得 参数值(list集合)  
  8.     List<String> list = event.getList();  
  9.     // 日志输出 list集合的值 (控制台显示 list集合的值)  
  10.     Log.v(TAG, list.toString());  
  11.     // 将 list集合的值 显示在 tvCompany 文本中。(界面的文本上 显示 list集合的值)  
  12.     tvCompany.setText(list.toString());  
  13. }  



         代码目录结构:  



         补充代码:  

         (1)EventService。  

Java代码   收藏代码
  1. package com.android.eventbusservice;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7.   
  8. import com.android.eventbusservice.event.CompanyEvent;  
  9. import com.android.eventbusservice.event.ListEvent;  
  10.   
  11. import java.util.ArrayList;  
  12. import java.util.List;  
  13.   
  14. import de.greenrobot.event.EventBus;  
  15.   
  16. public class EventService extends Service {  
  17.     private static final String TAG = "MainActivity";  
  18.     // 声明一个 List 集合 -- 用于放公司名的集合  
  19.     private List<String> list;  
  20.   
  21.     public EventService() {  
  22.     }  
  23.   
  24.   
  25.     @Override  
  26.     public void onCreate() {  
  27.         super.onCreate();  
  28.         Log.v(TAG,"Service.onCreate");  
  29.         // 当前组件注册事件  
  30.         // (注册事件后,一定要有 onEvent() 方法,否则报错)  
  31.         EventBus.getDefault().register(this);  
  32.         // 创建实例 - ArrayList类型  
  33.         list = new ArrayList<>();  
  34.     }  
  35.   
  36.     /** 
  37.      * 此方法系统自动调用,不写也可。可把里面的代码写入 onCreate()里面。 
  38.      */  
  39.     @Override  
  40.     public int onStartCommand(Intent intent, int flags, int startId) {  
  41.         Log.v(TAG,"Service.onStartCommand");  
  42.         // 往集合中添加元素  
  43.         list.add("Google");  
  44.         list.add("Facebook");  
  45.         list.add("Twitter");  
  46.         list.add("Apple");  
  47.   
  48.         // Service 发布事件 -- 将 list 集合,使用 ListEvent 发送过去  
  49.         //                (ListEvent:用于从 Service 传事件到 Activity)  
  50.         EventBus.getDefault().postSticky(new ListEvent(list));  
  51.         // 改为:返回 START_STICKY  
  52.         return START_STICKY;  
  53.     }  
  54.   
  55.     @Override  
  56.     public void onDestroy() {  
  57.         super.onDestroy();  
  58.         Log.v(TAG, "Service.onDestroy");  
  59.         // 销毁的时候,取消事件  
  60.         EventBus.getDefault().unregister(this);  
  61.         // 销毁的时候,集合设为空  
  62.         list = null;  
  63.     }  
  64.   
  65.     /** 
  66.      * Service 订阅事件 
  67.      * @param event 
  68.      */  
  69.     public void onEvent(CompanyEvent event){  
  70.         // 将 事件中传过来的、在 txtCompany 文本框中输入的 company 字符串,放入 list集合中  
  71.         list.add(event.getCompany());  
  72.         // 再将 list集合,发布给 Activity,  
  73.         // 这样,Activity订阅后,就可以在 控制台和界面上 显示最新的 list集合的值  
  74.         EventBus.getDefault().postSticky(new ListEvent(list));  
  75.     }  
  76.   
  77.     @Override  
  78.     public IBinder onBind(Intent intent) {  
  79.         return null;  
  80.     }  
  81. }  


         (2)MainActivity。  

Java代码   收藏代码
  1. package com.android.eventbusservice;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.Menu;  
  8. import android.view.MenuItem;  
  9. import android.widget.EditText;  
  10. import android.widget.TextView;  
  11.   
  12. import com.android.eventbusservice.event.CompanyEvent;  
  13. import com.android.eventbusservice.event.ListEvent;  
  14.   
  15. import java.util.List;  
  16.   
  17. import butterknife.ButterKnife;  
  18. import butterknife.InjectView;  
  19. import butterknife.OnClick;  
  20. import de.greenrobot.event.EventBus;  
  21.   
  22. public class MainActivity extends Activity {  
  23.     private static final String TAG = "MainActivity";  
  24.   
  25.     @InjectView(R.id.tvCompany)  
  26.     TextView tvCompany;  
  27.     @InjectView(R.id.txtCompany)  
  28.     EditText txtCompany;  
  29.   
  30.   
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.activity_main);  
  35.   
  36.         ButterKnife.inject(this);  
  37.   
  38.         // 在 Activity 中同样注册事件  
  39.         EventBus.getDefault().register(this);  
  40.   
  41.         // 启动服务 -- 使用 startService 方式启动  
  42.         // 启动服务后,activity与service脱钩了。  
  43.         // 但是可以通过黄油刀进行联系。  
  44.         startService(new Intent(this, EventService.class));  
  45.     }  
  46.       
  47.     @Override  
  48.     protected void onDestroy() {  
  49.         super.onDestroy();  
  50.         // 在 Activity 中同样注销事件  
  51.         EventBus.getDefault().unregister(this);  
  52.     }  
  53.   
  54.     @OnClick(R.id.btnCompany)  
  55.     public void btnCompanyClick() {  
  56.         // 获得 在 txtCompany 文本框中输入的 company 字符串 的值  
  57.         String company = txtCompany.getText().toString();  
  58.         // Activity 发布事件 --- 将 在 txtCompany 文本框中输入的 company 字符串,  
  59.         //                          使用 CompanyEvent 发布过去  
  60.         EventBus.getDefault().post(new CompanyEvent(company));  
  61.         // 发布之后,将 文本框内容清空  
  62.         txtCompany.setText("");  
  63.     }  
  64.   
  65.     /** 
  66.      * Activity 订阅事件 
  67.      * 
  68.      * @param event 
  69.      */  
  70.     public void onEvent(ListEvent event) {  
  71.         // 从Service发布的事件中获得 参数值(list集合)  
  72.         List<String> list = event.getList();  
  73.         // 日志输出 list集合的值 (控制台显示 list集合的值)  
  74.         Log.v(TAG, list.toString());  
  75.         // 将 list集合的值 显示在 tvCompany 文本中。(界面的文本上 显示 list集合的值)  
  76.         tvCompany.setText(list.toString());  
  77.     }  
  78.   
  79.     // ---------------------------------------------------------  
  80.     @Override  
  81.     public boolean onCreateOptionsMenu(Menu menu) {  
  82.         // Inflate the menu; this adds items to the action bar if it is present.  
  83.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  84.         return true;  
  85.     }  
  86.   
  87.     @Override  
  88.     public boolean onOptionsItemSelected(MenuItem item) {  
  89.         // Handle action bar item clicks here. The action bar will  
  90.         // automatically handle clicks on the Home/Up button, so long  
  91.         // as you specify a parent activity in AndroidManifest.xml.  
  92.         int id = item.getItemId();  
  93.   
  94.         //noinspection SimplifiableIfStatement  
  95.         if (id == R.id.action_settings) {  
  96.             return true;  
  97.         }  
  98.   
  99.         return super.onOptionsItemSelected(item);  
  100.     }  
  101. }  



整理时重点参考:http://www.jikexueyuan.com/course/933.html  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!