由于源处网站被360安全警告提示,有广告或木码,所以就不贴出源处了,请谅解
涉及的源代码主要是 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
这个代码里 集成了 3G, wifi, bluetooth, wimax 还有电池量 等信号的 状态显示功能,所以ethernet status icon也添加到这里来了。
1. NetworkController 类:
/** * Construct this controller object and register for updates. */
public NetworkController(Context context) {
mContext = context;
final Resources res = context.getResources();
ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( Context.CONNECTIVITY_SERVICE);
//mHasMobileDataFeature = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); //这里把mobile注销了
mEthernetConnected = cm.isNetworkSupported(ConnectivityManager.TYPE_ETHERNET); //添加ethernet功能
mShowPhoneRSSIForData = res.getBoolean(R.bool.config_showPhoneRSSIForData);
mShowAtLeastThreeGees = res.getBoolean(R.bool.config_showMin3G);
mAlwaysShowCdmaRssi = res.getBoolean( com.android.internal.R.bool.config_alwaysUseCdmaRssi);
// set up the default wifi icon, used when no radios have ever appeared
updateWifiIcons();
pdateWimaxIcons();
// telephony
mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
mPhone.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE
| PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
| PhoneStateListener.LISTEN_CALL_STATE
| PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
| PhoneStateListener.LISTEN_DATA_ACTIVITY);
mHspaDataDistinguishable = mContext.getResources().getBoolean( R.bool.config_hspa_data_distinguishable);
mNetworkNameSeparator = mContext.getString(R.string.status_bar_network_name_separator);
mNetworkNameDefault = mContext.getString( com.android.internal.R.string.lockscreen_carrier_default);
mNetworkName = mNetworkNameDefault;
// wifi
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Handler handler = new WifiHandler();
mWifiChannel = new AsyncChannel();
Messenger wifiMessenger = mWifiManager.getMessenger();
if (wifiMessenger != null) {
mWifiChannel.connect(mContext, handler, wifiMessenger);
}
// broadcasts
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);
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
filter.addAction(Telephony.Intents.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);
// AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it
updateAirplaneMode();
// yuck
mBatteryStats = BatteryStatsService.getService();
}
2. 这个类的主要运行函数是 onReceive():
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(WifiManager.RSSI_CHANGED_ACTION)
|| action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)
|| action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
updateWifiState(intent);
refreshViews(); //刷新显示栏
} else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
updateSimState(intent);
updateDataIcon();
refreshViews();
} else if (action.equals(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION)) {
updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false),
intent.getStringExtra(Telephony.Intents.EXTRA_SPN),
intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false),
intent.getStringExtra(Telephony.Intents.EXTRA_PLMN));
refreshViews();
} else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
action.equals(ConnectivityManager.INET_CONDITION_ACTION)) {
updateConnectivity(intent); //这个是更新链接状态
refreshViews();
} else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
refreshViews();
} else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
updateAirplaneMode();
refreshViews();
} else if (action.equals(EthernetManager.ETHERNET_STATE_CHANGED_ACTION)) {
updateEth(intent); //更新网络功能
refreshViews();
} else if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION) ||
action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION) ||
action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) {
updateWimaxState(intent);
refreshViews();
}
}
3. refreshViews() ,连接状态更新后,要刷新显示内容,这个函数有点长,缩略一下:
// ===== Update the views =======================================================
void refreshViews() {
Context context = mContext;
int combinedSignalIconId = 0;
int combinedActivityIconId = 0;
String combinedLabel = "";
String wifiLabel = "";
String mobileLabel = "";
int N;
.............................
if (mEthernetConnected) {
switch (mEthernetActivity) {
//根据mEthernetActiviy 来判断不同的状态,进而显示不同图片
case EthernetStateTracker.EVENT_HW_CONNECTED:
case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_SUCCEEDED:
mEthernetIconId = sEthImages[0];
break;
case EthernetStateTracker.EVENT_HW_DISCONNECTED:
case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_FAILED:
mEthernetIconId = sEthImages[1];
break;
default:
mEthernetIconId = sEthImages[2];
}
combinedActivityIconId = mEthernetIconId;
combinedLabel = "";
combinedSignalIconId = mEthernetIconId;
mContentDescriptionCombinedSignal = "";
}
.............................
if (DEBUG) {
Slog.d(TAG, "refreshViews connected={"
+ (mWifiConnected?" wifi":"")
+ (mDataConnected?" data":"")
+ " } level="
+ ((mSignalStrength == null)?"??":Integer.toString(mSignalStrength.getLevel()))
+ " combinedSignalIconId=0x"
+ Integer.toHexString(combinedSignalIconId)
+ "/" + getResourceName(combinedSignalIconId)
+ " combinedActivityIconId=0x" + Integer.toHexString(combinedActivityIconId)
+ " mAirplaneMode=" + mAirplaneMode
+ " mDataActivity=" + mDataActivity
+ " mPhoneSignalIconId=0x" + Integer.toHexString(mPhoneSignalIconId)
+ " mDataDirectionIconId=0x" + Integer.toHexString(mDataDirectionIconId)
+ " mDataSignalIconId=0x" + Integer.toHexString(mDataSignalIconId)
+ " mDataTypeIconId=0x" + Integer.toHexString(mDataTypeIconId)
+ " mEthernetIconId=0x" + Integer.toHexString(mEthernetIconId)
+ " mWifiIconId=0x" + Integer.toHexString(mWifiIconId)
+ " mBluetoothTetherIconId=0x" + Integer.toHexString(mBluetoothTetherIconId)
);
}
if (mLastPhoneSignalIconId != mPhoneSignalIconId
|| mLastDataDirectionOverlayIconId != combinedActivityIconId
|| mLastWifiIconId != mWifiIconId
|| mLastWimaxIconId != mWimaxIconId
|| mLastEthernetIconId != mEthernetIconId
|| mLastDataTypeIconId != mDataTypeIconId) {
// NB: the mLast*s will be updated later
for (SignalCluster cluster : mSignalClusters) {
refreshSignalCluster(cluster); //刷新信号簇
}
}
.............................
// the ethernet icon on statusbar
if (mLastEthernetIconId != mEthernetIconId){
mLastEthernetIconId = mEthernetIconId;
N = mEthernetIconViews.size();
for (int i=0; i<N; i++) {
final ImageView v = mEthernetIconViews.get(i);
if (mEthernetIconId == 0) {
v.setVisibility(View.GONE);
} else {
v.setVisibility(View.VISIBLE); //设为可见
v.setImageResource(mEthernetIconId);//显示图片内容
v.setContentDescription(mContentDescriptionEthernet);//内容描述
}
}
}
// the combinedLabel in the notification panel
if (!mLastCombinedLabel.equals(combinedLabel)) {
mLastCombinedLabel = combinedLabel;
N = mCombinedLabelViews.size();
for (int i=0; i<N; i++) {
TextView v = mCombinedLabelViews.get(i);
v.setText(combinedLabel);
}
}
// wifi label
N = mWifiLabelViews.size();
for (int i=0; i<N; i++) {
TextView v = mWifiLabelViews.get(i);
if ("".equals(wifiLabel)) {
v.setVisibility(View.GONE);
} else {
v.setVisibility(View.VISIBLE);
v.setText(wifiLabel);
}
}
// mobile label
N = mMobileLabelViews.size();
for (int i=0; i<N; i++) {
TextView v = mMobileLabelViews.get(i);
if ("".equals(mobileLabel)) {
v.setVisibility(View.GONE);
} else {
v.setVisibility(View.VISIBLE);
v.setText(mobileLabel);
}
}
}
4. OnReceive() 得到 EthernetManager.ETHERNET_STATE_CHANGED_ACTION 信号后,会运行 updateEth(intent),来更新Ethernet状态:
private final void updateEth(Intent intent) {
final int event = intent.getIntExtra(EthernetManager.EXTRA_ETHERNET_STATE, EthernetManager.ETHERNET_STATE_UNKNOWN);
switch (event) {
case EthernetStateTracker.EVENT_HW_CONNECTED:
case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_SUCCEEDED:
mEthernetIconId = sEthImages[0];
break;
case EthernetStateTracker.EVENT_HW_DISCONNECTED:
case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_FAILED:
mEthernetIconId = sEthImages[1];
return;
default:
mEthernetIconId = sEthImages[2];
}
}
5. updateConnectivity(Intent intent), onReceive() 得到 ConnectivityManager.CONNECTIVITY_ACTION 信号后,会运行这个函数:
// ===== Full or limited Internet connectivity ==================================
private void updateConnectivity(Intent intent) {
if (CHATTY) {
Slog.d(TAG, "updateConnectivity: intent=" + intent);
}
NetworkInfo info = (NetworkInfo)(intent.getParcelableExtra(
ConnectivityManager.EXTRA_NETWORK_INFO));
int connectionStatus = intent.getIntExtra(ConnectivityManager.EXTRA_INET_CONDITION, 0);
if (info.isConnected()) { //通过 ethernetinfo 来判断 ethernet 连接状态
mEthernetActivity = EthernetStateTracker.EVENT_HW_CONNECTED;
} else if (!info.isConnected() && info.isConnectedOrConnecting()) {
mEthernetActivity = EthernetStateTracker.EVENT_DHCP_START;
} else {
mEthernetActivity = EthernetStateTracker.EVENT_HW_DISCONNECTED;
}
Slog.d(TAG, "updateConnectivity: mEthernetActivity = " + mEthernetActivity);
if (CHATTY) {
Slog.d(TAG, "updateConnectivity: networkInfo=" + info);
Slog.d(TAG, "updateConnectivity: connectionStatus=" + connectionStatus);
}
mInetCondition = (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0);
if (info != null && info.getType() == ConnectivityManager.TYPE_BLUETOOTH) {
mBluetoothTethered = info.isConnected();
} else {
mBluetoothTethered = false;
}
// We want to update all the icons, all at once, for any condition change
updateDataNetType();
updateWimaxIcons();
updateDataIcon();
updateEthernetIcons(); //更新etherent Icon
updateTelephonySignalStrength();
updateWifiIcons();
}
updateEthernetIcons():
private void updateEthernetIcons() {
if (mEthernetConnected) {
mEthernetIconId = sEthImages[0];
} else {
mEthernetIconId = sEthImages[1];
}
}