最大的感触是比起2.3来多了fragement.要想彻底弄清楚架构,认真分析还是必不可少的。陆陆续续写完这篇文章吧。
应博友的要求,贴下图,下图是自己所在公司对android4.2增加了年历功能后的截图。android4.2原始界面肯定不是这个样子的。
一.作为一个Application,日历在成为application时做了什么?
CalendarApplication扩展了Application.
GeneralPreferences.setDefaultValues(this);
中设置了其后日历应用所需的默认值。
二. 日历的入口类,
我称它为引导性Activity类----AllInOneActivity.java分析
在AllInOneActivity的onCreate方法中,就像android大部分应用一样,初始化了日历的数据和界面显示。
1.数据部分
第一部分:最开始的账户检查,将日历的数据和已有的google账户通过数据库关联。实际使用中,除了测试,很少去关联。这部分也就是简单的数据库AUTHORITY关联,就不累述。
第二部分:
mController = CalendarController.getInstance(this);
上面的代码初始化了日历控制器类CalendarController。这个类需要在界面设定之前实例化,因为界面的显示离不开数据,对于日历来说,界面的显示,离不开CalendarController类的数据。CalendarController主要是控制了event事件的类型,开始时间,结束时间,等。它贯穿了日历的整个数据处理过程。
说白了在我的理解中,CalendarController它就是被白话了的数据库。不管运行到日历的哪个activity,它都能随意存取,是数据处理的全局变量作用的一个基类。
2.界面部分
上面的数据部分以及传给AllInOneActivity的intent或是icicle所含的信息成为AllInOneActivity.java处理界面的依据。从Activity的命名也可以看出,这个Activity存在的意义在于其根本的交互性。也就是说,几乎所有日历界面或是数据的交互,都是由这个类来穿针引线的。
2.1 给我的数据是从哪里来的?要往哪里去?
if (icicle != null) { timeMillis = icicle.getLong(BUNDLE_KEY_RESTORE_TIME); viewType = icicle.getInt(BUNDLE_KEY_RESTORE_VIEW, -1); } else { String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) { // Open EventInfo later timeMillis = parseViewAction(intent); } if (timeMillis == -1) { timeMillis = Utils.timeFromIntentInMillis(intent); } }
2.1.1当icicle不为空时,表明onSaveInstanceState中存有缓存数据。此时,自然根据在日历内部的操作需求,决定其后继显示的界面。
后继界面显示取决与两个元素的设定:BUNDLE_KEY_RESTORE_TIME和BUNDLE_KEY_RESTORE_VIEW。
时间和界面类型。具体指的是日历显示的时间和月历还是周历。
2.1.2 当icicle为空时,从intent中寻找所需显示信息。
a.intent具体为Intent.ACTION_VIEW时,通过parseViewAction函数获得时间。具体为intent的action含有eventid时,通过eventid获得event的开始时间,结束时间,状态。最后设定为日历显示时间为event的开始时间。
b.从a中没有获得有效时间时,分析intent所含data是否含有time字段,从time字段获得时间。如果还是获取不成功,则在这一步将日历显示时间设定为系统的当前时间。
3.20日,下班,回家。明天晚上继续。
2013年10月10日继续写写这篇文章,跟前面的接不起了。就想到什么写什么吧。主要是写anroid4.2的。
首先,先从日历界面的代码说起吧,它分为几大部分:
一,日历界面从其功能上分有月历,周历,日历,日程列表。每个功能界面的形成,也是大同小异。
一般通过其对应的类名就可以基本判定出其相应的处理。
com.android.calendar.agenda 处理日程列表的显示和功能
com.android.calendar.month 处理月历和周历的显示以及功能
com.android.calendar 处理了日历基础的功能,当然包括每日日历的显示以及功能
二,对应月历,周历,日历,日程列表,不能不说的四个fragment
DayFragment(日历),AgendaFragment(日程),MonthViewFragment(月历);DayFragment(timeMillis, 7) 周历
以上分类过一阵再补全。今天就先再以月历为例,说说其界面元素的draw吧。
MonthWeekEventsView继承了SimpleWeekView,这个类是画月历界面的核心。虽说大的结构上,这个类最终还是应用到了adapter上,但是,不深入理解这个类,对月历界面恐怕会一直半解。
在这个类中,画了月历所需要显示的日期,农历,节气。每一行为7个日期。而这个类,也主要是画7个日期。
明天继续。。。