美文网首页
Android Broadcast 分析 ( 1 )

Android Broadcast 分析 ( 1 )

作者: Phoenix的学习历程 | 来源:发表于2017-02-21 10:40 被阅读0次

    关于广播的分发

    关于Android的广播分发会分两个篇章来介绍,先把结论放到最前。
    
    1.对于广播注册来说,分为静态注册和动态注册,
       分别会用 ResolveInfo 和 BroadcastFilter 来实例化,
    
    2.对于广播类型,也分有序广播和普通广播。
    
    3.广播分发,是先发普通广播,Parallel Broadcast,一次发给所有 Receiver
       然后在发有序广播 Serialized Broadcast 的时候,先发给动态注册的Receiver,再发给静态注册的 Receiver。
       而静态注册的 Receiver 通过 H 去分发消息。
    

    这部分主要简单分析注册过程,

    之前的了解结果,广播的处理可以在主线程和子线程,
    主线程的情况,
    会在 ActivityThread 的 H.handleMessage 处理从 ApplicationThread 分发过来的广播消息,
    handleReceiver 会从消息中取出对应的 Receiver 去回调 onReceive 操作

    子线程的情况,
    需要在注册广播的时候传递一个子线程 handler 和 receiver进去,
    然而胡巴@wx_huhuxjh126 研究过之后发现实际上 handler 不写任何 handleMessage 操作也可以,
    ApplicationThread 在分发时会直接运行一个封装了 receiver 的 runnable 对象,
    也就是说不需要通过 handleMessage 来回调 receiver.onReceive,

    > 前提

    分析广播的分发有个前提,需要了解广播注册的时候到底是注册什么到什么,

    嗯哼先给出结论,
    注册,是把一个实现了 Binder 类 IIntentReceiver 的 InnerReceiver 对象 注册到 ActivityManagerServer,

    InnerReceiver --持有--> ReceiverDispatch --持有--> BroadcastReceiver 和 Handler

    > 注册

    不管是主线程的handler还是子线程的handler,
    注册都是把一个实现了 IIntentReceiver 的 InnerReceiver 对象交给 AMS 去注册,

    Paste_Image.png

    这段关于 InnerReceiver 的代码可以看出来,
    InnerReceiver 是一个 IBinder ,
    最终 AMS 也是使用这个东西来分发消息的。

    ReceiverDispatcher,看名字可以猜这个东西既是用来接收也用来分发广播

    下面顺便理一下 Activity 和针对各个不同广播的 Receiver 是怎样一种对应关系

    Paste_Image.png

    在 LoadedApk 中,
    有个对象 mReceiver,
    ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>
    这货是用 context 作为 key, 来对应上面代码里这个 map,
    ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>
    而这个 map 是以 receiver 为 key,来对应各个不同的 ReceiverDispatcher 的,
    也就是说只要给定一个 activity 和 BroadcastReceiver,就可以找到是否有对应的 ReceiverDispatcher 存在

    > 注册 Binder

    Paste_Image.png

    这里涉及的是 AIDL 的 Binder 注册过程,比较简单就省略分析了。

    以上,
    不涉及动态注册的广播和静态注册的广播的区别,
    这两者会在分发的时候有不同的逻辑处理。
    这里只提一下两者的 receiver 的不同,
    静态注册的广播 Receiver 继承于 ResolverInfo
    动态注册的广播 Receiver 继承于 BroadcastFilter

    相关文章

      网友评论

          本文标题:Android Broadcast 分析 ( 1 )

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