Android UEventObserver


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):

  1. @Override  
  2. public void onUEvent(UEventObserver.UEvent event) {  
  3.     if (LOG) Slog.v(TAG, "Headset UEVENT: " + event.toString());  
  4.   
  5.     try {  
  6.         update(event.get("SWITCH_NAME"), Integer.parseInt(event.get("SWITCH_STATE"))); // update中处理事务   
  7.     } catch (NumberFormatException e) {  
  8.         Slog.e(TAG, "Could not parse switch state from event " + event);  
  9.     }  
  10. }  

这个函数会在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);
    }

  • 1
  • 2
  • 下一页

相关内容