美文网首页
2.4基础知识-broadcast

2.4基础知识-broadcast

作者: 205蚁 | 来源:发表于2018-11-09 07:42 被阅读0次

Broadcast Receiver 广播详解

  • 1.广播
    • 1.广播定义
    • 2.广播场景
    • 3.广播种类
  • 2.实现广播-receiver
  • 3.广播实现机制
  • 4.LocalBroadcastManager详解(源码角度深入分析)

1.广播

1.广播定义(类似的观察者)
    在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。
    发送一个广播可以被多个 注册相同action的接收者接收到
2.广播场景
    1.同一个app内,具有多个进程的不同组件之间的消息通信 。定位地图进程,主进程
    2.不同app之间的组件之间消息通信
3.广播种类
    1.普通广播(Normal Broadcast):Context.senBroadcast
    2.有序广播(System Broadcast): Context.sendOrderedBroadcast
    3.本地广播(Local Broadcast):只在自身app内传播

2.实现广播-receiver

1.静态注册:注册完成就一直运行(即Activity销毁,Service销毁,App挂掉,仍然可以接收广播,但是Android 8.0之后有限制了)
    不是太灵活
2.动态注册:跟随activity的生命周期(要在适当的时候比如onDestroy取消注册unRegisterRecever,否则会内存泄露)

3.广播实现机制

1.自定义广播接收者BroadcastReceiver,并复写onReceiver()方法
2.通过Binder机制向AMS(Activity Manager Service)进行注册
3.广播发送者通过Binder机制向AMS发送广播
4.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activty)相应的消息循环队列中
5.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

观察者模式:
AMS:贯穿android系统组件的的一个核心服务,它负责启动四大组件的启动,切换,调度,应用程序的管理和调度管理工作
Binder机制:C/S结构。客户端进程可以获取服务端进程的代理,并通过代理接口来读取数据,完成数据间通信

4.LocalBroadcastManager详解(源码角度深入分析)

1.使用它发送的广播将只在自身App内传播,因此不必担心泄露隐私数据
2.其他App无法对你的App发送该广播,因为你的App根本就不可能接收到非自身应用发送的该广播,因此你不必担心有安全漏洞可以使用
3.比系统的全局广播更加高效
图1 图2 图3 图4 图5 图6

源码:

构造方法:private xxx-->单例
                        mHandler = new Hander(context.getMainLooper)
        
三个比较重要的集合类

        private HashMap<BroadcastReceiver,ArrayList<IntentFilter>> mReceivers;
        private<String,ArrayList<ReceiverRecord>> mActions;
        private ArrayList<BroadcastRecord> mPendingBroadcasts;

        mReceivers://一个广播可以对应多个过滤器,一个过滤器可以有多个action
        mAction://key 是一个string,action。维护着Receiverrecord
        mPendingBroadcasts;// 存储 广播接收器的存储器。会遍历
            
        private static class BroadcastRecord{
            final Intent intent;
                final ArrayList<ReceiverRecord> reveivers;
                BroadcastRecord(Intent _intent,ArrayList<ReceiverRecord> _receivers){
                xx = xx;
                    xx = xx;
                }
            }
            //注册
            public void registerReceiver(BroadcastReceiver receiver,IntentFilter filter){
                synchronized()
            }
            //反注册
            unRegisterReceiver
            发送
            sendBroadcast()

特点

  • 1.LocalBroadcastManager 高效的原因主要是因为他内部是通过Handler实现的,它的sendBroadcast()方法含义并非和我们平时所用的一样,它的sendBroadcast()方法其实是通过handler发送一个Message实现的

  • 2.既然它内部是通过Handler来实现广播的发送的,那么相比与其他系统广播通过Binder实现那肯定是要更高效了,同时使用Handler来实现,别的应用无法向我们的应用发送广播,而我们应用发送的广播也不会离开我们的应用

  • 3.LocalBroadcastManager内部协作主要是靠这两个Map集合,mRecevers和mActions,当然还有一个List集合mPendingBroadcasts,这个主要是存储待接收的广播对象

相关文章

网友评论

      本文标题:2.4基础知识-broadcast

      本文链接:https://www.haomeiwen.com/subject/jvhnxqtx.html