Android时间设置问题怎么解决


这篇文章主要讲解了“Android时间设置问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android时间设置问题怎么解决”吧!最近处理了一个非常有意思的系统bug,修改系统时间,重启后居然没有生效注意要关闭使用网络提供的时间和使用网络提供的时区这两个开关。重启后显示的时间日期为显示的时间既不是我设置的时间,也不是当前时间(当前时间为2023-03-20 15:49),那么显示的这个时间到底是什么时间呢?为了弄清楚这个问题,我研究了一下Android设置时间的逻辑,研究过程中还发现了一些彩蛋。首先是设置时间的逻辑,源码位于packages/apps/Settings/src/com/android/settings/datetime/DatePreferenceController.javamHostDatePreferenceHost接口,接口实现在packages/apps/Settings/src/com/android/settings/DateTimeSettings.java中,因此,showDatePicker()的逻辑位于该实现类中showDialog()定义在父类packages/apps/Settings/src/com/android/settings/SettingsPreferenceFragment.javashowDialog()中就是创建了SettingsDialogFragment然后显示,SettingsDialogFragmentSettingsPreferenceFragment的一个内部类,看一下SettingsDialogFragment的定义很标准的自定义DialogFragment的模板代码,核心代码在onCreateDialog()方法当中,但此方法通过DialogCreatable接口剥离了dialog的创建,这里也很好理解,因为不仅有设置日期的Dialog,还有设置时间的Dialog,如果写死的话,那么就需要定义两个DialogFragment,所以这里它给抽象出来了,DialogCreatable接口的实现仍然在DateTimeSettings当中,它的父类SettingsPreferenceFragment实现了DialogCreatable根据用户选择的操作(设置日期or设置时间),创建对应的dialog,最终的创建过程由DatePreferenceController来完成这里可以看到,系统限制了可选的日期范围为2007-01-01至2037-12-31,实际操作也确实是这样子的(开发板和小米手机都是),此为彩蛋1。看一下DatePickerDialog的定义可以看到也是标准的自定义Dialog,不过它是继承的AlertDialog,设置完成后通过OnDateSetListener进行回调,而DatePreferenceController实现了该接口可以看到系统定义了一个最小日期DatePreferenceHost.MIN_DATE,其值为2007-11-05 0:00最终显示日期会在目标日期和最小日期中取最大值,也就是说设定的日期不能小于最小日期,而上文说到,选择的日期范围为2007-01-01至2037-12-31,因此,如果你设置的日期在2007-01-01至2007-11-05之间,最终都会显示2007-11-05,实际测试也是如此(开发板和小米手机都是),此为彩蛋2。选择完时间后,最后通过AlarmManagerService来设置系统内核的时间,此处涉及到跨进程通信,使用的通信方式是AIDL,直接到AlarmManagerService看看如何设置内核时间的可以看到最终是在native层完成内核时间的设置,这也理所当然,毕竟java是应用层,触及不到kernel层。回到最开始的问题,为啥开机之后却不是我们设置的时间呢,这就要看看开机之后系统是怎么设置时间的。同样在AlarmManagerService里面,因为它是SystemService的子类,所以会随着开机启动而启动,而Service启动后必定会执行它的生命周期方法,设置时间的逻辑就是在onStart()生命周期方法里面根据源码分析得知,系统最终会在系统编译时间、根目录最近修改时间、系统构建时间、设置的时间,这四者当中取最大值作为重启后的内核时间,这里我在代码1和代码2处埋下了log,看看四个时间的值分别是多少,以及最终设置的内核时间是多少,我在设置中手动设置的日期为2022-10-01,重启后的日志如下四个值分别为:系统编译时间:1669271830000,格式化后为2022-11-24 14:37:10根目录最近修改时间:1678865533000,格式化后为2023-03-15 15:32:13构建时间:1669271830000,同系统编译时间设置的时间:1664609754998,格式化后为2022-10-01 15:35:54注意,我们只需要注意日期,不需要关注时分秒,可以看到四个时间当中,最大的为根目录最近修改时间,所以最终显示的日期为2023-03-15,此为彩蛋3。我在开发板和小米手机上测试的结果相同,说明MIUI保留了这一块的逻辑,但是MIUI也有一个bug,就是明明我关闭了使用网络提供的时间和使用网络提供的时区,它还是给我自动更新了日期和时间,除非开启飞行模式之后才不自动更新。同时我们还注意到,系统编译时间ro.build.date.utc跟系统构建时间Build.TIME是相同的,这很好理解,编译跟构建是一个意思,而且Build.TIME的取值其实也来自于ro.build.免费云主机域名date.utc感谢各位的阅读,以上就是“Android时间设置问题怎么解决”的内容了,经过本文的学习后,相信大家对Android时间设置问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: CentOS7.2怎么部署KVM虚拟机

这篇文章主要介绍了CentOS7.2怎么部署KVM虚拟机的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CentOS7.2怎么部署KVM虚拟机文章都会有所收获,下面我们一起来看看吧。centos版本:64位 7.2 1511一、安装…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/06 18:37
下一篇 06/06 18:39

相关推荐