最近看了下網路時間同步,總結一下。
整體描述:
android網路時間同步使用NITZ(Network identity and Time Zone)電訊廠商可選服務。
由Ril層主動上報RIL_UNSOL_NITZ_TIME_RECEIVED訊息;通知(notify)給CdmaServiceStateTracker和GsmServiceStateTracker;CdmaServiceStateTracker獲得網路同步時間,根據DateTimeSetting中自動同步設定,決定是否同步和發送(ACTION_NETWORK_SET_TIMEZONE、ACTION_NETWORK_SET_TIME)廣播。
其中
/** if time between NITZ updates is less than mNitzUpdateSpacing the update may be ignored. */
private static final int NITZ_UPDATE_SPACING_DEFAULT = 1000 * 60 * 10;
private int mNitzUpdateSpacing = SystemProperties.getInt("ro.nitz_update_spacing",
NITZ_UPDATE_SPACING_DEFAULT);
決定同步的時間間隔,如果網路主動上報間隔小於此時間間隔,則忽略該次訊息
/** If mNitzUpdateSpacing hasn't been exceeded but update is > mNitzUpdate do the update */
private static final int NITZ_UPDATE_DIFF_DEFAULT = 2000;
private int mNitzUpdateDiff = SystemProperties.getInt("ro.nitz_update_diff",
NITZ_UPDATE_DIFF_DEFAULT);
上報的NITZ同步時間與當前處理時間的預設間隔,如果實際間隔大於此間隔,則同步該次時間。
同步判斷條件
if ((mSavedAtTime == 0) || (timeSinceLastUpdate > nitzUpdateSpacing)
|| (Math.abs(gained) > nitzUpdateDiff)) {
Log.i(LOG_TAG, "NITZ: Auto updating time of day to " + c.getTime()
+ " NITZ receive delay=" + millisSinceNitzReceived
+ "ms gained=" + gained + "ms from " + nitz);
setAndBroadcastNetworkSetTime(c.getTimeInMillis());
} else {
Log.i(LOG_TAG, "NITZ: ignore, a previous update was "
+ timeSinceLastUpdate + "ms ago and gained=" + gained + "ms");
return;
}
另,上層Setting App中,DateTimeSetting設定了AutoTime is True,則CdmaServiceStateTracker和GsmServiceStateTracker的監聽,根據當前
if (mSavedTimeZone != null && mSavedTime != 0 && mSavedAtTime != 0) {
setAndBroadcastNetworkSetTimeZone(mSavedTimeZone);
setAndBroadcastNetworkSetTime(mSavedTime
+ (SystemClock.elapsedRealtime() - mSavedAtTime));
}
廣播時間和Time Zone