[学习记录]Android4.0耳机插入广播发送流程分析
2013-12-25 18:03
501 查看
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
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
相关文章推荐
- [学习记录]Android4.0耳机插入广播发送流程分析
- Android4.1.2 耳机插入拔出通知流程分析
- Android4.1.2 耳机插入拔出通知流程分析
- [Android][KK][SMS]Frameworks学习——发送短信流程分析
- Android广播管理三--广播发送(sendBroadcast)流程分析
- Android源码学习笔记1-短信发送流程分析
- [学习记录]android 检测耳机是否插入
- Android 4.0按键事件以及电源管理流程分析
- Android 4.0 Launcher2源码分析——Workspace切换AllApps流程
- android中Mms学习笔记——信息发送流程(一)
- Android应用程序发送广播(sendBroadcast)的过程分析
- (转)android 4.0 蓝牙服务开启流程分析
- android 4.4的耳机插入检测流程
- Android应用程序发送广播(sendBroadcast)的过程分析
- Android 4.0 Launcher2源码分析——Workspace切换AllApps流程
- android安全问题(七) 抢先接收广播 - 内因篇之广播发送流程
- Android广播发送过程分析
- Android 4.0 Launcher2源码分析——Workspace切换AllApps流程
- Android学习总结(六)———— 发送自定义广播
- android 学习receiver和发送广播,其中监听其他activity的启动demo;给activity加自定义权限只有指定有权限的app可以监听到