上一篇博客笔记,记录了耳机相关的流程源码跟踪。其中有一个点就是,市场上一般的android 手机,当我们插上耳机之后在StatusBar里面,会显示耳机图标,耳机分带micphone和不带micphone的耳机,此时显示的图标也会不一样。
因此,这里以耳机图标显示来跟踪梳理一下,statusbar里面图标的显示流程。耳机图标显示流程和闹钟,震动,sim卡等图标的显示差不多。主要涉及的几个类文件:StatusBarManager.java
StatusBarManagerService.java
PhoneStatusBarPolicy.java
StatusBar.java
StatusBarIconList.java
StatusBarIcon.java
他们之间的关系大致可以用下面这个图简单描述一下。
在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);
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 ; } }