? ?Step 7.?LocalWindowManager.removeViewImmediate
?? ? ? ?這個函數(shù)定義在frameworks/base/core/java/android/view/Window.java文件中:
public?abstract?class?Window?{??????......????????private?class?LocalWindowManager?implements?WindowManager?{??????????......????????????public?final?void?removeViewImmediate(View?view)?{??????????????mWindowManager.removeViewImmediate(view);??????????}????????????......????????????private?final?WindowManager?mWindowManager;??????}????????......??}?? ?? ? ? ?LocalWindowManager類的成員變量mWindowManager是一個WndowManagerImpl對象,這個函數(shù)只是簡單地調(diào)用WndowManagerImpl類的removeViewImmediate來進一步處理。
?
?? ? ? Step 8.?WndowManagerImpl.removeViewImmediate
?? ? ? 這個函數(shù)定義在frameworks/base/core/java/android/view/WindowManagerImpl.java文件中:
public?class?WindowManagerImpl?implements?WindowManager?{??????......????????public?void?removeViewImmediate(View?view)?{??????????synchronized?(this)?{??????????????int?index?=?findViewLocked(view,?true);??????????????ViewRoot?root?=?mRoots[index];??????????????......????????????????root.die(true);????????????????????????????......??????????}??????}????????......??}?? ?? ? ? ? 這個函數(shù)首先是找到這個view所屬的ViewRoot對象root,然后調(diào)用這個root對象的die函數(shù)來銷毀它。
?
?? ? ? ? Step 9. ViewRoot.die
?? ? ? ? 這個函數(shù)定義在frameworks/base/core/java/android/view/ViewRoot.java文件中:
public?final?class?ViewRoot?extends?Handler?implements?ViewParent,??????????View.AttachInfo.Callbacks?{??????......????????public?void?die(boolean?immediate)?{??????????if?(immediate)?{??????????????doDie();??????????}?else?{??????????????......??????????}??????}????????????......??}?? ?? ? ? ?上面Step 8傳進來的immediate參數(shù)為true,因此,這里直接調(diào)用doDie函數(shù)來進一步處理。
?
?? ? ? ?Step 10.?ViewRoot.doDie
?? ? ? ?這個函數(shù)定義在frameworks/base/core/java/android/view/ViewRoot.java文件中:
public?final?class?ViewRoot?extends?Handler?implements?ViewParent,??????????View.AttachInfo.Callbacks?{??????......????????void?doDie()?{??????????......????????????synchronized?(this)?{??????????????......????????????????if?(mAdded)?{??????????????????mAdded?=?false;??????????????????dispatchDetachedFromWindow();??????????????}??????????}??????}????????????......??}?? ?? ? ? ?當我們把Activity窗口中的View添加到一個ViewRoot對象時,就會把它的成員變量mAdded設(shè)置為true,這樣就表示這個ViewRoot中有View存在,于是,這里就會調(diào)用dispatchDetachedFromWindow函數(shù)來進一步處理。
?
?? ? ? ?Step 11.?ViewRoot.ispatchDetachedFromWindow
?? ? ? ?這個函數(shù)定義在frameworks/base/core/java/android/view/ViewRoot.java文件中:
public?final?class?ViewRoot?extends?Handler?implements?ViewParent,??????????View.AttachInfo.Callbacks?{??????......????????void?dispatchDetachedFromWindow()?{??????????......????????????if?(mInputChannel?!=?null)?{??????????????if?(mInputQueueCallback?!=?null)?{??????????????????......??????????????}?else?{??????????????????InputQueue.unregisterInputChannel(mInputChannel);??????????????}??????????}????????????try?{??????????????sWindowSession.remove(mWindow);??????????}?catch?(RemoteException?e)?{??????????}????????????......??????}????????......??}?? ?? ? ? ?前面在介紹應(yīng)用程序注冊鍵盤消息接收通道的過程時,在Step 18,我們說到,ViewRoot類中的mInputQueueCallback為null,表示由這個ViewRoot自己來管理鍵盤輸入事件,因此,這里首先會調(diào)用InputQueue的unregisterInputChannel函數(shù)來注銷注冊在應(yīng)用程序這一側(cè)的Client端InputChannel,然后再調(diào)用sWindowSession的remove函數(shù)來注銷注冊在InputManager這一側(cè)的Server端InputChannel,這個邏輯是和前面介紹應(yīng)用程序注冊鍵盤消息接收通道的邏輯相對應(yīng)的,前面分別注冊了這兩個InputChannel,現(xiàn)在Activity要銷毀了,當然就要把它們注銷了。
?? ? ? ?我們先來看注銷注冊在應(yīng)用程序這一側(cè)的Client端InputChannel,然后再回過頭來分析注銷注冊在InputManager這一側(cè)的Server端InputChannel。
?? ? ? ?Step 12.?InputQueue.unregisterInputChannel
?? ? ? ?這個函數(shù)定義在frameworks/base/core/java/android/view/InputQueue.java文件中:
public?final?class?InputQueue?{??????......????????public?static?void?unregisterInputChannel(InputChannel?inputChannel)?{??????????......????????????synchronized?(sLock)?{??????????????......????????????????nativeUnregisterInputChannel(inputChannel);??????????}??????}????????......??}?? ?? ? ? ? 這個函數(shù)只是簡單地調(diào)用本地方法nativeUnregisterInputChannel來執(zhí)行具體的操作。
?
?? ? ? ? Step 13.?InputQueue.nativeUnregisterInputChannel
?? ? ? ? 這個函數(shù)定義在frameworks/base/core/jni/android_view_InputQueue.cpp文件中:
static?void?android_view_InputQueue_nativeUnregisterInputChannel(JNIEnv*?env,?jclass?clazz,??????????jobject?inputChannelObj)?{??????status_t?status?=?gNativeInputQueue.unregisterInputChannel(env,?inputChannelObj);????????......??}?? ?? ? ? ?這里調(diào)用NativeInputQueue的成員函數(shù)unregisterInputChannel來進一步處理。
?
?
總結(jié)
以上是生活随笔為你收集整理的Android应用程序键盘(Keyboard)消息处理机制分析(26)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。