android组件间的通讯方式

1.Activity之间的回调:

利用intent传递数据的StartActivity或者startActivityForResult实现activity之间的通讯

 

2.广播通讯方式:

广播通讯是我们常用的方式,也是android里面标准的方法,可以进行跨应用使用,可以算观察者模式的一种实现方式。

缺点:无法传递复杂的数据,必须通过bundle来传递

1,广播接收者BroadcastReceive通过Binder机制向AMS(Activity ManagerService)进行注册

2,广播发送者通过Binder机制向AMS发送广播

3,AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver的相应的消息循环队列中

4,消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

3.基于观察者模式的通讯方式:

观察者:

(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

被观察者:

(Observeable)被观察者对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。

简单例子:

1,定义抽象的观察者接口:

public interface ObserverInterface {
    /**
     * 根据事件进行数据或者UI的更新
     * @param message
     */
    public void dispatchChange(String message);
}

2,定义观察者,实现观察者接口:

public abstract class  Observer implements ObserverInterface{
    private Handler mHandler;

    public Observer(){
        mHandler=new Handler(Looper.getMainLooper());
    }


    public abstract void onChange(String message);

    @Override
    public void dispatchChange(String message){
        mHandler.post(new NotificationRunnable(message));
    }

    private final class NotificationRunnable implements Runnable{
        private String message;
        public NotificationRunnable(String message){
            this.message=message;
        }
        @Override
        public void run() {
            Observer.this.onChange(message);
        }
    }
}

3,定义抽象的被观察者接口:

public interface ObserveableInteraface {
    /**
     * 注册观察者
     * @param observer
     */
    public void registerObserver(Observer observer);

    /**
     * 反注册观察者
     * @param observer
     */
    public void removeObserver(Observer observer);

    /**
     * 通知注册的观察者进行数据或者UI的更新
     */
    public void notifyObserver(String message);
}

4,定义被观察者,实现被观察者接口:

public class Observeable implements ObserveableInteraface {
    private List<Observer> mEventObservers=new ArrayList<Observer>();
    private static volatile Observeable mEventObserveablet;
    private Subject(){

    }

    public synchronized static Observeable getInstance(){
        if(mEventObserveable ==null){
            mEventObserveable =new Observeable();
        }
        return mEventObserveable;
    }

    @Override
    public void registerObserver(Observer observer) {
        synchronized (mEventObservers){
            if(observer!=null){
                if(mEventObservers.contains(observer)){
                    return;
                }
                mEventObservers.add(observer);
            }
        }
    }

    @Override
    public void removeObserver(Observer observer) {
        synchronized (mEventObservers){
            int index = mEventObservers.indexOf(observer);
            if (index >= 0) {
                mEventObservers.remove(observer);
            }
        }
    }

    @Override
    public void notifyObserver(String message) {
        if(mEventObservers!=null && mEventObservers.size()>0 && message!=null){
            for(Observer observer:mEventObservers){
                observer.dispatchChange(message);
            }
        }

    }
}

就这样我们定义好了观察者(Observer)和被观察者(Observeable)

具体使用:

一般为了减少不必要的代码复用,我们会封装一个基类Activity,所以我们把观察者的使用在BaseActivity中进一步封装,方便我们快速调用

(observer)观察者封装使用:

public abstract  class BaseActivity extends ActionBarActivity {
    private ActivityObserver mActivityObserver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivityObserver=new ActivityObserver(this);
        registerObserver(mActivityObserver);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        removeObserver(mActivityObserver);
    }


    /**
     * 注册为观察者
     * @param observer
     */
    public void registerObserver(Observer observer) {
            final Observeable eventObserveable t=Observeable.getInstance();
            Observeable.registerObserver(observer);
    }

    /**
     * 反注册观察者
     * @param observer
     */
    public void removeObserver(Observer observer) {
            final Observeable eventObserveable = Observeable.getInstance();
            eventObserveable.removeObserver(observer);
    }

    /**
     * 该方法会在具体的观察者对象中调用,可以根据事件的类型来更新对应的UI,这个方法在UI线程中被调用,
     * 所以在该方法中不能进行耗时操作,可以另外开线程
     * @param message 事件类型
     */
    protected abstract void onChange(String message);


    private static class ActivityObserver extends Observer {
        //添加弱引用,防止对象不能被回收
        private final WeakReference<BaseActivity> mActivity;
        public ActivityObserver(BaseActivity activity){
            super();
            mActivity=new WeakReference<BaseActivity>(activity);
        }

        @Override
        public void onChange(String message) {
            BaseActivity activity=mActivity.get();
            if(activity!=null){
                activity.onChange(message);
            }
        }
    }
}

(Observeable)被观察者使用实例:

public class FirstActivity extends ActionBarActivity {

    private Button notifyButton;

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

        notifyButton=(Button) findViewById(R.id.NotifyButton);
        notifyButton.setOnClickListener(
                new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //通知所有观察者,给所有观察者发出消息
                Observeable ob = Observeable.getInstance();
                 ob.notifyObserver("are you ok ?");
            }
        });
    }
}

(observer)观察者使用实例:

public class SecondActivity extends BaseActivity {

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

    @Override
    protected void onChange(String message) {
        //接收到被observeable 被观察者发来的消息

        System.out.println("I'm fine thank you ");
    }
}

4.基于发布/订阅者 模式的通讯方式:

发布/订阅简称(Pub/Sub)模式,这种模式是观察者observer的一种变体。发布者主要是负责向外发送消息,S订阅者主要是订阅接收消息。主要用于“只负责传递消息,并不关心其他订阅者已经收到这个消息”.和广播通信非常相似。我们常用的发布订阅模式是EventBus框架. 
优点:代码简洁优雅,大大降低了耦合性。简化了应用程序内各组件间、组件与后台线程间的通信。 
缺点:无法进程间通信,如果一个应用内有多个进程的话就没办法了,无法跨应用传递事件。在组件之间通信非常频繁复杂繁琐的时候,会需要很多不同通信的消息Event实体 , EventBus的缺点也就暴露出来了,此时代码维护也很变得不容易了,显得混乱。

1、初始化时注册EventBus.getDefault().register(this);
2、用完之后注销EventBus.getDefault().unregister(this);
3、中间过程主要就是消息推送和接收,通过EventBus.getDefault().post(param)推送,通过onEventMainThread(param),onEventPostThread(param),onEventBackgroundThread(param),onEventAsync(param)接收并处理。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值