android系统自动获取时间被关闭,基于Android L分析”自动获取Android系统时间”

本文介绍了程序员在购买机械键盘时如何选择红轴和茶轴,并深入探讨了手机时间自动获取的系统级实现,从代码层面解析了自动时间设置背后的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

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

首先我们要知道的是,我们当前显示的设置-时间日期页面的代码的位置并查看。

这个代码位于packages/apps/Settings/src/com/android/settings下面的DateTimeSettings.java中。我们查看DateTimeSettings.java的代码,可以看到 在onResume添加了一个SharedPreferenceChangeListener。这个callback是当前activity已经实现的,如下图所示:

auto_time_resume-300x75.png

auto_time_class_info-300x24.png

emmm..被发现我自己csdn的水印了,忽略就好。blog已经迁过来啦。

好了继续看。

当我们点了自动获取时间的按钮之后 就会回调到这儿。代码如下图所示:

auto_time_click_call_back-300x88.png

会对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 :

auto_time_NetworkTime_handler-300x209.png

我们可以看到handler的三个case都会走这个方法。这三个case都是哪儿来的呢,话不多说还是看图:

1.

auto_time_case1-300x21.png

2.

auto_time_case2-300x74.png

3.

auto_time_case3-300x133.png

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

auto_time_pull_net_work_time-300x152.png

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

auto_time_pull_net_work2-300x138.png

接下来看看 请求:

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

auto_time_forceRefresh-300x195.png

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

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

auto_time_requesttime1-300x226.png

auto_time_requesttime2-300x108.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值