Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1300292
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: Android平台

2013-05-17 15:00:34

首先,简要的介绍一下按键的处理流程。先简单的分为两大类:一类是虚拟按键。另一类是物理按键。

无论是虚拟按键还是物理按键都是要经过驱动层注册为输入设备,然后上报到kernel/drivers/input/input.c中。这里有相关 函数的定义。然后通过、sys上报到frameworks/services/input/EventHub.cpp中,在这里会对设备进行扫描并且判断 是哪种设备,然后在InputReader.cpp中对原始数据进行读取。在framewoks/services/input /InputDispatcher.cpp中实现数据的派发。在framework/base/core/jni/_view_KeyEvent.cpp中实现通过JNI机制向上层的KeyEvent.java提供数据。并且在frameworks/base/core/java/android/view/KeyEvent.java中向上层的APP开发人员提供接口。

普通按键盘流程

HAL层

./hardware/libhardware_legacy/power/power.c

set_screen_state(int on)

hal层按键休眠和唤醒

JNI层

frameworks/base/core/jni/android_os_Power.cpp

static int
setScreenState(JNIEnv *env, jobject clazz, jboolean on)
{
    return set_screen_state(on);
}

JAVA层

frameworks/base/core/java/android/os/Power.java

public static native int setScreenState(boolean on);

frameworks/base/services/java/com/android/server/PowerManagerService.java

为APP层提供以下接口

public void goToSleep(long time)==》public void goToSleepWithReason(long time, int reason)==》private void goToSleepLocked(long time, int reason)==》private void setPowerState(int state)==》

阅读(1421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~