NetworkController 是一個所有網絡信號圖標的綜合邏輯判斷,比如手機,以太網,還有WIFI,藍牙等信號圖標都在能看到,廢話不多說;
由於文件過於龐大,在這單獨講以太網是如何實現的。
1、在APP上層裏,以太網的EthernetStateTracker類中經過底層上報的信息(如:網絡斷開;網絡連接;發線網卡),然後將上報的信息通過廣播的形式發送到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(EthernetManager.ETHERNET_STATE_CHANGED_ACTION); //以太網廣播
public void onReceive(Context context, Intent intent) {
…………
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo info = (NetworkInfo) intent.getExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (info == null) {
Xlog.d(TAG,"onReceive, ConnectivityManager.CONNECTIVITY_ACTION networkinfo is null.");
return;
}
int type = info.getType();
Xlog.d(TAG,"onReceive, ConnectivityManager.CONNECTIVITY_ACTION network type is " + type);
if (type != ConnectivityManager.TYPE_NONE && type != ConnectivityManager.TYPE_MOBILE
&& type != ConnectivityManager.TYPE_BLUETOOTH && type != ConnectivityManager.TYPE_WIFI
&& type != ConnectivityManager.TYPE_ETHERNET) {
return;
}
}
Xlog.d(TAG,"onReceive intent is = " + intent);
updateConnectivity(intent);
updateOperatorInfo();
refreshViews();
}
else if (action.equals(EthernetManager.ETHERNET_STATE_CHANGED_ACTION) && FeatureOption.ISMART_ETHERNET_SUPPORT) { // add by peng ethernet
Xlog.d(TAG, "onReceive ETHERNET_STATE_CHANGED_ACTION");
updateEth(intent); //這個是ethernet狀態廣播,下面單獨介紹
refreshViews(); //刷新下圖標;
}
private final void updateEth(Intent intent) {
if(ETH_TAG)Xlog.e(TAG, "updateEth fun");
final int event = intent.getIntExtra(EthernetManager.EXTRA_ETHERNET_STATE, EthernetManager.ETHERNET_STATE_UNKNOWN);
if(ETH_TAG)Xlog.e(TAG, "updateEth event="+event+"mEthernetConnected"+mEthernetConnected);
switch (event) {
// case EthernetStateTracker.EVENT_HW_CONNECTED:
case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_SUCCEEDED:
Xlog.e(TAG, "updateEthEVENT_INTERFACE_CONFIGURATION_SUCCEEDED");
mEthernetConnected = true;
break;
case EthernetStateTracker.EVENT_HW_DISCONNECTED:
case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_FAILED:
default:
mEthernetConnected = false;
break;
}
updateEthernetIcons();
}
接下來就制定圖標
private void updateEthernetIcons() {
if (mEthernetConnected) {
mEthernetIconId = R.drawable.stat_sys_ethernet_connected;
} else {
//lei add
mEthernetIconId = 0;
}
if(ETH_TAG)Xlog.d(TAG, "updateEthernetIcons_mEthernetIconId =" + mEthernetIconId);
}
最後調用refreshViews方法刷新圖標
cluster.setEthernetIndicators(// 這個接口在SignalCluster類中,裏面主要是信號圖標顯示
mEthernetConnected && !mWifiConnected, //由於系統設置了WIFI優先級最高,所以要當WIFI沒有連接的時候 才能連接以太網。
mEthernetIconId,
mContentDescriptionEthernet);
}
編輯有點不方便,代碼複製過來有些地方註釋不了。