Android UEventObserver
来源:互联网 发布:雅思网络课程下载 编辑:程序博客网 时间:2024/05/16 16:23
http://blog.csdn.net/darkengine/article/details/7442359
UEventObserver是android Java层利用uevent与获取Kernel层状态变化的机制。
通过grep发现framework有如下模块使用UEventObserver的功能来提供服务:
电池状态:services/java/com/android/server/BatteryService.java
耳机状态:services/java/com/android/server/HeadsetObserver.java
DOCK状态:services/java/com/android/server/DockObserver.java
USB状态:services/java/com/android/server/usb/UsbService.java
它们全部继承自UEventObserver,先看看这个类的构造和原理:
./core/java/android/os/UEventObserver.java
|
[ native_setup(), next_event() ]
\|/
./core/jni/android_os_UEventObserver.cpp
|
[ uevent_init(),uevent_next_event() ]
\|/
/hardware/libhardware_legacy/uevent/uevent.c
| [userspace]
---------------------[socket]-----------------------------------------------------------------------------
|
\|/ [kernel]
socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT)
下面用HeadsetObserver作为例子说明如何使用UEventObserver来监听kernel的uevent。
继承UEventObserver的类必须实现自己的public abstract void onUEvent(UEvent event):
- @Override
- public void onUEvent(UEventObserver.UEvent event) {
- if (LOG) Slog.v(TAG, "Headset UEVENT: " + event.toString());
- try {
- update(event.get("SWITCH_NAME"), Integer.parseInt(event.get("SWITCH_STATE"))); // update中处理事务
- } catch (NumberFormatException e) {
- Slog.e(TAG, "Could not parse switch state from event " + event);
- }
- }
这个函数会在UEventObserver接收到event的时候由UEventObserver来回调,HeadsetObserver使用startObserving("DEVPATH=/devices/virtual/switch/h2w")来开始监听,这个API会确保sThread已经运行并且以字串参数作为匹配参数增加一个observer:
public final synchronized void startObserving(String match) {
ensureThreadStarted();
sThread.addObserver(match, this);
}
ensureThreadStarted();
sThread.addObserver(match, this);
}
UEventObserver的核心部分就是sThread的run:
- public void run() {
- native_setup(); //调用uevent.c中的API来打开socket
- byte[] buffer = new byte[1024];
- int len;
- while (true) {
- len = next_event(buffer); // 在uevent.c中用poll调用来获取event,会阻塞
- if (len > 0) {
- String bufferStr = new String(buffer, 0, len); // easier to search a String
- synchronized (mObservers) {
- for (int i = 0; i < mObservers.size(); i += 2) {
- if (bufferStr.indexOf((String)mObservers.get(i)) != -1) { // 找到匹配的match参数,说明某个observer的监听的event发生了
- ((UEventObserver)mObservers.get(i+1))
- .onUEvent(new UEvent(bufferStr)); // 调用这个observer的onUEvent函数
- }
- }
- }
- }
- }
- }
- Android UEventObserver
- Android UEventObserver
- Android UEventObserver
- Android UEventObserver
- android UEventObserver
- Android UEventObserver
- android UEventObserver的用法
- Android UEventObserver 使用
- android UEventObserver的用法
- android之UEventObserver分析
- Android uevent监控 UEventObserver
- android UEventObserver的用法
- Android uevent监控 UEventObserver
- 用Android UEventObserver监听内核uevent
- 用Android UEventObserver监听内核event
- 用Android UEventObserver监听内核event
- 用Android UEventObserver监听内核event
- android之UEventObserver分析和用法
- android input system(frameworks) analysis -- InputManager (2)
- (Android) MediaPlayer Example
- hdu-人见人爱A+B
- 【读书笔记】SQL必知必会
- Android 在XML中引用系统资源方法
- Android UEventObserver
- HttpClient的例子
- 【读书笔记】编程大师访谈录
- 【读书笔记】程序员修炼之道
- tk2d的摄像头和tilemap研究
- Web开发人员推荐12款优秀的 Twitter Bootstrap 组件和工具
- 使用Curl进行抓取远程内容时url中文编码问题
- 应用程序与TCP/IP协议栈之间的关联
- 【读书笔记】软件随想录