1. 状态栏信号图标

1.1 WIFI信号显示

WIFI信号在状态栏的显示如下图所示

当WiFi状态为关闭时,状态栏不会有任何显示。当WiFi状态打开时,会如上图所示,左侧表示有可用WiFi,右侧表示当前WiFi打开但未连接。

当WiFi状态连接时,会如上图所示,显示信号连接强度和数据连接状态。

1.2 图标更新流程框架

如图所示,WiFi图标的显示流程主要是通过监听系统的WiFi状态,然后通知UI去事实的刷新图标资源。NetworkController.java 继承 BroadcastReceiver 监听系统WiFi状态的变化。

2. WIFI图标更新流介绍

2.1 重要类

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
定义相关函数,继承BroadcastReceiver监听系统广播,动态注册广播接收器。是状态栏WiFi图标更新的核心类。
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
定义了 Wifi 信号更新所需的图标资源。
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
与signal_cluster_view.xml文件相对应,定义了状态上信号簇以及图片资源更新的相关方法。

2.2 WIFI图标更新流程

(1)NetworkController实例化,在PhoneStatusBar.java进行实例化

 protected PhoneStatusBarView makeStatusBarView() {final Context context = mContext;//此处省略部分代码//...mNetworkController = new NetworkController(mContext);mBluetoothController = new BluetoothController(mContext);mRotationLockController = new RotationLockController(mContext);final SignalClusterView signalCluster =(SignalClusterView)mStatusBarView.findViewById(R.id.signal_cluster);mNetworkController.addSignalCluster(signalCluster);signalCluster.setNetworkController(mNetworkController);//此处省略部分代码//...
}

(2) 初次更新WIFI图标

NetworkController.java

/*** Construct this controller object and register for updates.*/
public NetworkController(Context context) {mContext = context;//此处省略部分代码...//...// broadcastsIntentFilter 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.SPN_STRINGS_UPDATED_ACTION);filter.addAction(SimManager.INSERT_SIMS_CHANGED_ACTION);//此处省略部分代码...//.../* @} */context.registerReceiver(this, filter);//此处省略部分代码...//...
}public void addSignalCluster(SignalCluster cluster) {mSignalClusters.add(cluster);refreshSignalCluster(cluster);
}public void refreshSignalCluster(SignalCluster cluster) {if (mDemoMode) {return;}cluster.setWifiIndicators(// only show wifi in the cluster if connected or if wifi-onlymWifiEnabled, mWifiConnected,mWifiIconId,mWifiActivityIconId,mContentDescriptionWifi);//此处省略部分代码...//...
}

SignalClusterView.java

@Override
public void setWifiIndicators(boolean visible,boolean connected, int strengthIcon, int activityIcon,String contentDescription) {mWifiVisible = visible;mWifiConnected = connected;mWifiStrengthId = strengthIcon;mWifiActivityId = activityIcon;mWifiDescription = contentDescription;apply(0);
}// Run after each indicator change.
private void apply(int phoneId) {//此处省略部分代码...//...if (mWifiVisible && !mVoWifiVisible) {mWifiGroup.setVisibility(View.VISIBLE);mWifiSignal.setImageResource(mWifiStrengthId);mWifiActivity.setImageResource(mWifiActivityId);mWifiGroup.setContentDescription(mWifiDescription);} else {mWifiGroup.setVisibility(View.GONE);}//此处省略部分代码...//...
}

(3)WiFi状态变化时更新状态栏图标

当WiFi状态变化时会收到状态变化的广播

NetworkController.java

@Override
public void onReceive(Context context, Intent intent) {final String action = intent.getAction();/* SPRD: for multi-sim @{ */Log.d(TAG, "action: "+intent.getAction());mDDS = TelephonyManager.getDefault().getDefaultDataPhoneId(context);if (action.equals(WifiManager.RSSI_CHANGED_ACTION)|| action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)|| action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {updateWifiState(intent);refreshViews(mDDS);}//此处省略部分代码...//...
}

从intent中获取WiFi参数,是否连接,信号强度等

private void updateWifiState(Intent intent) {final String action = intent.getAction();if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {mWifiEnabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;} else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {final NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);boolean wasConnected = mWifiConnected;mWifiConnected = networkInfo != null && networkInfo.isConnected();// If we just connected, grab the inintial signal strength and ssidif (mWifiConnected && !wasConnected) {// try getting it out of the intent firstWifiInfo info = (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);if (info == null) {info = mWifiManager.getConnectionInfo();}if (info != null) {mWifiSsid = huntForSsid(info);} else {mWifiSsid = null;}} else if (!mWifiConnected) {mWifiSsid = null;}} else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {mWifiRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);mWifiLevel = WifiManager.calculateSignalLevel(mWifiRssi,WifiIcons.WIFI_LEVEL_COUNT - 1) + 1;}updateWifiIcons();
}

根据数据匹配对应的图标id

private void updateWifiIcons() {if (mWifiConnected) {mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel];mQSWifiIconId = WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel];mContentDescriptionWifi = mContext.getString(AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH[mWifiLevel]);/* SPRD: Add for VoWifi in bug 629758. @{ */int length = mSignalClusters.size();for (int i = 0; i < length; i++) {mSignalClusters.get(i).setWifiLevel(mWifiLevel);}/* @} */} else {if (mDataAndWifiStacked) {mWifiIconId = 0;mQSWifiIconId = 0;} else {mWifiIconId = mWifiEnabled ? R.drawable.stat_sys_wifi_signal_null: 0;mQSWifiIconId = mWifiEnabled ? R.drawable.ic_qs_wifi_no_network: 0;}mContentDescriptionWifi = mContext.getString(R.string.accessibility_no_wifi);}
}

根据匹配好的图标id通过refreshSignalCluster(cluster)进行状态栏刷新

void refreshViews(int phoneId) {//此处省略部分代码...//...if (mLastPhoneSignalIconId[phoneId] != mPhoneSignalIconId[phoneId]|| mLastDataDirectionOverlayIconId[phoneId] != combinedActivityIconId|| mLastWifiIconId != mWifiIconId|| mLastWimaxIconId != mWimaxIconId|| mLastDataTypeIconId[phoneId] != mDataTypeIconId[phoneId]|| mLastAirplaneMode != mAirplaneMode || mLastLocale != mLocale|| mLastWifiActivityIconId != mWifiActivityIconId// SPRD: modify for bug328207: refresh roaming icon immediately if changed|| mLastMobileDataRoamingId[phoneId] != mMobileDataRoamingId[phoneId]// SPRD: Reliance UI spec 1.8. See bug #622109.|| mLastMobileVoLTEId[phoneId] != mMobileVoLTEId[phoneId]/* SPRD: to fix bug 255331: icon dont't update timely {@ */|| mLastDataSignalIconId[phoneId] != mDataSignalIconId[phoneId]|| mLastMobileActivityIconId[phoneId] != mMobileActivityIconId[phoneId]|| (isSupportLTE && (mLastPhoneSignalIconId[mLTEId] != mPhoneSignalIconId[mLTEId]))) {/* @} */// NB: the mLast*s will be updated laterfor (SignalCluster cluster : mSignalClusters) {refreshSignalCluster(cluster);}for (NetworkSignalChangedCallback cb : mSignalsChangedCallbacks) {notifySignalsChangedCallbacks(cb);}}//此处省略部分代码...//...
}

WifiIcons.java代码如下:

class WifiIcons {static final int[][] WIFI_SIGNAL_STRENGTH = {{R.drawable.stat_sys_wifi_signal_0,R.drawable.stat_sys_wifi_signal_1_fully,R.drawable.stat_sys_wifi_signal_2_fully,R.drawable.stat_sys_wifi_signal_3_fully,R.drawable.stat_sys_wifi_signal_4_fully },{R.drawable.stat_sys_wifi_signal_0,R.drawable.stat_sys_wifi_signal_1_fully,R.drawable.stat_sys_wifi_signal_2_fully,R.drawable.stat_sys_wifi_signal_3_fully,R.drawable.stat_sys_wifi_signal_4_fully }};static final int[][] QS_WIFI_SIGNAL_STRENGTH = {{ R.drawable.ic_qs_wifi_0,R.drawable.ic_qs_wifi_1,R.drawable.ic_qs_wifi_2,R.drawable.ic_qs_wifi_3,R.drawable.ic_qs_wifi_4 },{ R.drawable.ic_qs_wifi_0,R.drawable.ic_qs_wifi_full_1,R.drawable.ic_qs_wifi_full_2,R.drawable.ic_qs_wifi_full_3,R.drawable.ic_qs_wifi_full_4 }};static final int WIFI_LEVEL_COUNT = WIFI_SIGNAL_STRENGTH[0].length;
}

Android4.4 状态栏WiFi图标显示流程相关推荐

  1. Android SystemUI 状态栏网络图标显示分析(Android 11)

    最近看了一个wifi, ethernet切换,状态栏图表显示的问题.记录一下追踪由于网络状态变化,SystemUI 状态栏网络图标显示的流程. 先看一下SystemUI这边: /frameworks/ ...

  2. 【无标题】UBUNTU22.04 WIFI图标显示

    Ubuntu server22.04安装后,安装了desktop sudo apt-get install ubuntu-dekstop 重启后显示图形界面,但右上角没有WIFI图标 sudo apt ...

  3. Android系统状态栏的信号图标显示流程简介

    一方面,NetworkControllerImpl.java通过onRecieve方法接收Ril发送的广播,首先,获取广播发送的Intent的action,根据广播的类型(有这几大:wifi类型,电话 ...

  4. Android 12 悬浮通知/横幅通知状态栏应用图标显示不全

    先看下问题的表现情况吧 这个模块的实现在SystemUI 这里先列举下与这个模块以及本文要描述的相关代码和资源文件,后面逐个分析 SystemUI/src/com/android/systemui/s ...

  5. android 在状态栏耳机图标显示图标显示图标显示图标,Android 通知栏图标

    先来一段发送普通通知的代码. NotificationManager notificationManager = (NotificationManager) getActivity().getSyst ...

  6. 电脑右下角WiFi图标显示是地球图标,但是能上网,要让他显示出WiFi图标这么做...

    第一步键盘上窗口键+r 输入regedit 然后找到下面的终极地址 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parame ...

  7. 笔记本连不上WiFi图标显示小地球

    右键点击小地球图标 打开网络和internet设置 点击最下边的网络重置 等待自动重启

  8. statusbar 尺寸 显示图标_StatusBar 图标展示流程 - 状态栏(StatusBar)镜头布局分析...- git完代码后的异常_169IT.COM...

    本页文章导读: ▪StatusBar 图标展示流程       StatusBar 图标显示流程 StatusBar 图标显示流程  (2010-11-05 15:23:29)转载分类: Androi ...

  9. Android 10 SystemUI 如何添加4G信号和WiFi图标

    代码路径: frameworks/base/packages/SystemUI/res/layout/system_icons.xml frameworks/base/packages/SystemU ...

最新文章

  1. 数据结构与算法笔记(十)—— 快速排序
  2. php点菜系统开题报告,点餐管理系统的设计与实现-开题报告
  3. KMP算法的简单理解
  4. JavaScript 对象和字串之间的转换
  5. 常用正则表达式,持续更新
  6. Spring bean生命周期详解
  7. 5G+北斗高精度定位系统适用于哪些行业领域?
  8. hmssdk php,接入华为推送,开发流程, 与遇到的坑(PUSH SDK 和 HMS SDK)
  9. 系统测试总结报告模板
  10. 微信分享,获取分享点击事件,登录后才可以分享
  11. darknet源码理解(二)---图片的读取
  12. 滑块验证成功后,对勾对号显示为根号
  13. Android传感器、语音识别、定位系统、Google Map API、快捷方式、widget编程总结及示例...
  14. linux xmanager 网络端口 177,通过xmanager连接linux系统
  15. Android 客户端如何与服务器时间同步
  16. MUR1060AC-ASEMI超快恢复二极管、10A快恢复二极管
  17. 我们好好聊聊华为Harmony OS,鸿蒙对于智能家居来说意味着什么?
  18. xampp+64位+php7.0,XAMPP 64位下载 XAMPP v7.4.7.0 for Windows 多国语言官方安装版 下载-脚本之家...
  19. 循环神经网络:循环神经网络
  20. 初三物理光学知识点总结_中考物理光学知识点总结

热门文章

  1. 世上没有免费午餐:谈谈网络广告与节操
  2. 浏览器打印功能print.js
  3. 分布式锁的实现【转载】
  4. java 判断手机访问_java后台如何判断是移动端还是pc端的访问请求
  5. 三维荧光平行因子学习记录--(四)平行因子组件导出--(一)
  6. 99%的人看了它都会说这是一篇很全的tomcat服务❤️❤️[⭐建议收藏⭐]
  7. android 小鸡走动动画,使用Matter.js实现的小鸡掉落动画
  8. linux用u盘拷文件损坏,复制到u盘的文件总是损坏怎么办解决?
  9. 【软件项目管理 PMP】-- 100+真题考试题
  10. CNPC海外操作人员英语日常用语900句