[学习记录]Android4.0耳机插入广播发送流程分析

来源:互联网 发布:军事题材电视剧知乎 编辑:程序博客网 时间:2024/05/13 12:08
                          Android4.0耳机插入广播发送流程分析
1.    相关文件
a.    frameworks/base/services/java/com/android/server/SystemServer.java
启动线程时新建WiredAccessoryObserver对象
b.    framework/base/services/java/com/android/server/WiredAccessoryObserver.java
类WiredAccessoryObserver继承UeventObserver,处理耳机状态等
c.    framework/base/core/java/android/os/UEventObserver.java
   UEventObserver是Android Java层利用uevent获取Kernel层状态变化的机制
UEventObserver接收kernel的uevent信息的抽象类。
类UEventObserver提供了三个方法给子类来调用:
1、    onUEvent(UEvent>        thr.setName("android.server.ServerThread");
        thr.start();
     }
}
init1 将会调用到>    thr.setName("android.server.ServerThread");
    thr.start();
下面来看下ServerThread中做了哪些操作
class ServerThread>private static final String uEventInfo[][] = {   
{ "DEVPATH=/devices/virtual/switch/h2w","/sys/class/switch/h2w/state",
"/sys/class/switch/h2w/name"},
{ "DEVPATH=/devices/virtual/switch/usb_audio",
"/sys/class/switch/usb_audio/state",
"/sys/class/switch/usb_audio/name"},
{ "DEVPATH=/devices/virtual/switch/hdmi","/sys/class/switch/hdmi/state",
"/sys/class/switch/hdmi/name"}
};

public  WiredAccessoryObserver(Context>        ………    
       >            startObserving(uEventInfo[i][0]);
        }
}
}
在 WiredAccessoryObserver 的构造函数中注册开机完成广播,在BootCompletedReceiver接收器中循环检测数组uEventInfo,其中uEventInfo[0][0](即为DEVPATH=/devices/virtual/switch/h2w 为耳机设备路径),我们来看下函数>        
        UEventThread() {
           >            int len;
           >                if (len > 0) {
                    String>                    synchronized (mObservers) {
                       >                        // 找到匹配的match参数,说明某个observer的监听的event发生了    
                           >                                    ((UEventObserver)mObservers.get(i+1))
                                        .onUEvent(new UEvent(bufferStr));
                            }
                        }
                    }
                }
            }
        }

    public>            int state = Integer.parseInt(event.get("SWITCH_STATE"));
              //此处调用>                                             BIT_USB_HEADSET_DGTL)) |
                            ((state == 1) ? BIT_HEADSET :
                                          ((state == 2) ? BIT_HEADSET_NO_MIC : 0)));
        }
         //此处调用>        int newOrOld = headsetState | mHeadsetState;
       >        int usb_headset_anlg = headsetState & BIT_USB_HEADSET_ANLG;
       >     
       >        int h2w_state   = (headsetState & (BIT_HEADSET | BIT_HEADSET_NO_MIC));
       >       
       >      
       >            Log.e(TAG, "unsetting h2w flag");
           >        }
    
       >        mPrevHeadsetState = mHeadsetState;
       >
       >            Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
           >        } else {
            // Insert>            }
        }
       >        @Override
       >        //for 循环有疑问
       //>       //int BIT_HEADSET_NO_MIC = (1 << 1);…
       // BIT_USB_HEADSET_ANLG
       // BIT_USB_HEADSET_DGTL
       //>(BIT_HEADSET|
BIT_HEADSET_NO_MIC|
                 BIT_USB_HEADSET_ANLG|
BIT_USB_HEADSET_DGTL|
                          BIT_HDMI_AUDIO);
       >            if ((curHeadset & allHeadsets) != 0) {
               >            }
        }
    }
//此处填充 Intent , 并通过 ActivityManagerNative.broadcastStickyIntent来发送
private>
           >            if ((headsetState & headset) != 0) {
               >            }

           >
                //  Pack>                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
                //int>                int microphone = 0;

               >                    microphone = 1;
                }

               >            "android.intent.action.HEADSET_PLUG";

    /**
     * Broadcast Action: An>            "android.intent.action.USB_ANLG_HEADSET_PLUG";

    /**
     * Broadcast Action: A>            "android.intent.action.USB_DGTL_HEADSET_PLUG";


参考资料:
http://blog.csdn.net/tanxs001/article/details/7709208
http://blog.sina.com.cn/s/blog_40d475e901012jxh.html
http://blog.csdn.net/darkengine/article/details/7442359
0 0