您的位置:首页 > 移动开发 > Android开发

Android中通过NTP服务器获取时间功能源码分析

2014-03-19 19:21 507 查看
1 相关文件:

frameworks\base\services\java\com\android\server\ SystemServer.java

frameworks\base\services\java\com\android\server\ NetworkTimeUpdateService.java

frameworks\base\core\java\android\util\NtpTrustedTime.java

frameworks\base\core\java\android\net\SntpClient.java

frameworks\base\core\res\res\values\config.xml

2 实现原理:

2.1 SystemServer的run中:

ActivityManagerService.self().systemReady(new Runnable() {

public void run() {

try {

if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemReady();

} catch (Throwable e) {

reportWtf("making Network Time Service ready", e);

}

...

}

2.2 再来看看NetworkTimeUpdateService中的相关代码:

systemReady



MyHandler

重点来看看onPollNetworkTime这个函数:



在看这个函数之前先来理解几个相关变量,理解了这几个变量之后,该函数就比较好理解了。

在NetworkTimeUpdateService的构造函数中:



几个关键的变量:

mPollingIntervalMs

当NTP时间获取成功后,再次请求NTP时间的间隔

mPollingIntervalShorterMs

当NTP时间获取失败后,再次请求NTP时间的间隔

mTimeErrorThresholdMs

当NTP时间和系统时间不相同时,要更新系统时间的阀值

这几个变量的值是通过资源文件里读取的,配置的地址为config.xml,来看看相关的内容:

其实只要看下注释这几个变量的功能就清楚了,可见注释是多么的重要,如果要自己看代码理解的话,可能要花比较多的时间。

好,最后来看下onPollNetworkTime的代码:

改了下,个人感觉比原来代码更容易理解了:

哪个代码更清晰,大家仁者见仁,智者见智,各取所好。

当然,我要声明一下,虽然我很有信心我改的代码没有问题,但是该代码我没有经过测试的,所以不要随便替换。

多年的写代码的经验告诉我,自信要有,但是不要自负,大脑是的优势在于创造,而机器的优势在于精确。

所以,在实际的工作中,写完代码之后,写测试用例测试下吧!

(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: