屬於 SystemServer 的一部分。
SystemServer 在 JNI_OnLoad 時, 就會call NativeInputManager 的 一堆 initital, start, register function .
nativeInit
NativeInputManager 物件生成時,會 new 一個 EventHub 物件,並且傳入 InputManager 的生成function 中。(同時也把自己 NativeInputManager 當作參數傳入)
eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);
nativeStart
就是開始執行 InputManager 的 Thread:
gNativeInputManager->getInputManger()->start();
所以實際的 Thread 是 InputManager( ) 的 Thread.
-- 跳 N 步 --
這個 Thread 執行的 code 就是:
void InputReader::loopOnce(){
mEventHub->getEvent(& rawEvent);
process(& rawEvent);
}
process 就會找到 event 來自 KeyboardInputMapper Device,請他 run process就是 processKey( ),
然後就是getDispatcher, notifyKey
mPolicy, interceptKeyBeforeQueueing
mPolicy 是在 InputDispatcher( ) 生成時,傳入的 InputDispatcherPolicyInterface 參數物件。
也就是當初傳入 InputManager 生成函數 的 NativeInputManager 物件 (他有繼承 InputDispatcherPolicyInterface).
所以由 inputReader 的 Thread 由 EventHub 取得 linux kernel input 的資料,
一路交給 NativeInputManager 的 interceptKeyBeforeQueueing( ) 來處理。
這一整段,都沒有用到 java code
在 NativeInputManager 的 interceptKeyBeforeQueueing( ) 裡面,才有用 java call back function 去 call InputManager.java 的 function.
那個 power key 的處理,就是在 NativeInputManager 的 interceptKeyBeforeQueueing( ) 處理的。
他先把 key 交給 java 的 ..
pwrkey_event_handler_Keyup
D/InputReader( 2240): loopOnce
D/InputReader( 2240): consumeEvent
D/InputReader( 2240): process
D/InputReader( 2240): processKey
D/InputDispatcher( 2240): notifyKey
D/InputManager-JNI( 2240): interceptKeyBeforeQueueing -- about to call callback function
W/System.err( 2240): java.lang.Throwable: stack dump
W/System.err( 2240): at java.lang.Thread.dumpStack(Thread.java:577)
W/System.err( 2240): at com.android.internal.policy.impl.PhoneWindowManager.interceptKeyBeforeQueueing(PhoneWindowManager.java:1868)
W/System.err( 2240): at com.android.server.WindowManagerService$InputMonitor.interceptKeyBeforeQueueing(WindowManagerService.java:5324)
W/System.err( 2240): at com.android.server.InputManager$Callbacks.interceptKeyBeforeQueueing(InputManager.java:385)
W/System.err( 2240): at dalvik.system.NativeStart.run(Native Method)
D/InputManager-JNI( 2240): interceptKeyBeforeQueueing WM_ACTION_GO_TO_SLEEP
D/PowerManagerService-JNI( 2240): android_server_PowerManagerService_goToSleep
request_suspend_state: mem (0->3) at 81038317625 (1970-01-02 07:31:38.609208250 UTC)
mxc_ipu mxc_ipu: Channel already disabled 10
mxc_ipu mxc_ipu: Channel already uninitialized 10
I/power ( 2240): *** set_screen_state 0
D/SurfaceFlinger( 2240): About to give-up screen, flinger = 0x1dfb38
PM: Syncing filesystems ... done.
PhoneWindowManager.java 在return 一個包含 ACTION_GO_TO_SLEEP 的 flag.然後 NativeInputManager.c 處理這個 flag, call android_server_PowerManagerService_goToSleep
沒有留言:
張貼留言