网络时间 SNTP NITZ

本文介绍了Android系统如何进行时间同步,主要分为运营商协议的NITZ和网络时钟的SNTP两种方式。NITZ依赖移动网络,而SNTP适用于无SIM卡或不支持NITZ的情况,但无法同步时区。在Android 4.0及以上版本,如果NITZ失败则会使用NTP。NTP会保存成功获取的时间,即使无网络也能更新时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SubscriptionInfoUpdater:SIM1 hot plug out

 

Android的时间更新分成2种,一种是走运营商协议的NITZ,另外一种是走网络时钟的SNTP。 
SNTP是简单网络时间协议(Simple Network Time protocol)的简称

在Android2.3.4系统中,Settings->Date & time->Automatic项打上后,时间会通过网络进行同步,而Android默认使用的是NITZ来获取移动网络时间,需要有移动网络服务商的支持才能使用,而有些Android产品只支持WIFI等无线网络,而不支持移动网络,此时就需要采用SNTP方式来获取网络时间进行同步了

   private void revertToNitz() {  
    if (Settings.System.getInt(phone.getContext().getContentResolver(),  
            Settings.System.AUTO_TIME, 0) == 0) {  
        return;  
    }  
    Log.d(LOG_TAG, "Reverting to NITZ: tz='" + mSavedTimeZone  
            + "' mSavedTime=" + mSavedTime  
            + " mSavedAtTime=" + mSavedAtTime);  
    if (mSavedTimeZone != null && mSavedTime != 0 && mSavedAtTime != 0) {  
        setAndBroadcastNetworkSetTimeZone(mSavedTimeZone);  
        setAndBroadcastNetworkSetTime(mSavedTime  
                + (SystemClock.elapsedRealtime() - mSavedAtTime));  
        return;  
    }  
    int tryCount = 5;  
    SntpClient client = new SntpClient();  

    Log.i(LOG_TAG, "revertToNitz new sntpclient");  

    for(int i = 0; i < tryCount; i++){  
        if(client.requestTime("north-america.pool.ntp.org", 10000)) {  
            long cachedNtp = client.getNtpTime();  
            long cachedNtpTimestamp = SystemClock.elapsedRealtime();  

            Log.i(LOG_TAG, "Sntp NtpTime = " + cachedNtp);  

            setAndBroadcastNetworkSetTime(cachedNtp  
               + (SystemClock.elapsedRealtime() - client.getNtpTimeReference()));  
            return;  
        }  
    }  
}  

当不支持NITZ获取时间同步时就使用SNTP方式获取时间进行同步。不过使用SNTP方式进行时间同步时不能同步时区,需要自己先去掉自动同步并设置时区后再设置自动同步,这样才能进行网络时间的同步更新。

在android 4.0版本上,通过网络同步时间有两种方式:NITZ和NTP,它们使用的条件不同,可以获取的信息也不一样;勾选这个功能后,手机首先会尝试NITZ方式,若获取时间失败,则使用NTP方式 
(1)NITZ(network identity and time zone)同步时间 
NITZ是一种GSM/WCDMA基地台方式,必须插入SIM卡,且需要operator支持;可以提供时间和时区信息。中国大陆运营商基本是不支持的。 
(3)NTP(network time protocol)同步时间 
NTP在无SIM卡或operator不支持NITZ时使用,单纯通过网络(GPRS/WIFI)获取时间,只提供时间信息,没有时区信息(因此在不支持NITZ的地区,自动获取时区功能实际上是无效的)。NTP还有一种缓存机制:当前成功获取的时间会保存下来,当用户下次开启自动更新时间功能时会结合手机clock来进行时间更新。这也是没有任何网络时手机却能自动更新时间的原因。此外,因为NTP是通过对时的server获取时间,当同步时间失败时,可以检查一下对时的server是否有效,并替换为其他server试一下。

 

移动网络类型

GPRS 
EDGE 
UMTS 
HSPAP

 

NITZ

frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java 
setAndBroadcastNetworkSetTimeZone(String zoneId){ 
alarm.setTimeZone(zoneId); 
Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE); 
mPhone.getContext().sendStickyBroadcastAsUser(intent, UserHandle.ALL); 
}

private ContentObserver mAutoTimeObserver = new ContentObserver(new Handler()) { 
@Override 
public void onChange(boolean selfChange) { 
Rlog.i("GsmServiceStateTracker", "Auto time state changed"); 
revertToNitzTime(); 

}; 
private ContentObserver mAutoTimeZoneObserver = new ContentObserver(new Handler()) { 
@Override 
public void onChange(boolean selfChange) { 
Rlog.i("GsmServiceStateTracker", "Auto time zone state changed"); 
revertToNitzTimeZone(); 

};

if (mSavedTimeZone != null) { 
setAndBroadcastNetworkSetTimeZone(mSavedTimeZone); 

saveNitzTimeZone(String mSavedTimeZone); 
mCi.setOnNITZTime(this, EVENT_NITZ_TIME, null); 
pollStateDone();

frameworks/base/core/java/android/app/AlarmManager.java 
setTimeZone(String timeZone)

frameworks/base/services/core/java/com/android/server/AlarmManagerService.java 
setTimeZoneImpl 
String current = SystemProperties.get(TIMEZONE_PROPERTY); 
if (current == null || !current.equals(zone.getID())) { 
SystemProperties.set(TIMEZONE_PROPERTY, zone.getID()); 

Intent intent = new Intent(Intent.ACTION_TIMEZONE_CHANGED);

getContext().sendBroadcastAsUser(intent, UserHandle.ALL);

package/app/Settings/src/com/android/setttings/DateTimeSettings.java

filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 
getActivity().registerReceiver(mIntentReceiver, filter, null, null);

updateTimeAndDateDisplay(activity);

packages/apps/Settings/src/com/android/settings/ZonePicker.java 
onListItemClick(){ 
AlarmManager.setTimeZone(tzid); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值