本文转载自: http://www.2cto.com/kf/201409/334153.html

同类文章:http://blog.csdn.net/lindir/article/details/7973700


NITZ:NITZ(Network Identity and Time Zone)或网络标识和时区,是一种用于自动配置本地的时间和日期的机制,同时也通过无线网向移动设备提供运营商信息。NITZ是自从PHASE 2+ RELEASE 96 的GSM中的可选功能,经常被用来自动更新移动电话的系统时钟。

NTP:NTP(Network Time Protocol)提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。 NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。


1.在setting中勾选“自动确定时间和日期”,“自动确定时区”后只是对key值为AUTO_TIME和AUTO_TIME_ZONE的Preference进行了赋值.

源码路径:packages/apps/Settings/src/com/android/settings/DateTimeSettings.java

void observe(Context context) {            ContentResolver resolver = context.getContentResolver();            resolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.AUTO_TIME),                    false, this);        }        @Override        public void onChange(boolean selfChange) {            mHandler.obtainMessage(mMsg).sendToTarget();        }


2.在/frameworks/base/services/java/com/android/server/NetworkTimeUpdateService中对上述的key值进行了监听,在检测到key值改变的时候,就会发送消息mHandler.obtainMessage(mMsg).sendToTarget();


handler接到消息后进行消息处理调用onPollNetworkTime(msg.what),发现无论是数据或者是wifi下都是调用该方法进行更新

public void handleMessage(Message msg) {            switch (msg.what) {                case EVENT_AUTO_TIME_CHANGED:                case EVENT_POLL_NETWORK_TIME:                case EVENT_NETWORK_CONNECTED:                    onPollNetworkTime(msg.what);                    break;            }        }

3.在onPollNetworkTime方法中先判断是否勾选“自动更新时间”,如果没勾选直接退出,如果勾选了再看,如果更新的NITZ时间不为NOT_SET(-1),且更新间隔小于mPollingIntervalMs,mPollingIntervalMs=24小时,那么就直接更新NITZ的时间,否则用NTP同步时间。

// If NITZ time was received less than mPollingIntervalMs time ago,// no need to sync to NTP.if (mNitzTimeSetTime != NOT_SET && refTime - mNitzTimeSetTime < mPollingIntervalMs) {       resetAlarm(mPollingIntervalMs); return;        } final long ntp = mTime.currentTimeMillis(); mTryAgainCounter = 0; // If the clock is more than N seconds off or this is the first time it's been // fetched since boot, set the current time. if (Math.abs(ntp - currentTime) > mTimeErrorThresholdMs            || mLastNtpFetchTime == NOT_SET) {          // Set the system time          ......           if (ntp / 1000 < Integer.MAX_VALUE) {                        SystemClock.setCurrentTimeMillis(ntp);         }

当从时间服务器上获取的NTP时间和当前时间之差的绝对值大于一个阀值,系统认为当前时间错误,需要更新时间。


总结:

  • 如果时间自动同步选项未勾选,直接返回;
  • 如果NITZ已同步且上次NITZ同步未超过24小时,则设置定时器24小时后再触发同步,即广播NetworkTimeUpdateService.ACTION_POLL;
  • 如果NTP上次成功同步超过24小时或用户勾选自动同步选项,则进行下面的NTP同步,否则同上设置定时器24小时后再触发同步;
  • 如果上次NTP成功同步超过24小时,则发起同步mTime.forceRefresh();
  • 如果同步成功,获取此刻NTP时间ntp=mTime.currentTimeMillis();
  • 如果同步时间与当前本机时间误差超过指定值阀值,则把ntp设置为本机时间SystemClock.setCurrentTimeMillis(ntp)

更多相关文章

  1. 其它
  2. Android中Gallery和ImageSwitcher同步自动(滚动)播放图片库
  3. Android(安卓)studio中logcat时间与真实时间不一致的问题
  4. Android计算下载速度
  5. android MotionEvent 获取长按压时间长
  6. Android(安卓)时间更新机制之网络更新时间
  7. 【Android游戏开发十五】关于Android(安卓)游戏开发中 OnTouchEv
  8. android 双击事件监听
  9. 使用镜像站同步android sdk

随机推荐

  1. Android RSS阅读器
  2. Android中AsyncTask(异步任务)详解
  3. Android(安卓)ListView工作原理完全解析,
  4. 保持Android手机屏幕长亮
  5. Android中如何禁止音量调节至静音
  6. 安卓系统上的远程 JS 调试 Remote JavaSc
  7. android/ios行驶证识别保险行业应用
  8. Android apk打包流程
  9. 他是安卓之父,从谷歌辞职后创业,又做了款Es
  10. windows7: emulator: could not find virt