(源码分析)Android系统时间-自动获取

34 篇文章 0 订阅
26 篇文章 0 订阅

工作关系查看了 设置界面 自动获取时间的code。


点开设置-时间日期 第一眼就能看到 自动获取时间 和 自动获取时区的勾选框,那么时间和时区是怎么自动获取的呢。

首先我们要知道的是,当前页面的显示是在packages/apps/Settings/src/com/android/settings下面的DateTimeSettings.java中显示的。


然后我们可以看到 在onResume添加了一个SharedPreferenceChangeListener。这个callback是当前activity已经实现的








点了自动获取时间的按钮之后 就会回调到这儿:




会对Settings.Global.AUTO_TIME 进行修改。


根据查找,系统里面有三个地方(修改时间相关的地方)对Settings.Global.AUTO_TIME 进行了追踪。

1.GSM:frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java

2.CDMA:frameworks/opt/telephony/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java

3.frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java


1跟2都跟运营商有关系,但是nitz是能获取到时区的。因为能定位哈哈哈。

因为工作关系不需要跟1,2相关的。我们直接看3.

3里面呢是有对nitz的判断的,但是我们着重看一下ntp时间的获取。由于ntp服务器根据ip是无法获取到定位的所以如果单ntp是只能更新时间不能更新时区的。

为了跟代码,部分Log是自己添加的 请无视,来看NetworkTimeUpdateService.java:





我们可以看到handler的三个事件都会走这个方法。这三个监听都是哪儿来的呢

1.



2.



3.




所以我们知道 一进来 还有自动获取时间按钮状态的变化 还有网络的变化都会走这个方法,那这个方法是做什么的呢,先看前部分:



前部分做了一些判断,例如:不是自动获取时间请求的,return;如果获取到了nitz时间(默认是 NOT_SET这个值,获取到之后会发广播到这个类来赋值),nitz获取的时间比boot之后运行的时间还小的 return;接下来如果是第一次 或者 已经超过规定的获取ntp时间的间隔就会开始请求ntp时间。如果第一次请求了ntp时间 第二次请求ntp的时间与第一次的间隔小于规定的值,那么就不会去获取ntp时间。见后半部分代码:





接下来看看 请求:

刚看到代码调到了frameworks/base/core/java/android/util/NtpTrustedTime.java 的 forceRefresh方法:




当然也做了一系列判断,诸如server是否为空是否有网之类的。

然后就调到了:frameworks/base/core/java/android/net/SntpClient.java的requestTime的方法:





通过udp来请求ntp获取时间并进行更新,有兴趣的童鞋可以自己跟跟 gsm和cdma的东西。

注:如果不断电的话 或 断电时间较短 那么电容会继续走时间,那么下一次进来的缓存还是没有进行更新的。包括规定的ntp的获取间隔。


如果有不对的地方,欢迎指正,互相学习。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android系统源码是按照功能进行分类的,主要分为系统代码、工具、文档、开发环境、虚拟机、配置脚本和编译脚本等类别。其中,系统代码Android系统的核心部分,包含了各个功能模块的实现代码。工具包括了用于Android系统开发和调试的工具,例如adb、emulator等。文档部分包含了Android系统的开发文档和相关说明。开发环境是Android系统的开发所需的各种环境、库和工具。虚拟机是用于运行Android应用程序的Dalvik虚拟机。配置脚本和编译脚本是用于配置和编译Android系统的脚本文件。 Android系统采用的是一个从BSD继承而来的标准的系统函数库bionic。它是一个轻量级的C库,专门为Android系统进行了优化和定制。在源码根目录下有bionic文件夹,它包含了bionic库的源代码和相关文件。 Android4.3程序库的类型非常多,功能也非常强大。其中一些常用且重要的系统程序库包括: - libcore:Android系统的核心库,提供了Java核心类库的实现,包括集合、IO、网络等功能。 - libandroid_runtimeAndroid运行时库,提供了Android应用程序运行所需的功能,例如应用程序的启动和管理、进程间通信等。 - libui:Android系统的用户界面库,提供了绘制窗口、图形渲染等功能。 - libsqlite:SQLite数据库库,提供了数据库的管理和操作功能。 - libmedia:媒体库,提供了音频和视频的播放和录制功能。 以上是Android系统源码分析的一些基本信息。如果你有更具体的问题,可以告诉我,我会尽力帮助你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值