用Android UEventObserver监听内核event
很多時候我們在框架上層需要知道內核中某些事件的狀態,用設備的show屬性是可以供上層來查詢,但是這需要上層設定一個較耗資源的循環。如果用UEventObserver就可以監聽內核event,它是android Java層利用uevent與獲取Kernel層狀態變化的機制。
(1)UEventObserver簡介
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)
核心響應函數是:繼承UEventObserver的類必須實現自己的public abstract void onUEvent(UEvent event),在這里面進行獲取狀態后的處理。
(2)實例,在上層服務中監聽攝像頭的打開和關閉,并作相應處理。需要內核攝像頭驅動中也要發出event事件才行,所以改動分為內核和上層兩部分。
[cpp] view plaincopy
static atomic_t g_CamHWOpend; //camera是否打開成功的標志
struct device* sensor_device = NULL;
static void set_camera_status()
{
char *envp[2];
int ret = atomic_read(&g_CamHWOpend)? 1 : 0;
if(ret)
envp[0] = “STATUS=OPEN”;
else
envp[0] = “STATUS=CLOSE”;
envp[1] = NULL;
kobject_uevent_env(&sensor_device->kobj, KOBJ_CHANGE, envp); //將evnp通過kobject上報
return;
}
在打開攝像頭和關閉攝像頭的函數中,成功打開和成功關閉的位置都要放置set_camera_status函數。
導入類:
[java] view plaincopy
import android.os.UEventObserver;
在服務的onCreate函數中啟動UEventObserver,啟動的路徑要根據uevent規則來匹配,具體要去目錄下尋找:
[java] view plaincopy
m_CameraStatusObserver.startObserving(“DEVPATH=/devices/virtual/sensordrv/kd_camera_hw”);
UEventObserver型變量的創建:
[java] view plaincopy
private UEventObserver m_CameraStatusObserver = new UEventObserver(){
public void onUEvent(UEvent event){ //完成抽象的核心響應函數
String status = event.get(“STATUS”); //沒有取特定長度字符串,直接取=前面的子串
Log.i(TAG,”camera app operation and mCameraOpenInSS is “+mCameraOpenInSS);
if( “OPEN”.equals(status)){
Log.i(TAG,”camera app open”);
//如果打開攝像頭做。。處理
}
else if (“CLOSE”.equals(status)){
Log.i(TAG,”camera app close”);
//如果關閉攝像頭做。。處理
}
}
};
在服務的onDestroy函數中加上停止監聽:
[java] view plaincopy
m_CameraStatusObserver.stopObserving();
這樣就完成了上層對底層設備狀態的響應處理。
參考原文:參考原文:http://blog.csdn.net/darkengine/article/details/7442359
總結
以上是生活随笔為你收集整理的用Android UEventObserver监听内核event的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP操作文件的常用函数
- 下一篇: linux 源码阅读网站