Android常用的组件间通信方式
2016-07-26 11:34
465 查看
1.startActivityForResult
适用于两个Activity之间一对一的交互。
2.LocalBroadcastManager
使用条件:只要有Context即可。优点:发送方的Context可以是非UI组件的,而EventBus就不可以。适用场景是:后台收到服务端的推送消息后,多个相关页面要刷新页面或显示未读小红点。
使用方法:
2.1发送方:
2.2接收方:
与普通的广播接收方式一样,需要在页面创建时注册侦听、页面销毁时取消注册侦听。
适用于页面之间的信息传递和同步。适用级别是Activity、Fragment。首先定义一个用于传递的数据类型,比如EventAction,类似于Intent。
其中,EventType可以是int类型的Interface,也可以是enum类型的;类似于Intent中的Action;
3.1发送方:
3.2接收方:
每个接收方都需要先调用注册接口进行订阅:
然后根据需要实现如下四个方法中的任何一个或几个,一般情况下收到消息后都是用来刷新页面,所以常见的使用方式是只实现onEventMainhread方法。
类似于EventBus。它是RxJava的一个附属功能;如果项目中已经引入了RxJava包,则使用RxBus就再适合不过了。
5.otto
OTTO是Square推出的库,原理与EventBus相同,实现方式也非常类似。不同的是接收方的回调方法不是固定的那四个,而是通过@Subscribe注解标志来识别接收方的回调方法的。
适用于两个Activity之间一对一的交互。
2.LocalBroadcastManager
使用条件:只要有Context即可。优点:发送方的Context可以是非UI组件的,而EventBus就不可以。适用场景是:后台收到服务端的推送消息后,多个相关页面要刷新页面或显示未读小红点。
使用方法:
2.1发送方:
Intent intent = new Intent(ACTION_XXX); intent.putExtra(KEY_XXX, DATA_XXX); LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
2.2接收方:
与普通的广播接收方式一样,需要在页面创建时注册侦听、页面销毁时取消注册侦听。
private void registerLocalBroadcast() { mLocalReceiver = new MyLocalBroadcastReceiver(); LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mLocalReceiver, new IntentFilter(ACTION_XXX)); } private void unregisterLocalBroadcast() { if (mLocalReceiver != null) { LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mLocalReceiver); } } public class MyLocalBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() == ACTION_XXX) { //todo:业务处理 } } }3.EventBus
适用于页面之间的信息传递和同步。适用级别是Activity、Fragment。首先定义一个用于传递的数据类型,比如EventAction,类似于Intent。
public class EventAction { public EventType type; public Object data; public EventAction(EventType type) { this.type = type; } public EventAction(EventType type, Object data) { this.type = type; this.data = data; } public EventType getType() { return type; } public Object getData() { return data; } }
其中,EventType可以是int类型的Interface,也可以是enum类型的;类似于Intent中的Action;
3.1发送方:
EventAction action = new EventAction(EventType.EVENT_XXX, pushBean); EventBus.getDefault().post(action);
3.2接收方:
每个接收方都需要先调用注册接口进行订阅:
try { EventBus.getDefault().register(this); } catch (Exception e) { e.printStackTrace(); }
然后根据需要实现如下四个方法中的任何一个或几个,一般情况下收到消息后都是用来刷新页面,所以常见的使用方式是只实现onEventMainhread方法。
/** * 事件订阅者可以选择实现的方法之一 * 如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的, * onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的, * 因为在Android中只能在UI线程中更新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。 * @param action */ public void onEventMainhread(EventAction action) { switch (action.getType()) { case EVENT_BASE: break; default: break; } } /** * 事件订阅者可以选择实现的方法之一 * 如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的, * onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。 * 使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。 * @param action */ public void onEvent(EventAction action) { } /** * 事件订阅者可以选择实现的方法之一 * 如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的, * 那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的, * 那么onEventBackground函数直接在该子线程中执行。 * @param action */ public void onEventBackgroundThread(EventAction action) { } /** * 事件订阅者可以选择实现的方法之一 * 使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync. * @param action */ public void onEventAsync(EventAction action) { }4.RxBus
类似于EventBus。它是RxJava的一个附属功能;如果项目中已经引入了RxJava包,则使用RxBus就再适合不过了。
5.otto
OTTO是Square推出的库,原理与EventBus相同,实现方式也非常类似。不同的是接收方的回调方法不是固定的那四个,而是通过@Subscribe注解标志来识别接收方的回调方法的。
相关文章推荐
- Android实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- android开发环境遇到adt无法启动的问题分析及解决方法
- Android开发 旋转屏幕导致Activity重建解决方法
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android开发技巧之ViewStub控件惰性装载
- Android开发常用经典代码段集锦
- 分享10个很棒的学习Android开发的网站
- android开发之横向滚动/竖向滚动的ListView(固定列头)
- Android开发技巧之我的菜单我做主(自定义菜单)
- Windows下使用Apache Cordova开发ANDROID之HelloWorld
- 根据根据图片的url怎么取得图片ImageView对象
- [转] ADB server didn't ACK
- android开发的相关链接
- Android数据存储之SharedPreferences 共享首选项/偏好设置
- 基于NDK的Android防破解
- 麦子学院android开发笔记:Android更换RatingBar图片
- android开发入门知识之AIDL详解
- AutoCompleteTextView组件的功能和用法