Android4.4系统状态栏的信号图标显示流程简介

一方面,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)