首先,簡要的介紹一下按鍵的處理流程。先簡單的分為兩大類:一類是虛擬按鍵。另一類是物理按鍵。
無論是虛擬按鍵還是物理按鍵都是要經過驅動層注冊為輸入設備,然後上報到kernel/drivers/input/input.c中。這裡有相關函數的定義。然後通過、sys上報到frameworks/services/input/EventHub.cpp中,在這裡會對設備進行掃描並且判斷是哪種設備,然後在InputReader.cpp中對原始數據進行讀取。在framewoks/services/input/InputDispatcher.cpp中實現數據的派發。在framework/base/core/jni/Android_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)==》
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11