android4.4 NetworkController 詳解

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);
}



編輯有點不方便,代碼複製過來有些地方註釋不了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章