日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用程序键盘(Keyboard)消息处理机制分析(26)

發(fā)布時間:2024/4/15 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用程序键盘(Keyboard)消息处理机制分析(26) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ?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)容還不錯,歡迎將生活随笔推薦給好友。