android4.0下的日历源码分析(因为现在已经是4.2的天下了,这些日子继续写写,就写4.2的吧。差别不是很大)

转眼到13年的3月份了。日历项目已经结束有一年之久了。但是自己这篇文章就起了个开头,看到不少回复,感觉自己有点过分。所以,好好写一下。至少来龙去脉按照自己理解写下来。时隔很久,有些地方写的不是非常准确,希望大家指点。

最大的感触是比起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个日期。

 

明天继续。。。

 

     

 

评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值