Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android4.4中自動更新時間機制

android4.4中自動更新時間機制

編輯:關於Android編程

名詞解釋:

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


2.在/frameworks/base/services/java/com/android/server/NetworkTimeUpdateService中對上述的key值進行了監聽,在檢測到key值改變的時候,就會發送消息mHandler.obtainMessage(mMsg).sendToTarget();

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();
        }

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. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved