Android系统DeskClock时钟应用时区添加代码分析

DeskClock时钟应用时区的添加,首先我们找到DeskClock该app所在的位置,它位于package/apps/DeskCock下,时区的读取文件位于src/com/android/deskclock/settings/settingsActivity.java中,接下来我们主要分析该文件中的代码。首先找到getAllTimeZones函数,如下图:
这里写图片描述

该方法首先读取了string.xml里的string-array中name=timezone_values和timezone_labels,其中timezone_labels为城市名,timezone_values为城市所在大洲名/城市名。部分截图如下:这里写图片描述

这里写图片描述

需要添加城市时候去的话,可在这两个String-array后面按着它的格式接着添加,但是不是所有的城市都能添加时区,下面会解释。
继续分析,接下来获取两个数组的长度,以最短的为准,防止少添加了匹配不到。然后定义了一个timezones的list,通过for循环给list添加数据,for循环里的对象为TimeZoneRow。我们继续看TimeZoneRow里的东西:
这里写图片描述
看TimeZoneRow方法有三个参数:id就是原来的timezone_values,name就是原来的timezone_label,currentTimeMillis为当前时间的毫秒值,用来计算城市所处时区的。
这里的Time.getTimeZone(id)需要注意,不是所有的城市都能得到对应的TimeZone,关键还要看系统资源中到底有没有该城市的时区资源,不然的话默认显示0时区,如果没有,需要从最新的tzdata(ftp://ftp.iana.org/tz/releases/)中添加(怎么添加,这里可google),如果最新的tzdata中也没有,那就无法添加该时区了。useDaylightTime表示是否使用夏令时,tz.getOffset可得到一个时区偏移量,下面就是根据这个来计算添加的城市所处时区的。下面我们进入buildGmtDisplayName方法看看他是如何计算时区的:
这里写图片描述
上述过程主要是字符串的拼接以及offset的转换,最终得到了添加城市对应的时区值并返回。存到了图一的List里,然后通过遍历该List将每个城市对应的时区值存到了数组里并返回数组。
这里写图片描述
最后在loadTimeZoneList()方法里获得timezones数组,ListPreference获取数组里的值将其显示在界面上,可供用户选择点击。 整个流程大致就是如此了。

文章目录
|