综述:Android网络时间更新,大体分两类。1、moderm相关更新,2、网络更新。本次主要介绍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 added

mDefaultServer = ((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 thread

mHandler.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 thread

mHandler.obtainMessage(EVENT_POLL_NETWORK_TIME).sendToTarget();

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐