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