Android系统状态栏的信号图标显示流程简介
一方面,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系统状态栏的信号图标显示流程简介相关推荐
- android 系统状态栏的隐藏和显示
今天,简单讲讲android如何控制 系统状态栏的隐藏和显示. 昨天遇到这个问题,找了好久资料才解决,这里记录一下. 网上流传着很多种做法.比如: 1.在AndroidManifest.xml文 ...
- android h5状态栏消息,安卓实现系统状态栏的隐藏和显示
尤其视频类APP,需要实现切换到横屏后,隐藏系统状态栏,全屏显示,以实现看更大画面的视频.当切换回竖屏后,又显示状态栏.那么如何实现呢? 网上流传着很多种做法.比如: 1.在AndroidManife ...
- Android4.1 如何实现状态栏上信号图标有SIM卡1,2标记,并且当处于2G状态显示“G”,处于3G状态显示“3G”
[Android Version] 6577/6589 Android V4.1 [Description] 如何实现状态栏上信号图标有SIM卡1,2标记,并且当处于2G状态显示"G&quo ...
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...
- android界面布局题,【填空题】Android 系统中, 用于定义布局显示在界面上的风格。...
[填空题]Android 系统中, 用于定义布局显示在界面上的风格. 更多相关问题 [37]A.anotherB.each otherC.the otherD.one another Tabor ma ...
- 计算机未连接到网络但是可以上网,win10系统能上网但图标显示未连接的解决办法...
win10系统使用久了,好多网友反馈说win10系统能上网但图标显示未连接的问题,非常不方便.有什么办法可以永久解决win10系统能上网但图标显示未连接的问题,面对win10系统能上网但图标显示未连接 ...
- Android -- Wifi热点的打开与关闭流程简介
Android -- Wifi热点的打开与关闭流程简介 在Android手机中,热点也是一个较为常用的功能.对于framework开发者来说,要开发.维护SoftAp,了解framework中热点开关 ...
- Android4.4 状态栏WiFi图标显示流程
1. 状态栏信号图标 1.1 WIFI信号显示 WIFI信号在状态栏的显示如下图所示 当WiFi状态为关闭时,状态栏不会有任何显示.当WiFi状态打开时,会如上图所示,左侧表示有可用WiFi,右侧表示 ...
- android 工具栏透明,Android 系统状态栏沉浸式/透明化完整解决方案
前言 网上已经有很多有关于系统状态栏的解决方案,这篇文章也不会有什么新奇的解决方案,都是本人经过自己试验,统计提炼出来的相对靠谱的一套解决方案. 如果是android大牛可以忽略本文,怕让您贱笑.只面 ...
最新文章
- node.js 出现cannot find module ‘xxx‘ 解决办法
- 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
- 读论文七步走!CV老司机万字长文:一篇论文需要读4遍
- IP数据报-格式-分片
- Java程序设计第三次作业
- 【编程5】斐波那契数列 + 递归+LeetCode50
- php教程知识点归纳,PHP知识点小结
- 数据类型之数字类型—运算符
- native react 更新机制_React Native - 组件的生命周期详解(附:各阶段调用的方法)...
- 福布斯评选 8 位 AI 风云女性,李飞飞、Coursera 创始人在列
- LeetCode 98. 验证二叉搜索树(递归)(迭代)
- 前端是Sencha Touch+ Cordova(转)
- 2寸的照片长宽各是多少_2寸照片的尺寸,1寸和 2 寸相片具体大小尺寸是多
- 一个用于创建JSON接口的网站 http://myjson.com/api
- [4G+5G专题-132]: 传输层 - 以太网电缆的类型(Cat5,Cat5e,Cat6,Cat6a)
- 解决一个远程主机强迫关闭连接的bug
- 计算机怎么取消脱敏设置,脸过敏如何治疗 脸部快速脱敏的妙招
- Python学习笔记——字符串、列表、元组、字典
- 5 机器学习 朴素贝叶斯算法 高斯模型 多项式模型 伯努利模型 拉普拉普平滑系数 TfidfVectorizer
- WARN com.atomikos.datasource.xa.XATransactionalResource - Error in recovery