先来一张状态栏的分区图。今天要分析的是信号显示这一小块,就是图中的signal_cluster,对应源码中的View就是SignalClusterView。
这是一个自定义View,我们看一下他的定义:
public class SignalClusterView
extends LinearLayout
implements NetworkControllerImpl.SignalCallback,
SecurityController.SecurityControllerCallback, Tunable {
}
继承了线性布局,实现了三个接口。从接口的名称就知道我们关心的东东肯定在NetworkControllerImpl.SignalCallback里面,(由此可见易懂的名称的重要性!)看看它里面有哪些内容:
public interface SignalCallback {
void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
boolean activityIn, boolean activityOut, String description);
void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
int qsType, boolean activityIn, boolean activityOut, int dataActivityId,
int mobileActivityId, int stackedDataIcon, int stackedVoiceIcon,
String typeContentDescription, String description,
boolean isWide, int subId);
void setSubs(List<SubscriptionInfo> subs);
void setNoSims(boolean show);
void setEthernetIndicators(IconState icon);
void setIsAirplaneMode(IconState icon);
void setMobileDataEnabled(boolean enabled);
}
函数名都很直观,就不翻译了,具体的实现后续用到的时候再来分析吧。
SignalClusterView的关于网络信号相关的更新肯定就是依赖于上面列举的几个接口的回调了。
那又是谁在什么情况下会调用这些接口中的回调函数呢?从接口名NetworkControllerImpl.SignalCallback知道应该是NetworkControllerImpl这个类(如果不是这种 类。接口 的形式,就直接全局搜函数名吧)。继续来看这个类的定义:
public class NetworkControllerImpl extends BroadcastReceiver
implements NetworkController, DemoMode {
}
看名称NetworkControllerImpl就纯粹是NetworkController的实现类,但它继承了广播接收器,那我们就要看看它到底处理哪些广播:
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
filter.addAction(TelephonyIntents.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED);
filter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION);
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)