一、NTP和NITZ简介
NITZ:Network Identity and Time Zone(网络标识和时区),是一种用于自动配置本地的时间和日期的机制,需要运营商支持,可从运营商获取时间和时区具体信息。
NTP:Network Time Protocol(网络时间协议),用来同步网络中各个计算机的时间的协议。在手机中,NTP更新时间的方式是通过GPRS或wifi向特定服务器获取时间信息(不包含时区信息)。
二、NTP功能实现流程
2.1、Service的初始化和监听器的注册
首先在SystemServer中,初始化NewNetworkTimeUpdateService并且调用
NewNetworkTimeUpdateService.systemRunning()方法,
NetworkTimeUpdateService networkTimeUpdater = null;
if (useNewTimeServices) {
networkTimeUpdater = new NewNetworkTimeUpdateService(context);
} else {
networkTimeUpdater = new OldNetworkTimeUpdateService(context);
}
if (networkTimeUpdaterF != null) {
networkTimeUpdaterF.systemRunning();
}
在初始化NewNetworkTimeUpdateService时,会调用NtpTrustedTime.getInstance(context)指定我们使用的NTP服务器和相应超时时间,并且实例化AlarmManager和ConnectivityManager;在调用systemRunning()方法时,注册监听NITZ、Alarm、网络状态变化以及设置中自动更新时间开关的变化;
public NewNetworkTimeUpdateService(Context context) {
mContext = context;
mTime = NtpTrustedTime.getInstance(context);
mAlarmManager = mContext.getSystemService(AlarmManager.class);
mCM = mContext.getSystemService(ConnectivityManager.class);
Intent pollIntent = new Intent(ACTION_POLL, null);
mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0);
//较长的时间间隔,当同步时间成功后的下一次自动同步的时间间隔,默认为24小时
mPollingIntervalMs = mContext.getResources().getInteger(
com.android.internal.R.integer.config_ntpPollingInterval);
//较短的时间间隔,当同步时间失败后的下一次自动同步的时间间隔,默认为1分钟
mPollingIntervalShorterMs = mContext.getResources().getInteger(
com.android.internal.R.integer.config_ntpPollingIntervalShorter);
//当同步时间失败后,会重新尝试同步的次数
mTryAgainTimesMax = mContext.getResources().getInteger(
com.android.internal.R.integer.config_ntpRetry);
//时间会更新的阈值,只有服务器上的时间和设备时间相差超过这个阈值时,才会更新时间
mTimeErrorThresholdMs = mContext.getResources().getInteger(
com.android.internal.R.integer.config_ntpThreshold);
mWakeLock = context.getSystemService(PowerManager.