读书人

Android 4.0台历(calendar)源码分析

发布时间: 2013-03-27 11:22:42 作者: rapoo

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中典型的回调机制,和观察者模式。

读书人网 >Android

热点推荐