很多时候我们在框架需要知道内核中某些事件的状态,用设备的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事件才行,所以改动分为内核和上层两部分。

A,内核摄像头驱动中的改动:

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";elseenvp[0] = "STATUS=CLOSE";envp[1] = NULL;kobject_uevent_env(&sensor_device->kobj, KOBJ_CHANGE, envp); //将evnp通过kobject上报return;
}

在打开摄像头和关闭摄像头的函数中,成功打开和成功关闭的位置都要放置set_camera_status函数。

B,上层某个服务中的改动:

导入类:

import android.os.UEventObserver;  (系统接口,需要引用 framwork.jar 包)

在服务的onCreate函数中启动UEventObserver,启动的路径要根据uevent规则来匹配,具体要去目录下寻找:

m_CameraStatusObserver.startObserving("DEVPATH=/devices/virtual/sensordrv/kd_camera_hw");

UEventObserver型变量的创建:

 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函数中加上停止监听:

m_CameraStatusObserver.stopObserving();

这样就完成了上层对底层设备状态的响应处理。

(3)关于udev路径

举一个碰到的例子,misc设备

static struct miscdevice vechile_dev = {
    .minor        = MISC_DYNAMIC_MINOR,
    .name        = "vehicle",
    .fops          = &vechile_fops,
};

上层监控路径 
auxObserver.startObserving("DEVPATH=/devices/virtual/misc/vehicle");

文件转载:

用Android UEventObserver监听内核uevent

android 应用使用 UEventObserver监听内核uevent 事件相关推荐

  1. 用Android UEventObserver监听内核uevent

    很多时候我们在框架需要知道内核中某些事件的状态,用设备的show属性是可以供上层来查询,但是这需要上层设定一个较耗资源的循环.如果用UEventObserver就可以监听内核event,它是andro ...

  2. 用Android UEventObserver监听内核event

    很多时候我们在框架上层需要知道内核中某些事件的状态,用设备的show属性是可以供上层来查询,但是这需要上层设定一个较耗资源的循环.如果用UEventObserver就可以监听内核event,它是and ...

  3. Android通过使用系统广播监听网络状态的改变

    Android通过使用广播监听网络状态的改变 得先添加权限 //查看网络状态<uses-permission android:name="android.permission.ACCE ...

  4. android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件

    Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...

  5. Android锁屏界面监听按键,Android 监听锁屏/开屏事件

    1. 两种方案 (1) 监听BroadcastReceiver (2)获取PowerManager事件 2.  BroadcastReceiver 2.1. 事件 总共有3个事件: Intent.AC ...

  6. Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果 转:http://blog.csdn.net/xiaanming/article/details/17374599 很荣 ...

  7. Android系统截屏监听工具

    Android系统截屏监听工具 做系统截屏通知的时候,找了很多资料,测试后发现要做挺多机型适配的,而且有时候会没有监听到,有时候又监听到多次,不能实现想要的效果.一下是最终的解决方案,已在足够多的手机 ...

  8. Android的Menu键监听

    Android的Menu键监听 其实想实现的目的很简单,按下Menu键的时候,在Activity中把一个值设置成true,同时弹出菜单,菜单消失的时候再把这个值设成false.搞来一个多小时,其实很简 ...

  9. Android EditText缴获与监听输入事件

    Android EditText缴获与监听输入事件 Android EditText截获与监听输入事件 预期目标:如下图,输入框中每输入一个字符,下面的TextView可以迅速的显示出来输入框中的内容 ...

最新文章

  1. 归并排序树状数组求逆序数
  2. python基础学习语法和函数
  3. 基于docker部署的微服务架构(四): 配置中心
  4. tensorflow-计算图
  5. C#排队处理DEMO
  6. python标准数据库接口是_Python 数据库接口模块_python 数据库模块_python 数据库接口...
  7. 推荐系统在滴滴司机调度系统中的应用实践
  8. ubuntu sun-jdk
  9. 【Yarn】工作机制及任务提交流程
  10. Spring与Struts2的整合
  11. JS中 post和get的区别
  12. mongodb 备份 导入导出
  13. 小程序发布上线全流程(包含小程序怎么通过审核)
  14. 认识COFF文件格式
  15. 华为最强科普:什么是DSP?
  16. 武汉市计算机学校报名条件,自主招生报名条件
  17. 「网络流 24 题」火星探险问题。
  18. 瑞芯微(RKDocs)平台技术开发资料汇总(rk3188,rk3066,RK3128,rk3288)
  19. 决策树:ID3C4.5cart算法(从原理到实现-小白教程超详细)
  20. 联网报警器红外探头的工作原理

热门文章

  1. 短视频配音软件哪些好用?大家都在用的短视频配音软件
  2. Win10重置网络后,无法连接网络怎么恢复
  3. 用Python画朵菊花
  4. 无货源创业者经验之谈:如何做好抖音小店无货源,店群这条路对不对?
  5. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十七 ║Vue基础:使用Vue.js 来画博客首页(一)...
  6. 从傅立叶级数到傅立叶变换
  7. OpenCasCade拓扑几何的布尔运算
  8. 在博客园给自己的博客加入看板娘
  9. [CodeX] 输入文本即可生成代码
  10. 【Xmanager】Xbrowser-Xstart远程访问RHEL5.3配置