项目systemui没有wifi图标,我不知道是在布局还是代码中隐藏了还是没有接收到wifi更新通知,所以看了下wifi图标更新的过程,有些东西可能受水平的局限,分析得不是很到位
首先systemui状态栏的主体在phonestatusbar这个类,在start()中可以看到
mNetworkController = new NetworkController(mContext);
final SignalClusterView signalCluster =(SignalClusterView)mStatusBarView.findViewById(R.id.signal_cluster);
mNetworkController.addSignalCluster(signalCluster);
signalCluster.setNetworkController(mNetworkController);
NetworkController是一个广播接收者,接收信号的改变,包括wifi,手机信号,飞行模式等
而SignalClusterView是一个自定义的布局,实现了SignalCluster接口,用于显示信号图标,在xml文件singal_cluster_view中使用,可以看到此布局下还放了细分的wifi,手机信号等布局,
而singal_cluster_view在布局status_bar中被include,而status_bar又被include在super_status_bar中,而super_status_bar在phonestatusbar中被填充为根布局
mStatusBarWindow = (StatusBarWindowView) View.inflate(context,R.layout.super_status_bar, null);
下面具体说下这2个类,首先NetworkController,我们在其构造方法中可以看到注册了这些广播,而且通过context.registerReceiver(this,filter)注册了自己
public NetworkController(Context context) {
...
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.SPN_STRINGS_UPDATED_ACTION);
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(ConnectivityManager.INET_CONDITION_ACTION);
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
mWimaxSupported = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_wimaxEnabled);
if(mWimaxSupported) {
filter.addAction(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION);
filter.addAction(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION);
filter.addAction(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION);
}
context.registerReceiver(this, filter);
}
我们来看其方法addSignalCluster
public void addSignalCluster(SignalCluster cluster) {
mSignalClusters.add(cluster);
refreshSignalCluster(cluster);
}