手机在Statusbar 上,会有个信号塔的图标。该图标是标识当前手机信号的强度(通常是voice的信号强度)。此图标会根据当前设备所收到的信号强度来对应的显示不同的资源图标,就是通常说的信号格数。这个信号值是一直变化的,那么图标也是实时更新的。在此总结下信号图标更新的流程。
1.信号图标的显示
1.1 处理上报消息
在ServiceStateTracker.java的构造函数里可以看到,在初始化ServiceStateTracker时,有向Ril监听EVENT_SIGNAL_STRENGTH_UPDATE的消息,那么当modem上报信号变化更新时,在ServiceStateTracker会去处理这个消息。这里关于注册消息的处理,不熟悉的可以查看 Android 基础篇 -- Registrant
xref: /frameworks/opt/telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java
/**
* Registrant a message on Ril
* You can check setOnSignalStrengthUpdate on RIL.java
*/
public ServiceStateTracker(GsmCdmaPhone phone, CommandsInterface ci) {
...
mCi.setOnSignalStrengthUpdate(this, EVENT_SIGNAL_STRENGTH_UPDATE, null);
...
}
/**
* send signal-strength-changed notification if changed Called both for
* solicited and unsolicited signal strength updates
*
* @return true if the signal strength changed and a notification was sent.
*/
protected boolean onSignalStrengthResult(AsyncResult ar) {
boolean isGsm = false;
int dataRat = mSS.getRilDataRadioTechnology();
int voiceRat = mSS.getRilVoiceRadioTechnology();
...
boolean ssChanged = notifySignalStrength();
return ssChanged;
}
/**
* Notify all SignalStrength Registrants about SignalStrength update
*
*/
protected boolean notifySignalStrength() {
boolean notified = false;
if (!mSignalStrength.equals(mLastSignalStrength)) {
try {
mPhone.notifySignalStrength();
notified = true;
} catch (NullPointerException ex) {
loge("updateSignalStrength() Phone already destroyed: " + ex
+ "SignalStrength not notified");
}
}
return notified;
}
当ServiceStateTracker处理完上报的消息后,可以看到是通知所有注册该监听的对象。
1.2 数据传递
在ServiceStateTracker通知注册监听对象后,会通过一系列通知 & aidl 进行数据传递,一直传递到MobileSignalController.这块没有太多的逻辑,大概传递方向是:ServiceStateTracker # notifySignalStrength --> Phone # notifySignalStrength --> DefaultPhoneNotifier # notifySign