Android SystemUI的EventBus实现原理

本文探讨Android 8.1 SystemUI的EventBus实现,作为简化版的EventBus框架,它基于观察者模式实现事件发布/订阅。系统UI通过订阅者注册事件,发布事件时查找并调用订阅者的onBusEvent方法进行处理。文章分析了事件订阅、事件发送及响应的流程,指出其与greenrobot EventBus在标识响应函数方式上的区别。
摘要由CSDN通过智能技术生成

Android 8.1的SystemUI的recents模块实现了Eventbus,用于recents模块内通信。本文分析其代码实现原理。

EventBus概述

   Eventbus是由greenrobot组织贡献的一个Android事件发布/订阅轻量级框架,基于观察者设计模式,通过解耦发布者和订阅者简化Android事件传递。Android SystemUI源码中的EventBus只简单的实现了事件传递,没有实现线程模型,粘性事件等,可以看作是简化版的Eventbus。

Eventbus实现

  在SystemUI中按照如下图所示发布者/订阅者模式实现EventBus。

  EventBus的处理流程是订阅者在EventBus中register(订阅)事件,当发布者发送出事件时,EventBus根据事件查找到订阅了该事件的订阅者列表,并逐一调用订阅者的onBusEvent()事件响应函数,把事件传给订阅者处理。
EventBus类图

1.事件订阅

  register订阅事件最终调用到如下所示函数(这里贴出的是主要的代码)。传入的参数为subscriber的类对象,获取该类所有函数,遍历并通过函数isValidEventBusHandlerMethod判断是否为EventBus的事件响应函数(public、final类型,void返回类型和函数名以onBusEvent开头),找到响应函数后,保存到mEventTypeMap对象属性中,mEventTypeMap是个HashMap对象实例,以Event的子类对象的Class属性为key,ArrayList<EventHandler>为值。如上面的类图所示,EventHandler有类型为EventHandlerMethod的属性method,而EventHandlerMethod中属性mMethod类型为Method,用于记录订阅者的事件响应函数。

 /**
     * Registers a new subscriber.
     */
    private void registerSubscriber(Object subscriber, int priority,
            MutableBoolean hasInterprocessEventsChangedOut) {
   
            ... ...
   
        Class<?> subscriberType = subscriber.getClass();
        	... ...

        // Find all the valid event bus handler methods of the subscriber
        MutableBoolean isInterprocessEvent = new MutableBoolean(false);
        Method[] methods = subscriberType.getDeclaredMethods
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值