Android 4.0日历(calendar)源码分析之CalendarController(事件分发)
日历在主体上只有一个AllInOneActivity.java,然后分别是各种Fragment。这就需要一个中介来统一处理他们的关系,AllInOneActivity和Fragment之间,以及不同的Fragment之间的通信(主要是事件),都是通过CalendarController这个类来完成的。
当在某个Fragment中想要发出一个事件的时候,该Fragment会用到自己实例化的CalendarController对象(mController),例如下面的样子:
AllInOneActivity中对四个视图的fragment进行了注册,当然并不是同时,假如当前是月视图,注册的当然是MonthByWeekFragment,要想了解如何注册的请看AllInOneActivity的setMainPane方法。或者参考我讲解AllInOneActivity的那篇文章。
其实,我们应该注意到,registerEventHandler只是对Fragment进行了注册(还有一些非AllInOneActivity的activity这里不讲解),但是事件处理对象中还有重要的AllInOneActivity,AllInOneActivity也有handleEvent的能力,AllInOneActivity为什么没有自己给自己注册一下呢,既然没有注册那么AllInOneActivity中的handleEvent方法不是永远不会被调用么?
当然不是AllInOneActivity也给自己注册了的,只不过是调用CalendarController的registerFirstEventHandler方法,方法定义如下:
12345678910111213141516171819if (event.eventType == EventType.LAUNCH_SETTINGS) { launchSettings(); return; } // Launch Calendar Visible Selector if(event.eventType == EventType.LAUNCH_SELECT_VISIBLE_CALENDARS) { launchSelectVisibleCalendars(); return; }他会直接调用相应的函数,而不是交给handler处理。
Handler的这种处理机制运用了java中典型的回调机制,和观察者模式。