一方面,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()方法刷新界面。