广播 BroadcastReceiver组件,与EventBus的区别

  Android的广播机制是基于系统的Binder机制实现IPC或者进程内部的通信,而Binder这种IPC机制相比于Linux原有的机制来说具有,性能更好、安全性更高和易用性更好的特点.所以android系统中很多系统事件都是基于广播的方式来发送,如开机广播、电量低的提醒广播等。
  从SDK 4.0开始所有的网络请求都需要在子线程中;广播请求网络同理,开启子线程在子线程中请求网络。
  Android上观察者模式的实现有三种方式:Android本地广播、EventBus、观察者模式。采用接口回调去实现广播的功能。广播、观察者模式、EventBus、RxBus。

  BroadCast Receiver的生命周期:动态广播,实时注册和注销;静态广播一直存在,直到App进程被终止。
> 局部广播和全局广播。
从实现原理看上,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。
-- 局部广播
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取实例
localBroadcastManager.sendBroadcast(intent);/发送本地广播
  本地广播有它的优势:
1.可以明确的知道正在发送的广播不会离开我们的程序,因此不用担心机密数据泄露问题
2.其他程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患
3.发送本地广播要比全局广播更加高效

-- 本地广播和全局广播的区别及实现原理- https://blog.csdn.net/look_future/article/details/79672760
 1、本地广播:发送的广播事件不被其他应用程序获取,也不能响应其他应用程序发送的广播事件。本地广播只能被动态
注册,不能静态注册。动态注册或方法时需要用到LocalBroadcastManager。
 2、全局广播:发送的广播事件可被其他应用程序获取,也能响应其他应用程序发送的广播事件(可以通过 exported–是
否监听其他应用程序发送的广播 在清单文件中控制) 全局广播既可以动态注册,也可以静态注册。

-- 全局广播的动态注册和静态注册
<receiver android:name=".NetBroadCastReciver"></receiver> 
public class NetBroadCastReciver extends BroadcastReceiver {    
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}

-- BroadcastReceiver广播
广播注册成对出现 The complementary method pairs are(注册了两次会出现什么问题  Android):
1.onCreate注册 -    onDestroy反注册
2.onResume注册 - onPause反注册
3.onStart注册  -      onStop反注册

-- 根据广播的发送方式,可以将其分为以下几种类型:
1.Normal Broadcast: 普通广播
2.System Broadcast:  系统广播
3.Ordered broadcast:有序广播
4.Sticky Broadcast: 粘性广播(在 android 5.0/api 21中deprecated,不再推荐使用,相应的还有粘性有序广播,同样已经deprecated)
5.Local Broadcast:  App应用内广播

-- 有两种方式分别发送两种不同的广播:
通过mContext.sendBroadcast(Intent)或mContext.sendBroadcast(Intent, String)发送的是无序广播(后者加了权限);
通过mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)发送的是有序广播。

区别:
无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。
有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。

> 广播与EventBus的区别
1)广播相对于其他的方式而言,广播是重量级的,消耗资源较多的方式。
 广播作为Android组件间的通信方式,可以使用的场景如下:
1、同一app内部的同一组件内的消息通信(单个或多个线程之间);
2、同一app内部的不同组件之间的消息通信(单个进程);
3、同一app具有多个进程的不同组件之间的消息通信;
4、不同app之间的组件之间消息通信;
5、Android系统在特定情况下与App之间的消息通信。

2)EventBus
EventBus是基于反射的,利用方法名,来定义事件的。
EventBus作为Android 开发中常用的框架,拥有着许多优点:
 1.调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。父类对于通知的监听和处理可以继承给子类,这对于简化代码至关重要;通知的优先级,能够保证 Subscriber 关注最重要的通知;粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略。可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能。
 2.使用简单。EventBus 的 Subscriber 注册非常简单,调用 eventBus 对象的 register 方法即可,如果不想创建 eventBus 还可以直接调用静态方法 EventBus.getDefault() 获取默认实例,Subscriber 接收到通知之后的操作放在 onEvent 方法里就行了。成为 Publisher 的过程就更简单了,只需要调用合适的 eventBus(自己创建的或是默认的)的 post 方法即可。
 3.快速且轻量。作为 github 的明星项目之一, EventBus 的源代码中许多技巧来改善性能,

  EventBus主题在要更新数据的时候是通过反射来执行动作的。EventBus的缺点是:代码阅读性降低、不能跨进程、不能混淆,但是优点很多,比观察者模式耦合性更低,比广播更轻量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值