http://www.fanjun.me/?p=551

Android服务器时间与客户端时间的校准

由于Android的时间可以由用户调整,然后有时候时间的同步的需求,所以如何进行时间与服
务器的校准可能就是一个比较恶心的问题。

之前想到的比较简单(单位为毫秒),大概步骤如下:
1. 服务器来一个时间,约等于服务器当前时间,设置为s1
2. 拿服务器返回时的本机时间毫秒,设置为c1
3. 在本地时间c2的时候,需要获取服务器的校准时间,s1+(c2-c1)

问题

如果本地的时间在中途的时候被用户修改了,可能会导致c2比c1还小,这种情况确实比较坑爹。

但是Android还比较友好,就是如果用户修改了时间和修改了时区都会发广播,我们可以
设置一个receiver来监听几个广播,然后重新设置服务器时间。

Intent.ACTION_TIME_CHANGEDIntent.ACTION_DATE_CHANGED

但是因为这个广播就算有了,我们也不知道用户修改了多少时间,除非重新去服务器拉取服务器
时间,但是在服务器拉取失败或者在服务器拉取时间的这个请求内需要使用服务器时间的情况处
理就比较麻烦了。

其实我们弄这么多,这么复杂其实只是需要知道手机本地当前时间与设置服务器时间的时候的绝
对的时间差。

解决

具体的解决方案是系统还真有这么一个绝对时间,这个是用户改动不了的,是当用户开机之后会
保持一个时钟,那就是SystemClock.elapsedRealtime() 与 SystemClock.elapsedRealtimeNanos()

我们看看文档是如何写的:

>elapsedRealtime() and elapsedRealtimeNanos() return the time since the system was booted,> and include deep sleep. This clock is guaranteed to be monotonic, and continues to tick>even when the CPU is in power saving modes, so is the recommend basis for general purpose> interval timing.

所以按照这种方式,我们在取c1与c2的时候使用这个时间就不会有问题了。


更多相关文章

  1. 万字长文带你了解最常用的开源 Squid 代理服务器
  2. Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
  3. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  4. Android应用程序模型
  5. android 4实战开发:扩展用户体验
  6. Android(安卓)APP第三方授权登陆,分享等功能合集
  7. Android(安卓)APP性能及专项测试(个人整理)
  8. Android触摸事件onScroll和onFling特别重要啊,要区分
  9. Android最佳实践之响应灵敏性(ANR)

随机推荐

  1. android创建文件夹以及向文件写入数据
  2. 内存优化三
  3. 【Android】ViewFlipper的使用
  4. android实现RecyclerView上拉加载,下拉更
  5. andorid底部菜单导航
  6. 1.3 History of Android(安卓)Plug-in Pr
  7. Android(安卓)activity‘s life cycle
  8. android TextView 分散对齐(两端对齐)
  9. Android编程权威指南之Activity的抽象类
  10. 将获取的html源代码格式化输出