项目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