Android消息通信之无所不能的第三方开源项目EventBus

简介: Android消息通信之无所不能的第三方开源项目EventBus在Android开发中,消息通信在开发过程中是比较重要但比较略微繁琐的过程,比如,Activity与Fragment之间的消息通信,后台Servic...


Android消息通信之无所不能的第三方开源项目EventBus

在Android开发中,消息通信在开发过程中是比较重要但比较略微繁琐的过程,比如,Activity与Fragment之间的消息通信,后台Service与前台Activity的消息通信,Fragment与Fragment之间的消息通信等等情况,Android本身提供的有完善的广播、在Service中也有的Messenger、handler中处理message等等完备的解决方案,而第三方的开源库EventBus同样提供了几乎无所不能、易于理解和使用的Android消息事件解决方案。
EventBus是github上的一个第三方开发库,其在github上的项目主页地址:https://github.com/greenrobot/EventBus
EventBus的消息模型是消息发布者/订阅者机制。
使用EventBus之前需要到EventBus项目主页上将库项目(https://github.com/greenrobot/EventBus/tree/master/EventBus ,截止2015年10月26日更新时间,未来也许有变动)包拖下来,接着作为Eclipse的一个工程导入,然后作为Android的一个lib,在自己的项目中引用即可。
本文以一个简单的代码例子说明EventBus。附录参考文章2、3、4说明了如何实现前台Activity与后台Service之间的消息通信,本文则在附录参考文章4的基础上改造,使用EventBus实现后台Service往前台Activity发送消息进而实现通信。
先丢出本文代码:
首先要定义一个自己的Event类,这个类可以随意定义,里面包括自己想要在消息通信中传递的各种复杂数据结构,本文则简单些,MyEvent.java:

package zhangphil.service;

//被EventBus类的定义可以随意
//这里面可以传递更复杂、更重的数据结构
public class MyEvent {

	public int id;
	public String content;

	@Override
	public String toString() {
		return "id:" + id + " content:" + content;
	}
}



前台Activity:

package zhangphil.service;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import de.greenrobot.event.EventBus;

public class MainActivity extends Activity {

	private TextView text;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		text = (TextView) findViewById(R.id.textView);

		// 一般在onCreate方法里面注册EventBus
		EventBus.getDefault().register(this);

		startMyService();
	}

	// 这里,EventBus回调接受消息,然后更新Main UI的TextView
	public void onEventMainThread(MyEvent event) {
		Log.d(this.getClass().getName(), "onEventMainThread:" + event.toString());
		text.setText(event + "");
	}

	// EventBus回调接受消息
	public void onEventBackgroundThread(MyEvent event) {
		Log.d(this.getClass().getName(), "onEventBackgroundThread:" + event.toString());
	}

	// EventBus回调接受消息
	public void onEventAsync(MyEvent event) {
		Log.d(this.getClass().getName(), "onEventAsync:" + event.toString());
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();

		// 注销EventBus
		EventBus.getDefault().unregister(this);

		stopMyService();
	}

	private void startMyService() {
		Intent intent = new Intent(this, MyService.class);
		this.startService(intent);
	}

	private void stopMyService() {
		Intent intent = new Intent(this, MyService.class);
		this.stopService(intent);
	}
}



后台Service:

package zhangphil.service;

import android.app.IntentService;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import de.greenrobot.event.EventBus;

public class MyService extends IntentService {

	public MyService() {
		super("MyService");
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	protected void onHandleIntent(Intent intent) {
		for (int i = 0; i < 10; i++) {
			MyEvent event = new MyEvent();
			event.id = i;
			event.content = "数据" + i;

			// 可以随意在工程代码中的任意位置发送消息给订阅者
			EventBus.getDefault().post(event);
			Log.d(this.getClass().getName(), "发送消息:" + event.toString());

			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onDestroy() {
		Log.d(this.getClass().getName(), "onDestroy");
	}
}


说明:
(1)EventBus是消息发布者(发送消息)/订阅者(接收消息)模式。EventBus的消息发布十分灵活,可以在工程代码中的任意位置发送消息。在本例中,EventBus在Service的onHandleIntent循环发布10条消息。EventBus 发布消息只需要一行代码即可实现:
EventBus.getDefault().post(event);
Event即为自己定义的类的实例。


(2)EventBus在接收消息的Activity(或Fragment)中初始化。在本例中是一个Activity接收消息,
首先,在Activity里面注册EventBus,通常在Android的Activity(或者Fragment)的onCreate里面注册,仅需一行代码:
EventBus.getDefault().register(this);
类似于注册一个消息监听Listener,完了不要忘记注销EventBus,在onDestory里面
EventBus.getDefault().unregister(this);

(3)EventBus接收消息。
在Activity中根据代码实际情况写一个EventBus的消息接收函数:
public void onEventMainThread(MyEvent event);
然后,只要EventBus发送消息,就可以在这里接收到。


 
EventBus的消息回调接收消息函数还有几个:
onEventMainThread:Main线程,这个与Android UI线程密切相关,不要阻塞它!
onEventBackgroundThread:故名思议,后台线程中接收处理。
onEventAsync:异步线程中接收处理。


附录参考文章:
文章1:《Android Service简介(系列1)》链接地址:http://blog.csdn.net/zhangphil/article/details/49373939
文章2:《Android Activity与Service数据交互:Binder、bindService(系列2)》链接地址:http://blog.csdn.net/zhangphil/article/details/49385005
文章3:《Android Service之串行化Service:IntentService(系列3)》链接地址:http://blog.csdn.net/zhangphil/article/details/49387139
文章4:《Android Service进程间双向通信之Messenger(系列4)》http://blog.csdn.net/zhangphil/article/details/49402869
文章5:《Android进程间通信(IPC)的AIDL机制:Hello World示例 》链接地址:http://blog.csdn.net/zhangphil/article/details/43876657

相关文章
|
1月前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
48 1
|
1月前
|
Android开发
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)
180 0
|
8月前
|
API 开发工具 Android开发
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
178 0
|
1月前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
20 4
|
1月前
|
机器学习/深度学习 Java Shell
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
142 0
|
1月前
|
Java 物联网 Linux
Android硬件通信之 串口通信
Android硬件通信之 串口通信
16 0
|
1月前
|
Java Android开发
Android Studio的使用导入第三方Jar包
Android Studio的使用导入第三方Jar包
18 1
|
1月前
|
安全 Java Android开发
Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)
Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)
91 0
|
8月前
|
数据安全/隐私保护 Android开发 iOS开发
解决第三方邮箱APP登陆QQ、163邮箱无法验证账户名或密码的问题(IOS、MacOS、Windows、Android)
解决第三方邮箱APP登陆QQ、163邮箱无法验证账户名或密码的问题(IOS、MacOS、Windows、Android)
137 0
|
8月前
|
设计模式 网络协议 Java
《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式
《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式
77 0