原生设计中,移动数据图标只有在网络活动(下载/上传)时,才显示相应的小白色三角图标,如果没有网络活动则没有任何显示。需要在不活动时也显示灰色的三角图标。

系统导航栏中常见信号图标包括:SIM卡信号(移动数据图标)、WIFI。主要关注几个文件

网络监听控制 NetworkControllerImpl.java

信号变化控制 MobileSignalController.java WifiSignalController.java

图标显示view StatusBarMobileView.java StatusBarWifiView.java

一、增加移动网络非活动状态图标view

在原生基础上,增加一个默认灰色三角图标,启用移动数据时就显示在状态栏中。

//frameworks/base/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml
... ...<FrameLayoutandroid:id="@+id/inout_container"android:layout_height="17dp"android:layout_width="wrap_content"android:layout_gravity="center_vertical"><!-- Add: 增加一层默认图标,使用移动数据时显示 --><ImageViewandroid:id="@+id/mobile_open"android:layout_height="wrap_content"android:layout_width="wrap_content"android:src="@drawable/ic_activity_tran"android:paddingEnd="2dp"/><!-- Add --><ImageViewandroid:id="@+id/mobile_in"android:layout_height="wrap_content"
... ...

二、移动网络状态判断

系统网络发生变化时,会通过广播的方式,通知 NetworkControllerImpl.java 中进行对应变更。

// NetworkControllerImpl.java@Overridepublic void onReceive(Context context, Intent intent) {if (CHATTY) {Log.d(TAG, "onReceive: intent=" + intent);}final String action = intent.getAction();switch (action) {case ConnectivityManager.CONNECTIVITY_ACTION:case ConnectivityManager.INET_CONDITION_ACTION:updateConnectivity();break;case Intent.ACTION_AIRPLANE_MODE_CHANGED:refreshLocale();updateAirplaneMode(false);break;case TelephonyManager.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED:// We are using different subs now, we might be able to make calls.recalculateEmergency();break;case TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED:// Notify every MobileSignalController so they can know whether they are the// data sim or not.for (int i = 0; i < mMobileSignalControllers.size(); i++) {MobileSignalController controller = mMobileSignalControllers.valueAt(i);controller.handleBroadcast(intent);}mConfig = Config.readConfig(mContext);mReceiverHandler.post(this::handleConfigurationChanged);break;case Intent.ACTION_SIM_STATE_CHANGED:// Avoid rebroadcast because SysUI is direct boot aware.if (intent.getBooleanExtra(Intent.EXTRA_REBROADCAST_ON_UNLOCK, false)) {break;}// Might have different subscriptions now.updateMobileControllers();break;... ...}}

NetworkControllerImpl 中对各种网络的各种状态变化进行广播监听,执行相应操作。上面代码中几个Action是SIM相关的。虽然每个执行的方法不同,最后都是执行到

MobileSignalController.notifyListeners

这里,根据当前信号状态,对图标(IconState)状态进行刷新。原生设计中这里只有activityIn activityOut 标识网络活动,新增加非网络活动的移动数据状态。

//MobileSignalController.javapublic void notifyListeners(SignalCallback callback) {... ...boolean activityIn = mCurrentState.dataConnected&& !mCurrentState.carrierNetworkChangeMode&& mCurrentState.activityIn;boolean activityOut = mCurrentState.dataConnected&& !mCurrentState.carrierNetworkChangeMode&& mCurrentState.activityOut;showDataIcon &= mCurrentState.isDefault || dataDisabled;int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.mDataType : 0;// Add: 增加是否是移动网络状态。isDefault 是否是移动数据模式 dataSim 是否是默认数据卡 mobileDataEnabled 移动数据是否开启状态Log.d(mTag, "mCurrentState " + mCurrentState);statusIcon.connType = (mCurrentState.isDefault && mCurrentState.dataSim && mCurrentState.mobileDataEnabled) ? 1 : 0;// Addcallback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon,activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml,description, icons.mIsWide, mSubscriptionInfo.getSubscriptionId(),mCurrentState.roaming);}

再交由系统 StatusBarSignalPolicy.java 统一设置到具体的图标状态。对 MobileIconState  也增加一个默认移动数据连接标志 connType,同步更新记录状态。

//StatusBarSignalPolicy.java@Overridepublic void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,int qsType, boolean activityIn, boolean activityOut,CharSequence typeContentDescription,CharSequence typeContentDescriptionHtml, CharSequence description,boolean isWide, int subId, boolean roaming) {MobileIconState state = getState(subId);if (state == null) {return;}// Add: 同步 statusIcon 图标状态给具体的 MobileIconStateLog.i(TAG, "setMobileDataIndicators " + statusIcon.connType);state.connType = statusIcon.connType;// Add// Visibility of the data type indicator changedboolean typeChanged = statusType != state.typeId && (statusType == 0 || state.typeId == 0);state.visible = statusIcon.visible && !mBlockMobile;state.strengthId = statusIcon.icon;state.typeId = statusType;state.contentDescription = statusIcon.contentDescription;state.typeContentDescription = typeContentDescription;state.roaming = roaming;state.activityIn = activityIn && mActivityEnabled;state.activityOut = activityOut && mActivityEnabled;// Always send a copy to maintain value type semanticsmIconController.setMobileIcons(mSlotMobile, MobileIconState.copyStates(mMobileStates));}... ...public static class MobileIconState extends SignalIconState {... ...public CharSequence typeContentDescription;public int connType;//Add: 使用移动数据... ...@Overridepublic boolean equals(Object o) {... ...return subId == that.subId &&strengthId == that.strengthId &&typeId == that.typeId &&roaming == that.roaming &&needsLeadingPadding == that.needsLeadingPadding &&Objects.equals(typeContentDescription, that.typeContentDescription)&&// Modify: 增加变量 connTypeconnType == that.connType;}@Overridepublic int hashCode() {// Modify: 增加变量 connTypereturn Objects.hash(super.hashCode(), subId, strengthId, typeId, roaming, needsLeadingPadding, typeContentDescription, connType);}... ...public void copyTo(MobileIconState other) {... ...other.needsLeadingPadding = needsLeadingPadding;other.typeContentDescription = typeContentDescription;//Add: 增加变量 connTypeother.connType = connType;}... ...@Override public String toString() {// Modify: 增加变量 connTypereturn "MobileIconState(subId=" + subId + ", strengthId=" + strengthId + ", roaming="+ roaming + ", typeId=" + typeId + ", visible=" + visible + ", connType=" + connType + ")";}}

继续 setMobileIcons 设置刷新 MobileIconState 流程:

StatusBarIconControllerImpl.setMobileIcons -> StatusBarIconControllerImpl.handleSet -> StatusBarIconController.onSetIconHolder -> StatusBarIconController.onSetMobileIcon

这一段不需要修改,作用就是将 MobileIconState 状态传到 StatusBarMobileView 中。

//StatusBarIconController.javapublic void onSetMobileIcon(int viewIndex, MobileIconState state) {StatusBarMobileView view = (StatusBarMobileView) mGroup.getChildAt(viewIndex);if (view != null) {view.applyMobileState(state);}if (mIsInDemoMode) {mDemoStatusIcons.updateMobileState(state);}}

在 StatusBarMobileView 中根据 MobileIconState 状态数据进行刷新。需要修改两处:初始化及更新的函数。

//StatusBarMobileView.javaprivate void initViewState() {... ...mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);mOut.setVisibility(mState.activityOut ? View.VISIBLE : View.GONE);//Modify: 根据 MobileIconState 中状态,控制图标//mInoutContainer.setVisibility((mState.activityIn || mState.activityOut)mInoutContainer.setVisibility(mState.connType == 1? View.VISIBLE : View.GONE);... ...}private boolean updateState(MobileIconState state) {... ...mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);mOut.setVisibility(state.activityOut ? View.VISIBLE : View.GONE);//Modify: 根据 MobileIconState 中状态,控制图标// mInoutContainer.setVisibility((state.activityIn || state.activityOut)Log.i(TAG, "updateState " + state.connType);mInoutContainer.setVisibility(state.connType == 1? View.VISIBLE : View.GONE);... ...}

SystemUI 状态栏增加移动数据开启图标相关推荐

  1. Android 10.0 SystemUI状态栏显示和隐藏自定义图标

    目录 1.概述 2.SystemUI状态栏显示和隐藏自定义图标的相关功能代码

  2. Android10 SystemUI状态栏网络图标流程分析

    Android 10 SystemUI网络图标刷新与显示 涉及文件目录: android/frameworks/base/packages/SystemUI/src/com/android/syste ...

  3. Android8.0 SystemUI 状态栏信号图标

    Android 状态栏信号更新架构 状态栏上信号区域在电池图标的左侧包括 vpn,ethernet,wifi,sim,airplane等,该区域对应的View为SignalClusterView,其负 ...

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

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

  5. systemui状态栏添加新图标

    状态栏右侧添加新图标 需求描述 在状态栏右边添加一个自定义图标,根据广播更新图标. 代码实现 framework部分修改 frameworks/base/core/res/res/values/con ...

  6. SystemUi状态栏客制化功能和常见问题分析

    一.多图标成点 当系统图标区域或者通知图标区域图标过多,而区域不够时,就会将多余的图标隐藏,并显示一个点,如下图所示. 介绍此功能之前先看一下图标的初始化过程,从中可以看到有个config_statu ...

  7. 8SimpleAdapter:一行显示的数据有图标

    SimpleAdapter:一行显示的数据有图标,文本等信息. SimpleAdapter(Context context, List<? extends Map<String, ?> ...

  8. 【RecyclerView】 十、RecyclerView 数据更新 ( 增加单条数据 | 批量增加数据 )

    文章目录 一.增加单条数据 二.增加多条数据 三.完整代码示例 四.RecyclerView 相关资料 一.增加单条数据 增加单条数据 : 调用 RecyclerView.Adapter 的 void ...

  9. python(numpy,pandas8)——pandas大范围赋值和增加特定数据,处理丢失数据(nan)

    文章目录 前言 pandas大范围赋值 增加空数据 处理丢失数据(nan) isnull:查看哪个数据是nan dropna:直接丢掉 fillna:赋值为0 前言 根据 莫烦Python的教程 总结 ...

最新文章

  1. 2021-2030 无人机行业十大发展趋势
  2. 解决android 编译失败 Unexpected scopes found in folder
  3. TaskExecutor设计与实现
  4. 10个重要的Linux ps命令实战
  5. Hbase 中文参考指南 3.0 校对活动发车了~
  6. java刷机_java非智能手机能不能通过刷机安装一个安卓智能系统
  7. Android学习笔记19-ImageView实现图片适屏与裁剪
  8. ORB-SLMA3的学习笔记
  9. 【备忘录】word利用mathtype进行公式分章节编号和引用
  10. eclipse运行java项目
  11. 软件测试的测试数据分析,软件测试结果归纳与分析
  12. 千字文(粱敕员外散骑侍郎周兴嗣撰)
  13. 用shell bash自动化程序
  14. 摩斯密码基础知识介绍
  15. 工资,一般讲税前还是税后?
  16. 安卓手机如何把PDF文件转换为JPG图片
  17. Proxy(代理) ARP作用及原理
  18. matlab图片在word/wps中模糊解决方法,matlab图片转pdf后信息丢失解决方法
  19. 不懂技术,自己如何做网站?
  20. 睡眠和休眠:常见问题

热门文章

  1. uniapp APP点击跳转QQ加入群聊
  2. 2021J - Circular Billiard Table
  3. iCloud照片在哪看?如何查看iCloud里的照片
  4. 文献阅读2019-Computer-aided diagnosis system for breast ultrasound images using deep learning
  5. bittorrent端口_如何在Linux防火墙中启用BitTorrent端口?
  6. pycharm设置字体样式_pycharm设置主题/默认格式/字体
  7. 面试官:递归是个什么东东?
  8. python cmap_Python cmap包_程序模块 - PyPI - Python中文网
  9. 脑肠轴——看不见的Crosstalk
  10. SI(crosstalk)对common path的影响(CPPR)