Android消息转发中心(比EventBus更轻量)
一、简单介绍:三个类
EventBus:事件总线,很多人都用过。它可以让我们从Activity跳转到Activity,也可以从其他类跳转到Activity。
EventBus我自己也弄了一个类似事件总线的工具,不过我称之为消息转发。对比于EventBus,iOS中有个NSNotification与它类似,当然它的功能比NSNotification更加强大。因为个人比较喜欢iOS的代码风格,所以自己封装了一个高仿的Android Notification。
Notification 文件目录Notification由三部分组成:TCNotification、TCNotificationCenter、TCThreadMode。
TCNotificationCenter:消息转发中心,负责处理消息的一切事务,包括注册消息、传递消息和移除消息。
TCNotification:消息对象,包含了传递的对象,传递的方法名,还有消息名称。
TCThreadMode:消息返回模式,定义了采用主同步线程返回的方式还是异步线程返回的方式。
二、使用方式:三步走
1、注册通知,在oncreate中注册:
TCNotificationCenter.defaultCenter().addObserver(this, "printSelf", "MainActivity");
参数this是当前对象,printSelf是当前对象的一个方法名,这个方法叫做printSelf,MainActivity是这个消息的消息名。我们先看下这个方法的实现(注意参数是Map):
@TCThreadMode()
public void printSelf (Map<String, String> param) {
Log.d("dddd", "Main2Activity printSelf 这个方法被调用了!");
}
2、然后,我们在别的类,或者当前类中,调用消息传递:
Map<String, Object> map = new HashMap<String, Object>();
map.put("1","2");
TCNotificationCenter.defaultCenter().postNotificationName("MainActivity", map);
通过在这里post消息,就会执行刚才的 printSelf 方法。
3、最后,我们还需要移除消息:
@Override
protected void onDestroy() {
super.onDestroy();
TCNotificationCenter.defaultCenter().removeObserver(this);
Log.d("dddd", "Main2Activity onDestroy 这个方法被调用了!");
}
使用removeObserver可以移除所有的消息。
三、内部实现:
首先看这个注册:
public void addObserver(Object object, String methodName, String name)
含有3个参数:object、methodName、name。
在iOS中,消息转发的对象可以是任何对象。不过,这在Android中却不尽相同,由于Android内存的特殊性,只能在Activity或者Fregment中使用,所以在注册消息的时候,使用了:
if (!((object instanceof Fragment) || (object instanceof Activity))) {
Log.d("dddd", "消息转发对象不是Activity或者Fragment,造成崩溃");
Log.d("dddd", "addObserver: " + 1/0);
}
可以知道消息转发对象不是Activity或者Fragment,就会造成崩溃。
然后我们使用TCNotification这个对象来存储三个参数。
TCNotification notification = new TCNotification();
notification.setObject(object);
notification.setMethodName(methodName);
notification.setName(name);
将这个对象加入到对象列表中:
if (!notificationList.contains(notification)) {
notificationList.add(notification);
}
至此就完成了对象的注册过程,其他实现就不具体展开了,有兴趣可以去Github看看。
总结:
不得不说EventBus具有强大的功能,但是我们平时几乎是很少用多少功能。如果你喜欢轻量级,并且是自己实现的类,那么你可以试试TCNotification。
-------------------------------我是分割线-------------------------------