歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android UEventObserver

Android UEventObserver

日期:2017/3/1 10:19:04   编辑:Linux編程

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. try {
  5. update(event.get("SWITCH_NAME"), Integer.parseInt(event.get("SWITCH_STATE"))); // update中處理事務
  6. } catch (NumberFormatException e) {
  7. Slog.e(TAG, "Could not parse switch state from event " + event);
  8. }
  9. }

這個函數會在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);
}

Copyright © Linux教程網 All Rights Reserved