Android 时间更新机制之网络更新时间

转载请注明出处:

综述:Android网络时间更新,大体分两类。1、moderm相关更新,2、网络更新。本次主要介绍网路更新时间,主要涉及到NetworkTimeUpdateService,该类运行在SystemServer(ActivityManagerService)进程中。它有点特殊,从名字来看,其实Service,其实它和WifiService、ConnectivityManagerService等系统Service不同。 SystemServer.java

try {startBootstrapServices();startCoreServices();startOtherServices();} catch (Throwable ex) {Slog.e(“System”, “******************************************”);Slog.e(“System”, “************ Failure starting system services”, ex);throw ex;}

startOtherServices方法中,会初始化该类实例:

networkTimeUpdater = new NetworkTimeUpdateService(context);

在ActivityManagerService的systemReady方法中,初始化时间更新环境。

mActivityManagerService.systemReady(new Runnable() {() {try {if (networkManagementF != null)networkManagementF.systemReady();} catch (Throwable e) {reportWtf(“making Network Managment Service ready”, e);}}}

涉及代码路径如下: frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java frameworks/base/core/java/android/util/NtpTrustedTime.java frameworks/base/core/java/android/net/SntpClient.java

一、NetworkTimeUpdateService实例

public NetworkTimeUpdateService(Context context) {mContext = context;mTime = NtpTrustedTime.getInstance(context);mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);Intent pollIntent = new Intent(ACTION_POLL, null);mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0);//时间同步有可能超时,使用该PendingIntent进行(间隔再次发起)时间同步。mPollingIntervalMs = mContext.getResources().getInteger(_ntpPollingInterval);//10天mPollingIntervalShorterMs = mContext.getResources().getInteger(_ntpPollingIntervalShorter);//30秒mTryAgainTimesMax = mContext.getResources().getInteger(_ntpRetry);mTimeErrorThresholdMs = mContext.getResources().getInteger(_ntpThreshold);//LEUI-START [BUG][MOBILEP-6067] [System time sync addedmDefaultServer = ((NtpTrustedTime) mTime).getServer();mNtpServers.add(mDefaultServer);for (String str : SERVERLIST){mNtpServers.add(str);}mTryAgainCounter = 0;//LEUI-END [BUG][MOBILEP-6067] [System time sync added}

在该构造上,有几个重要的变量: 1、mPollingIntervalMs:多次尝试同步时间无果,10天会再次发起时间同步请求 2、mPollingIntervalShorterMs :时间同步超时,再次发起时间同步请求。 3、SERVERLIST:时间同步服务器。此处建议多增加几个时间同步服务器,大陆、美国、台湾等多梯度配置。 4、初始化NtpTrustedTime对象。

mTime = NtpTrustedTime.getInstance(context);

一、NetworkTimeUpdateService初始化时间同步环境 开机后,会调用该类的systemRunning方法,在该方法中:

public void systemRunning() {registerForTelephonyIntents();registerForAlarms();registerForConnectivityIntents();HandlerThread HandlerThread(TAG);thread.start();mHandler getLooper());// Check the network time on the new threadmHandler.obtainMessage(EVENT_POLL_NETWORK_TIME).sendToTarget();mSettingsObserver = new SettingsObserver(mHandler, EVENT_AUTO_TIME_CHANGED);mSettingsObserver.observe(mContext);}

1、registerForTelephonyIntents该方法,注册监听来自Telephony Ril相关的广播。此部分会在moderm相关同步时间中介绍。

() {IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(TelephonyIntents.ACTION_NETWORK_SET_TIME);intentFilter.addAction(TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE);mContext.registerReceiver(mNitzReceiver, intentFilter);}

2、registerForAlarms此方法,,是配合第“一”中介绍的mPendingPollIntent 来工作的,主要作用是构造handler Message并再次发起时间同步请求。 3、registerForConnectivityIntents此方法监听移动数据连接,移动网络连接后,收到信息,发起时间同步请求。此部分会在moderm相关同步时间中介绍。

() {IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);mContext.registerReceiver(mConnectivityReceiver, intentFilter);}

4、构建Message,发起时间同步请求。

HandlerThread HandlerThread(TAG);thread.start();mHandler getLooper());// Check the network time on the new threadmHandler.obtainMessage(EVENT_POLL_NETWORK_TIME).sendToTarget();若不给自己设限,则人生中就没有限制你发挥的藩篱。

Android 时间更新机制之网络更新时间

相关文章:

你感兴趣的文章:

标签云: