1、RIL.java
CdmaServiceStateTracker以及GsmServiceStateTracker,在系统启动时,会调用如下方式,该方法将Tracher中的Handler与RIL中的上报消息绑定在一起,即收到上报消息,就回调Handler中的某些方法。
@Override public void
setOnNITZTime(Handler h, int what, Object obj) {
super.setOnNITZTime(h, what, obj);
// Send the last NITZ time if we have it
if (mLastNITZTimeInfo != null) {
mNITZTimeRegistrant
.notifyRegistrant(
new AsyncResult (null, mLastNITZTimeInfo, null));
}
}
2、CdmaServiceStateTracker.java
调用方式如下:
protected CdmaServiceStateTracker(CDMAPhone phone, CellInfo cellInfo) {
super(phone, phone.mCi, cellInfo);
mPhone = phone;
mCr = phone.getContext().getContentResolver();
mCi.setOnNITZTime(this, EVENT_NITZ_TIME, null);
... ...
}
3、RIL.java
RIL在收到上报消息RIL_UNSOL_NITZ_TIME_RECEIVED,后,会调用2中的Handler,发送EVENT_NITZ_TIME的消息。
case RIL_UNSOL_NITZ_TIME_RECEIVED:
if (RILJ_LOGD) unsljLogRet(response, ret);
// has bonus long containing milliseconds since boot that the NITZ
// time was received
long nitzReceiveTime = p.readLong();
Object[] result = new Object[2];
result[0] = ret;
result[1] = Long.valueOf(nitzReceiveTime);
boolean ignoreNitz = SystemProperties.getBoolean(
TelephonyProperties.PROPERTY_IGNORE_NITZ, false);
if (ignoreNitz) {
if (RILJ_LOGD) riljLog("ignoring UNSOL_NITZ_TIME_RECEIVED");
} else {
if (mNITZTimeRegistrant != null) {
mNITZTimeRegistrant
.notifyRegistrant(new AsyncResult (null, result, null));
}
// in case NITZ time registrant isn't registered yet, or a new registrant
// registers later
mLastNITZTimeInfo = result;
}
4、CdmaServiceStateTracker.java
case EVENT_NITZ_TIME:
ar = (AsyncResult) msg.obj;
String nitzString = (String)((Object[])ar.result)[0];
long nitzReceiveTime = ((Long)((Object[])ar.result)[1]).longValue();
setTimeFromNITZString(nitzString, nitzReceiveTime);
break;
调用setTimeFromNITZString 去设置时间和时区(偏移值+国家码)。
关注我的技术公众号,查看更多优质技术文章推送
微信扫一扫下方二维码即可关注: