手机状态栏信号显示流程浅析

版权声明:本文为作者原创,转载必须注明出处。

转载请注明出处:http://www.jianshu.com/p/d4e0eccb7639

最近在分析手机状态栏信号展示的一个问题,把android源码稍微撸了一下,对整个流程有了一个粗略的了解,写篇文章记录一下。代码参考的是android 7.0源码。

先来看看整个流程的时序图:

手机状态栏信号显示流程浅析_第1张图片
image.jpeg

Android的网络信号栏的显示刷新也是SystemUI的一部分,主要业务逻辑也是在SystemUI这模块内的,整个流程的开始是在PhoneStatusBar.java内的,

frameworks/base/packages/SystemUI/src/com/Android/systemui/statusbar/phone/PhoneStatusBar.java;

1、由PhoneStatusBar的makeStatusBarView()方法来加载布局。由于在Android系统中由三处地方会使用信号栏(状态栏、锁屏界面下的状态栏以及下拉通知栏的快捷设置区域),这三个引用处分别是status_bar.xml、keyguard_status_bar.xml、status_bar_expanded_header.xml),实例化三个对象,并在这个方法中为每一个SignalClusterView.java对象绑定两个控制器对象,NetworkControllerImpl、SecurityControllerImpl;

2、NetworkControllerImpl,继承于BroadcastReceive,实现NetworkController, 对象主要是负责作为信号栏数据控制类,onReceive中监听各种系统广播来监控比如 wifi, sim卡状态, service state ,飞行模式等。通过CallbackHandler将它自己和SignalClusterView联系起来,CallbackHandler和SignalClusterView同时实现NetworkController中的接口SignalCallback, 通过在CallbackHandler的对象中调用SignalClusterView的方法来实现NetworkControllerImpl对SignalClusterView控制通信;NetworkControllerImpl通过执行registerListeners( ) 来对所有MobileSignalController做个遍历,执行每个MobileSignalController 的registerListener(),来设置phoneStateListener监听。

3、 MobileSignalController是对订阅的广播做处理的封装类,每个广播对应一个MobileSignalController,进行数据处理与封装,主要是实现PhoneStateListener接口用来监听service state、信号强度、通话状态、移动数据连接状态,设置相应的显示图标。然后将这些状态和图标显示属性通过CallbackHandler传递给SignalClusterView对象中。

4、SignalStrength主要定义的是信号强度和显示格数的关系, getLevel( )获取手机当前信号值,强度分为0-4,0是最弱,4是最强。在MobileSignalController通过updateTelephony来封装数据(当然包含SignalStrength的level),最后通过notifyListenersIfNecessary来传递给SignalClusterView.java负责UI的刷新。

5、SignalClusterView.java通过SignalCallback的回调,调用apply()方法和内部类PhoneState的apply()方法来完成最终的界面刷新。

你可能感兴趣的:(手机状态栏信号显示流程浅析)