1.startActivityForResult

适用于两个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注解标志来识别接收方的回调方法的。


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. javac错误:javac不是内部或外部命令 也不是可运行的程序 解决方法
  3. AsyncTask的简单使用
  4. Android(安卓)TV热键(快捷键、组合键)实现
  5. 安卓开发学习之解决JS不能调用Android方法
  6. android 部分手机Camera 拍照 图片被旋转90度的解决方法
  7. Android(安卓)v22.0.1+ 关联 libs/*.jar 源码包的方法
  8. Android中使用Bundle交换数据
  9. LayoutInflater的用法

随机推荐

  1. Android串口设备的应用实现方案以及与WEB
  2. Android 用代码动态添加View(ViewGroup.ad
  3. Android(安卓)Studio—— 关于在Android(
  4. Android特色开发之账户管理
  5. Android开发规范,性能优化
  6. 【译】Android主题动态切换开源库Prism基
  7. Android常用的数据结构
  8. 我和Android娘情缘
  9. Google计划开发开源WebKit内核Android浏
  10. Android(安卓)AIDL入门例子