关于StatusBar的显示流

上一篇博客笔记,记录了耳机相关的流程源码跟踪。其中有一个点就是,市场上一般的android 手机,当我们插上耳机之后在StatusBar里面,会显示耳机图标,耳机分带micphone和不带micphone的耳机,此时显示的图标也会不一样。

因此,这里以耳机图标显示来跟踪梳理一下,statusbar里面图标的显示流程。耳机图标显示流程和闹钟,震动,sim卡等图标的显示差不多。主要涉及的几个类文件:StatusBarManager.java

StatusBarManagerService.java

PhoneStatusBarPolicy.java

StatusBar.java

StatusBarIconList.java

StatusBarIcon.java

他们之间的关系大致可以用下面这个图简单描述一下。

关于StatusBar的显示流_第1张图片

在framework/base/core/res/res/values/config.xml:25:    <string-array name="config_statusBarIcons">

config.xml里面声明了statusbar的各个图标。

    <string-array name="config_statusBarIcons">
       <item><xliff:g id="id">ime</xliff:g></item>
       <item><xliff:g id="id">sync_failing</xliff:g></item>
       <item><xliff:g id="id">sync_active</xliff:g></item>
       <item><xliff:g id="id">location</xliff:g></item>
       <item><xliff:g id="id">bluetooth</xliff:g></item>
       <item><xliff:g id="id">nfc</xliff:g></item>
       <item><xliff:g id="id">tty</xliff:g></item>
       <item><xliff:g id="id">speakerphone</xliff:g></item>
       <item><xliff:g id="id">mute</xliff:g></item>
       <item><xliff:g id="id">volume</xliff:g></item>
       <item><xliff:g id="id">wifi</xliff:g></item>
       <item><xliff:g id="id">cdma_eri</xliff:g></item>

添加耳机:

<item><xliff:g id="id">head_set</xliff:g></item>

在PhoneStatusBarPolicy.java的构造方法中注册广播,监听耳机插入。

        //添加耳机监听广播
filter.addAction(Intent.ACTION_HEADSET_PLUG);

mIntentReceiver广播中添加对耳机逻辑处理。

 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
....
//耳机添加在这里
            else if(action.equals(Intent.ACTION_HEADSET_PLUG)){
                
                android.util.Log.e("for test>>>>>>>>>>","head_set_in>>>>>>>>") ;
                //updateHeadSet(intent) ;
            }
        }
    };

    //插入耳机
    private final void updateHeadSet(Intent intent){

        int state = intent.getIntExtra("state",0) ;
        int micPhone = intent.getIntExtra("micphone",1) ;
        switch(state){

        case 0:
            mService.setIcon("head_set", R.drawable.head_set_plugg_out, 0, null);//耳机拔出不设置任何图标
            mService.setIconVisibility("head_set",false) ;
        break ;
        case 1:

        if(micPhone==1){
            mService.setIcon("head_set", R.drawable.head_set_without_micphone_icon, 0, mContext.getString(R.string.head_set_without_micphone));
            mService.setIconVisibility("head_set",true) ;
        else
            mService.setIcon("head_set", R.drawable.head_set_micphone_icon, 0, mContext.getString(R.string.head_set_with_micphone);
            mService.setIconVisibility("head_set",true) ;
        }

        break ;
        }

    }


你可能感兴趣的:(Android开发,frameworks)