一方面,NetworkControllerImpl.java通过onRecieve方法接收Ril发送的广播,首先,获取广播发送的Intent的action,根据广播的类型(有这几大:wifi类型,电话卡,连接,设置),来监听RIL上报的消息变化。另一方面,在其构造方法里,通过registerPhoneStateListener(context)来监听电话信息的变化,如下是二者的部分代码:

OnRecieve

{

final String action = intent.getAction();

......

if(action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {

updateSimState(intent);          //判断是否有卡

updateDataIcon();

refreshViews();

}

......

}

先介绍Onrecieve()方法:

在OnRecieve方法中根据Intent传过来的action的种类作不同处理,当是sim卡信息时,先调用updateSimState(intent)。其中updateDataIcon在updateSimState后,检测数据连接是否启用。

其中updateSimState()用于检测SimState(是否有卡,卡是否锁定,是否状态错误等),部分代码如下:

Protected void updateSimState(Intent intent){

StringstateExtra=intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);

......

if(IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {

mSimState = IccCardConstants.State.ABSENT;

}

......

updateSimIcon();   //若无卡则设置mNoSimIconid为无卡有则默认为0;

updateTelephonySignalStrength(); /*判断信号类型及强度,封装了ServiceStae和SignalStrength来保存信号信息*/

......

}

该方法主要更新一个信息,就是mSimState,该属性是后续updateSimIcon()和updateTelephonySignalStrength()方法判断有卡无卡或者其他状态的依据。updateSimIcon计较简单,仅仅判断是否有卡并设置无卡时的图标id:mNoSimiconId,这时,而updateTelephonySignalStrength()来更新信号强度的时候,会有如下代码:

这里会用到mSignalStrength的方法来更新level,而mSignalStrength是一个封装好的对象存放信号强度信息,它的状态是在PhoneStateListener中的方法中更新的。

它是通过注册监听来更新的,通过registerPhoneStateListener(context)来注册,具体方法如下:

注册方法通过TelephonyManager来监听各种消息,而TelephonyManager通过获取系统服务来实例化。这个方法是在哪里调用的呢?它是在NetworkControllerImpl类的构造方法中调用的,也就是说在在该类实例化时就会调用。

在前面的接收广播更新Sim卡状态,和监听方法获取信号强度状态后,都是通过refreshView方法中刷新界面。refreshView方法主要用于更新noSimIconId,combinedIconId和combinedLabel,mobileLabel等信息(用来干嘛的)。然后调用refreshSignalClusterView来更新状态栏图标。

refreshSignalClusterView(cluster){

......

......

}

至于穿进来的参数cluster怎么来的,其实是在PhoneStatusBar.java类中调用的,PhoneStatusBar持有NetworkControllerImpl对象,PhoneStatusBar的start()方法通过层层调用,会在makeStatusBarView()方法中:

mNetworkController.addSignalCluster(signalCluster);

mNetworkController.addSignalCluster(signalClusterKeyguard);

mNetworkController.addSignalCluster(signalClusterQs);

其中mNetworkController便是NetworkControllerImpl对象。

(得接着理解PhoneStatusBar)

可以看到方法调用了本类中接口定义,SignalClusterView中实现的方法setMobileDataIndicators(),setIsAirplaneMode(),setWifeIndicators()。三个方法主要是用前面已经更新的信息来刷新图标。比如setMobileDataIndicators():

CallTracker

......

apply();

}

该方法传递好数据后调用apply()方法,apply方法中对于相对简单的图标直接在方法内更新:

对于信号这样情况较复杂的,会调用几个方法更新图标:

对于上述几个update*()方法则如出一辙:

setImageResource的参数被

同理,在onRecieve()方法中,当底层上报Intent.ACTION_AIRPLANE_MODE_CHANGED时,会有:

updateAirplaneMode()会设置代表飞行模式的标志mAirplaneMode。

然后通过updateSimIcon()来更新图标,refreshView()方法刷新界面。

Android系统状态栏的信号图标显示流程简介相关推荐

  1. android 系统状态栏的隐藏和显示

    今天,简单讲讲android如何控制  系统状态栏的隐藏和显示. 昨天遇到这个问题,找了好久资料才解决,这里记录一下. 网上流传着很多种做法.比如: 1.在AndroidManifest.xml文 ...

  2. android h5状态栏消息,安卓实现系统状态栏的隐藏和显示

    尤其视频类APP,需要实现切换到横屏后,隐藏系统状态栏,全屏显示,以实现看更大画面的视频.当切换回竖屏后,又显示状态栏.那么如何实现呢? 网上流传着很多种做法.比如: 1.在AndroidManife ...

  3. Android4.1 如何实现状态栏上信号图标有SIM卡1,2标记,并且当处于2G状态显示“G”,处于3G状态显示“3G”

    [Android Version] 6577/6589 Android V4.1 [Description] 如何实现状态栏上信号图标有SIM卡1,2标记,并且当处于2G状态显示"G&quo ...

  4. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  5. android界面布局题,【填空题】Android 系统中, 用于定义布局显示在界面上的风格。...

    [填空题]Android 系统中, 用于定义布局显示在界面上的风格. 更多相关问题 [37]A.anotherB.each otherC.the otherD.one another Tabor ma ...

  6. 计算机未连接到网络但是可以上网,win10系统能上网但图标显示未连接的解决办法...

    win10系统使用久了,好多网友反馈说win10系统能上网但图标显示未连接的问题,非常不方便.有什么办法可以永久解决win10系统能上网但图标显示未连接的问题,面对win10系统能上网但图标显示未连接 ...

  7. Android -- Wifi热点的打开与关闭流程简介

    Android -- Wifi热点的打开与关闭流程简介 在Android手机中,热点也是一个较为常用的功能.对于framework开发者来说,要开发.维护SoftAp,了解framework中热点开关 ...

  8. Android4.4 状态栏WiFi图标显示流程

    1. 状态栏信号图标 1.1 WIFI信号显示 WIFI信号在状态栏的显示如下图所示 当WiFi状态为关闭时,状态栏不会有任何显示.当WiFi状态打开时,会如上图所示,左侧表示有可用WiFi,右侧表示 ...

  9. android 工具栏透明,Android 系统状态栏沉浸式/透明化完整解决方案

    前言 网上已经有很多有关于系统状态栏的解决方案,这篇文章也不会有什么新奇的解决方案,都是本人经过自己试验,统计提炼出来的相对靠谱的一套解决方案. 如果是android大牛可以忽略本文,怕让您贱笑.只面 ...

最新文章

  1. node.js 出现cannot find module ‘xxx‘ 解决办法
  2. 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
  3. 读论文七步走!CV老司机万字长文:一篇论文需要读4遍
  4. IP数据报-格式-分片
  5. Java程序设计第三次作业
  6. 【编程5】斐波那契数列 + 递归+LeetCode50
  7. php教程知识点归纳,PHP知识点小结
  8. 数据类型之数字类型—运算符
  9. native react 更新机制_React Native - 组件的生命周期详解(附:各阶段调用的方法)...
  10. 福布斯评选 8 位 AI 风云女性,李飞飞、Coursera 创始人在列
  11. LeetCode 98. 验证二叉搜索树(递归)(迭代)
  12. 前端是Sencha Touch+ Cordova(转)
  13. 2寸的照片长宽各是多少_2寸照片的尺寸,1寸和 2 寸相片具体大小尺寸是多
  14. 一个用于创建JSON接口的网站 http://myjson.com/api
  15. [4G+5G专题-132]: 传输层 - 以太网电缆的类型(Cat5,Cat5e,Cat6,Cat6a)
  16. 解决一个远程主机强迫关闭连接的bug
  17. 计算机怎么取消脱敏设置,脸过敏如何治疗 脸部快速脱敏的妙招
  18. Python学习笔记——字符串、列表、元组、字典
  19. 5 机器学习 朴素贝叶斯算法 高斯模型 多项式模型 伯努利模型 拉普拉普平滑系数 TfidfVectorizer
  20. WARN com.atomikos.datasource.xa.XATransactionalResource - Error in recovery

热门文章

  1. 那些我们对2019技术世界趋势的预测都说准了吗?
  2. 三,c程序的编辑,编译,链接和运行
  3. JAVA NIO实现客户端与服务端通信
  4. TIA博途_序列化指令Serialize的具体使用方法示例
  5. 回文数—简单方法(C语言)
  6. js网页繁体简体转换(备忘)
  7. MIT 6.824涉及的部分论文翻译
  8. 电商商家必看!海外抖音TikTok选品教程大放送
  9. 网卡的 Ring Buffer 详解
  10. 微博中如何选中#话题#