android4.4 NetworkController 详解

来源:互联网 发布:淘宝dsr在线计算 编辑:程序博客网 时间:2024/05/18 00:41

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



编辑有点不方便,代码复制过来有些地方注释不了。

0 0
原创粉丝点击