中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

泉州做網(wǎng)站設(shè)計公司東莞網(wǎng)站建設(shè)平臺

泉州做網(wǎng)站設(shè)計公司,東莞網(wǎng)站建設(shè)平臺,專門做外鏈的網(wǎng)站,wordpress 批量導入文章目錄 簡介 Insets管理架構(gòu) Insets相關(guān)類圖 app側(cè)的類 WMS側(cè)的類 inset show的流程 接口 流程 WMS側(cè)確定InsetsSourceControl的流程 兩個問題 窗口顯示時不改變現(xiàn)有的inset狀態(tài) 全屏窗口上的dialog 不顯示statusbar問題 View 和 DecorView 設(shè)置insets信息 輸入法顯…

目錄

簡介

Insets管理架構(gòu)

Insets相關(guān)類圖

app側(cè)的類

WMS側(cè)的類

inset show的流程

接口

流程

WMS側(cè)確定InsetsSourceControl的流程

兩個問題

窗口顯示時不改變現(xiàn)有的inset狀態(tài)

全屏窗口上的dialog?不顯示statusbar問題

View 和 DecorView 設(shè)置insets信息

輸入法顯示流程

1. 在某個app側(cè)點擊編輯框

2.輸入法app接收到顯示輸入法消息

3.InputMethodManagerService接收到輸入法app的顯示狀態(tài)信息

4.輸入法窗口接收到showInsets@IWindow?

監(jiān)聽inset 變化

設(shè)置Insetscontroller變化監(jiān)聽

應用WindowInsets變化


簡介

android 11上新增一套inset管理方法。

Insets 是指系統(tǒng)邊襯區(qū)的窗口, 包括statusbar, navigation bar, 輸入法等, 都在insets管理中。下面說的這些insets即為這些窗口。?

通過insets相關(guān)的接口, app可以控制insets窗口的顯示, 隱藏, 沉浸式等。

inset 最基本的控制是show 和hide。 在inset 不同的狀態(tài)下, 應用區(qū)的位置也會發(fā)生變化, 這部分的計算也是inset控制的重要內(nèi)容之一。??

insets完整的實現(xiàn)邏輯, 包含app端和服務端,服務端主要是WMS(window manager service)。 本文梳理insets的管理架構(gòu)和主要邏輯, 如show insets 等。

下面為dump 出來的insets信息, 使用命令adb shell dumpsys window。?InsetsState 是系統(tǒng)當前所有inset狀態(tài)的集合,InsetsSource 對應每一個inset, 包括type, frame, visible項:?

?InsetsState
? ? ? InsetsSource type=ITYPE_STATUS_BAR frame=[0,0][2776,130] visible=false
? ? ? InsetsSource type=ITYPE_NAVIGATION_BAR frame=[0,0][744,1022] visible=false
? ? ? InsetsSource type=ITYPE_TOP_GESTURES frame=[0,0][2776,130] visible=true
? ? ? InsetsSource type=ITYPE_BOTTOM_GESTURES frame=[0,1017][744,1022] visible=true
? ? ? InsetsSource type=ITYPE_LEFT_GESTURES frame=[0,0][0,1022] visible=true
? ? ? InsetsSource type=ITYPE_RIGHT_GESTURES frame=[2776,0][2776,1022] visible=true
? ? ? InsetsSource type=ITYPE_TOP_TAPPABLE_ELEMENT frame=[0,0][2776,130] visible=true
? ? ? InsetsSource type=ITYPE_BOTTOM_TAPPABLE_ELEMENT frame=[0,1017][744,1022] visible=true
? ? ? InsetsSource type=ITYPE_IME frame=[0,0][0,0] visible=false

Insets管理架構(gòu)

Insets相關(guān)類圖

分為app側(cè)和系統(tǒng)服務側(cè)(wms)側(cè)。?

app側(cè)的類

  • InsetsState:? 為Parceble, 在wms和app中互相傳遞。其中記錄了所有系統(tǒng)Insets的InsetsSource。每個InsetsSource描述了Insets的狀態(tài)。?可以參看簡介中dump信息
  • InsetsSource: 為Parceble, 記錄一個inset是否顯示及frame??梢詤⒖春喗橹衐ump信息。
  • ?InsetsSourceControl :為Parceble。 ?InsetsSourceControl 與某一個insets窗口對應, 可以通過其控制inset show 和hide。app持有相應inset的InsetsSourceControl ,就可以控制該inset的顯示和隱藏,如果不持有某個類型的InsetsSourceControl, 就不能控制該類型的inset的顯示和隱藏。??其中mLeash 為surfaceControl, 可由InsetsAnimationControlImpl獲取并交給SyncRtSurfaceTransactionApplier 控制動畫進度,如surface位置, 隱藏,顯示等。app持有哪些inset的InsetsSourceControl,有wms確定并在ddWindow()和?relayoutWindow()時傳回給app。

?app側(cè)持有的InsetsSourceControl來自于添加窗口時 addWindow()和?relayoutWindow()時傳回的 mTempControls。 實測?addWindow時mTempControls傳回值為null. 在relayoutWindow 時傳回mTempControls為實際值。WMS在在relayout 過程中, 會尋找inset 的target 窗口, 通過addToControlMaps@?InsetsStateController.java為該類型的窗口添加target, 然后在 relayoutWindow()中通過調(diào)用win.getDisplayContent().getInsetsStateController().getControlsForDispatch(win); 獲取該win的InsetsSourceControl 傳回給app端的mTempControls。

ViewRootImp.setView()-->addWindow(...mTempControls) //獲得mTempControlsmInsetsController.onControlsChanged(mTempControls)-->consumer.setControl(control, showTypes, hideTypes);
  • InsetsController: 每個窗口對應一個InsetController。 為app端控制inset顯示,隱藏, 更新狀態(tài),動畫的總調(diào)度, 包含 InsetsSourceConsumer map 和 ViewRootInsetsControllerHost。每種insets類型對應一個InsetsSourceConsumer。InsetsController在ViewRootImpl初始化時創(chuàng)建。
創(chuàng)建InsetsController?stack, 從下向上at android.view.InsetsController.<init>(InsetsController.java:525)at android.view.ViewRootImpl.<init>(ViewRootImpl.java:768)at android.view.ViewRootImpl.<init>(ViewRootImpl.java:720)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:401)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109)
  • InsetsSourceConsumer: 中記錄了InsetState(從wms傳入)及InsetsSourceControl。?InsetsSourceControl來自wms中傳入, 具體參看InsetsSourceControl說明。?
  • PendingInsetsController:為窗口被加入到wms之前記錄APP要求的狀態(tài), 在ViewRootImpl.setview時調(diào)用mWindowSession.addToDisplayAsUser之后被同步到InsetsController中。?

WMS側(cè)的類

  • InsetsStateController: 控制全局整體inset狀態(tài)。

?mProviders為insets的provider的集合。

mTypeControlTargetMap為可以控制每種Insets(如顯示或隱藏)的窗口的集合。

mState為InsetsState,?當前系統(tǒng)所有inset 的狀態(tài)。

(注: 每個WindowState通過InsetsStateController.getInsetsForDispatch獲取該窗口的state,?通過relayoutWindow或者addWindow 中的outInsetsState.set(win.getInsetsState(), win.isClientLocal())將當前窗口insetState 轉(zhuǎn)給app。app端通過mInsetsController.onStateChanged @ViewRootImpl將狀態(tài)設(shè)置給InsetsController。 ?app 根據(jù)這個insetstate計算內(nèi)容區(qū)域。 app 計算inset區(qū)域:mInsetsController.calculateInsets。)

DisplayContent和InsetsPolicy均持有InsetsStateController,為同一實例。

  • InsetsPolicy: 為insets在wms端的總體策略。
  • InsetsControlTarget即為WindowState,如果某個窗口可以控制某種類型inset, 在該窗口addToWindow()和relayoutWindow()函數(shù)中, 返回對應inset的InsetsSourceControl。例如, 當前top窗口僅允許控制statusbar, 則statusbar的InsetsControlTarget為當前top窗口, 傳回給當前top窗口InsetsSourceControl 僅有statusbar, 沒有導航欄的InsetsSourceControl。?
  • InsetsSourceProvider:?win: inset 窗口, 例如輸入法窗口, 導航欄窗口。 其中mSource為某個?inset的frame及顯示狀態(tài)。?mFrameProvider:計算inset的frame大小的函數(shù),用于設(shè)置mSource中的frame。 在updateSourceFrame()中調(diào)用。

inset show的流程

inset 基本的控制是show 和hide, inset show和hide流程基本一樣,以show流程說明流程。?

  • 接口

app 控制insets顯示或者隱藏調(diào)用的接口如下, 關(guān)于InsetsController參見InsetsController類說明。

getWindow().getInsetsController().show(insetTypeList) //實際對應InsetsController.show()

getWindow().getInsetsController().hide(insetTypeList) //實際對應InsetsController.hide()

  • 流程

調(diào)用InsetsController.show/hide的調(diào)用stack如下, 從下到上,這個stack只到InsetsController.notifyVisibilityChanged(),該stack只是記錄和參考,不作詳細說明。 具體需要注意的是InsetsController.notifyVisibilityChanged()之后流程。

//此函數(shù)先調(diào)用ViewRootInsetsControllerHost.notifyInsetsChanged  后調(diào)用updateRequestedStateat android.view.InsetsController.notifyVisibilityChanged(InsetsController.java:1208)  at android.view.InsetsSourceConsumer.setRequestedVisible(InsetsSourceConsumer.java:344)at android.view.InsetsSourceConsumer.show(InsetsSourceConsumer.java:196)at android.view.InsetsController.showDirectly(InsetsController.java:1325)at android.view.InsetsController.controlAnimationUnchecked(InsetsController.java:1013)at android.view.InsetsController.applyAnimation(InsetsController.java:1305)at android.view.InsetsController.show(InsetsController.java:870)at android.view.InsetsController.show(InsetsController.java:826)
  • InsetsController.notifyVisibilityChanged()流程

InsetsController.notifyVisibilityChanged()函數(shù)如下, 先調(diào)用ViewRootInsetsControllerHost.notifyInsetsChanged ?后調(diào)用updateRequestedState。

public void notifyVisibilityChanged() {mHost.notifyInsetsChanged();? //實際在viewRootImpl中requestLayout, 也就是在下一個vsync中與wms交互去Relayout()。updateRequestedState();? //調(diào)用了ViewRootInsetsControllerHost.onInsetsModified。 交互流程見下面的流程圖。}
  • ViewRootInsetsControllerHost.notifyInsetsChanged?實際在viewRootImpl中調(diào)用requestLayout, 也就是在下一個vsync中與wms交互去Relayout()。從而獲取新的InsetsSourceControl和InsetsState,并刷新界面layout。 這里的notify應該指的是通知本app重新刷新layout。在重新layout后, 會調(diào)用mInsetsController.calculateInsets根據(jù)inset的顯示和占位情況, 計算應用區(qū)的大小。?
      at android.view.ViewRootImpl.notifyInsetsChanged(ViewRootImpl.java:1603)  //下一個vsync relayout at android.view.ViewRootInsetsControllerHost.notifyInsetsChanged(ViewRootInsetsControllerHost.java:54) // at android.view.InsetsController.notifyVisibilityChanged(InsetsController.java:1208)
  • updateRequestedState用于通知wms端app請求inset變化,wms處理相應的inset顯示和隱藏, 并通知其他app系統(tǒng)inset變化。 調(diào)用了ViewRootInsetsControllerHost.onInsetsModified,交互流程見下面的流程圖。app端調(diào)用IWindowSession.insetsModified(IWindow window, in InsetsState state)通知wms inset變化, 其中InsetsState為修改后的inset狀態(tài)。 wms通過InsetSourceProvider.setClientVisible設(shè)置inset窗口顯示狀態(tài)。 然后發(fā)送消息給所有的活動窗口, 通知insetsChanged。 每個活動窗口調(diào)用mInsetsController.onStateChanged設(shè)置自己的inset窗口狀態(tài),onStateChanged也會調(diào)用notifyInsetsChanged重新relayout 窗口。而發(fā)起show流程的窗口,因為state已經(jīng)修改為當前的狀態(tài), 所以onStateChanged不再執(zhí)行該操作。
      at android.view.ViewRootInsetsControllerHost.onInsetsModified(ViewRootInsetsControllerHost.java:147) //調(diào)用WindowSession.insetsModified()通知wms 修改inset visibilityat android.view.InsetsController.updateRequestedState(InsetsController.java:1287)at android.view.InsetsController.notifyVisibilityChanged(InsetsController.java:1209)

??

注: app 調(diào)用notifyInsetsChanged的幾個地方,僅做參考:?

1. 在onStateChanged@InsetsController中調(diào)用, 比如在ViewRootImpl.setView中調(diào)用onStateChanged, 從下到上:?

ViewRootInsetsControllerHost.notifyInsetsChanged()
?android.view.ViewRootInsetsControllerHost.notifyInsetsChanged(ViewRootInsetsControllerHost.java:54)
?? ? ?at android.view.InsetsController.onStateChanged(InsetsController.java:630)? //在ViewRootImpl.setView中調(diào)用mWindowSession.addToDisplayAsUser后,wms 返回了當前窗口對應的InsetsSourceControl和InsetsState, 調(diào)用本函數(shù)? ? ? at android.view.ViewRootImpl.setView(ViewRootImpl.java:1059)?
? ? ? at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:411)
? ? ? at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109)
? ? ??

2. 在setFrame@ViewRootImpl中調(diào)用, 如在ViewRootImpl.setView中調(diào)用setFrame(), 從下到上

ViewRootInsetsControllerHost.notifyInsetsChanged()

?android.view.ViewRootInsetsControllerHost.notifyInsetsChanged(ViewRootInsetsControllerHost.java:54)
?? ? ?at android.view.InsetsController.onFrameChanged(InsetsController.java:594)
?? ? ?at android.view.ViewRootImpl.setFrame(ViewRootImpl.java:7493)
?? ? ?at android.view.ViewRootImpl.setView(ViewRootImpl.java:1036)
? ? ? at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:411)
? ? ? at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109)
? ? ??

WMS側(cè)確定InsetsSourceControl的流程

WMS側(cè)如何確定某個app 可以持有哪些InsetsSourceControl。 在該窗口relayout中, 根據(jù)當前window 的focus情況, 只有focus的窗口可以獲取InsetsSourceControl,也就是控制inset的顯示和隱藏, 沒有focus的窗口不能獲取InsetsSourceControl,也就是不能控制inset的顯示和隱藏。所以當一個窗口設(shè)置了FLAG_NOT_FOCUSABLE, 就不在能控制inset的顯示和隱藏。流程從下到上:


// addToControlMaps 設(shè)置了mControlTargetTypeMap@InsetsStateController.java,? ?設(shè)置了mControlTargetTypeMap后, 通過在relayout 中調(diào)用getInsetsSourceControls傳回給app進程的mTempControls。?
?? ? ?at com.android.server.wm.InsetsStateController.addToControlMaps(InsetsStateController.java:523)
?? ? ?at com.android.server.wm.InsetsStateController.onControlChanged(InsetsStateController.java:469)
?? ? ?at com.android.server.wm.InsetsStateController.onBarControlTargetChanged(InsetsStateController.java:424)
?? ? ?at com.android.server.wm.InsetsPolicy.updateBarControlTarget(InsetsPolicy.java:150)
?? ? ?at com.android.server.wm.DisplayPolicy.updateSystemUiVisibilityLw(DisplayPolicy.java:3940)
?? ? ?at com.android.server.wm.DisplayPolicy.focusChangedLw(DisplayPolicy.java:3736)
?? ? ?at com.android.server.wm.DisplayContent.updateFocusedWindowLocked(DisplayContent.java:3286)
?? ? ?at com.android.server.wm.RootWindowContainer.updateFocusedWindowLocked(RootWindowContainer.java:461)
?? ? ?at com.android.server.wm.WindowManagerService.updateFocusedWindowLocked(WindowManagerService.java:5552)
?? ? ?at com.android.server.wm.WindowManagerService.relayoutWindow(WindowManagerService.java:2348)

兩個問題

窗口顯示時不改變現(xiàn)有的inset狀態(tài)

兩種方法:

?一種就是控制inset 和上一個窗口相同,獲取當前insets狀態(tài)方法:?getWindowManager().getCurrentWindowMetrics().getWindowInsets。示例

在onCreate 或 onResume中調(diào)用以下代碼,也就是mWm.addView(mDecorView, l);之前調(diào)用。 
WindowInsets windowInsets = getWindowManager().getCurrentWindowMetrics().getWindowInsets();
hideTypeList = getHideTypeList(windowInsets)//獲取hide 的type list。 
showTypeList = getShowTypeList(windowInsets)//獲取show 的type list。
WindowInsetsController controller = decorView.getWindowInsetsController();
controller.hide(hideTypeList);
controller.show(hideTypeList);

另一種,就是設(shè)置窗口為FLAG_NOT_FOCUSABLE。FLAG_NOT_FOCUSABLE, 導致沒有focus window 變化, 從而不能設(shè)置獲取InsetsSourceControl,也就無法控制所有insets窗口的show和hide。 代碼:

?l.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE? // 本句需要注釋掉,才能獲取InsetsSourceControl。?| WindowManager.LayoutParams.FLAG_FULLSCREEN;

wms中判斷應用是否focus的代碼: mFindFocusedWindow
? ? ? ? ? at com.android.server.wm.WindowState.canReceiveKeys(WindowState.java:2877) // 如果設(shè)置FLAG_NOT_FOCUSABLE, canReceiveKeys 返回false, 認為該窗口非焦點窗口, 不改變inset設(shè)置。

全屏窗口上的dialog?不顯示statusbar問題

?受全屏窗口設(shè)置影響。?系統(tǒng)單獨對status?bar做了設(shè)置:

??

View 和 DecorView 設(shè)置insets信息

流程如下,?DecorView的onApplyWindowInsets 會調(diào)用mInsetsController.calculateInsets,計算應用區(qū)的大小。

 at com.android.internal.policy.DecorView.onApplyWindowInsets(DecorView.java:1046)//demorview 將inset區(qū)域減去,其他的區(qū)域作為內(nèi)容區(qū)at android.view.View.dispatchApplyWindowInsets(View.java:11311)at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:7320)at android.view.ViewRootImpl.dispatchApplyInsets(ViewRootImpl.java:2311) //會通過calculateInsets 計算當前inset, 將當前inset應用到view。 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2439)at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1948)at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8179)at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)at android.view.Choreographer.doCallbacks(Choreographer.java:796)at android.view.Choreographer.doFrame(Choreographer.java:731)at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)

輸入法顯示流程

輸入法也是一種inset, 其顯示和隱藏的流程也與inset 顯示隱藏一致。 下面介紹的是在點擊編輯框時,輸入法顯示流程。

1. 在某個app側(cè)點擊編輯框

最后調(diào)用showSoftInput@InputMethodManager?:

showSoftInput:1587, InputMethodManager (android.view.inputmethod)
onTouchEvent:11082, TextView (android.widget)
dispatchTouchEvent:14309, View (android.view)
dispatchTransformedTouchEvent:3118, ViewGroup (android.view)
dispatchTouchEvent:2799, ViewGroup (android.view)
dispatchTransformedTouchEvent:3118, ViewGroup (android.view)
dispatchTouchEvent:2799, ViewGroup (android.view)
dispatchTransformedTouchEvent:3118, ViewGroup (android.view)
dispatchTouchEvent:2799, ViewGroup (android.view)
dispatchTransformedTouchEvent:3118, ViewGroup (android.view)
dispatchTouchEvent:2799, ViewGroup (android.view)
superDispatchTouchEvent:515, DecorView (com.android.internal.policy)
superDispatchTouchEvent:1879, PhoneWindow (com.android.internal.policy)
dispatchTouchEvent:4135, Activity (android.app)
dispatchTouchEvent:473, DecorView (com.android.internal.policy)
dispatchPointerEvent:14568, View (android.view)
processPointerEvent:6024, ViewRootImpl$ViewPostImeInputStage (android.view)
onProcess:5827, ViewRootImpl$ViewPostImeInputStage (android.view)
deliver:5318, ViewRootImpl$InputStage (android.view)
onDeliverToNext:5375, ViewRootImpl$InputStage (android.view)
forward:5341, ViewRootImpl$InputStage (android.view)
forward:5493, ViewRootImpl$AsyncInputStage (android.view)
apply:5349, ViewRootImpl$InputStage (android.view)
apply:5550, ViewRootImpl$AsyncInputStage (android.view)
deliver:5322, ViewRootImpl$InputStage (android.view)
onDeliverToNext:5375, ViewRootImpl$InputStage (android.view)
forward:5341, ViewRootImpl$InputStage (android.view)
apply:5349, ViewRootImpl$InputStage (android.view)
deliver:5322, ViewRootImpl$InputStage (android.view)
deliverInputEvent:8088, ViewRootImpl (android.view)
doProcessInputEvents:8039, ViewRootImpl (android.view)
enqueueInputEvent:8000, ViewRootImpl (android.view)
onInputEvent:8211, ViewRootImpl$WindowInputEventReceiver (android.view)
dispatchInputEvent:220, InputEventReceiver (android.view)
nativePollOnce:-1, MessageQueue (android.os)
next:335, MessageQueue (android.os)
loop:183, Looper (android.os)
main:7664, ActivityThread (android.app)
invoke:-1, Method (java.lang.reflect)
run:592, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:947, ZygoteInit (com.android.internal.os)

2.輸入法app接收到顯示輸入法消息

輸入法app, 即實現(xiàn)inputmethodservice的app。 其與InputMethodManagerService的接口為IInputMethodWrapper。 InputMethodManagerService 調(diào)用?IInputMethodWrapper.showSoftInput, 其發(fā)送消息DO_SHOW_SOFT_INPUT。?處理DO_SHOW_SOFT_INPUT, 調(diào)用到InputMethodService.showSoftInput?(), 最終調(diào)用到IInputMethodPrivilegedOperations.applyImeVisibility()。IInputMethodPrivilegedOperations?為inputMethodService與InputMethodManagerService的通信接口。?

applyVisibilityInInsetsConsumerIfNecessary:2219, InputMethodService (android.inputmethodservice)
access$400:263, InputMethodService (android.inputmethodservice)
showSoftInput:748, InputMethodService$InputMethodImpl (android.inputmethodservice)
showSoftInputWithToken:718, InputMethodService$InputMethodImpl (android.inputmethodservice)
executeMessage:226, IInputMethodWrapper (android.inputmethodservice)
handleMessage:44, HandlerCaller$MyHandler (com.android.internal.os)
dispatchMessage:106, Handler (android.os)
loop:223, Looper (android.os)
main:7664, ActivityThread (android.app)
invoke:-1, Method (java.lang.reflect)
run:592, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:947, ZygoteInit (com.android.internal.os)

3.InputMethodManagerService接收到輸入法app的顯示狀態(tài)信息

輸入法app調(diào)用InputMethodManagerService.applyImeVisibility() 通知InputMethodManagerService(IMMS)顯示狀態(tài)變化,IMMS然后調(diào)用到scheduleShowImePostLayout@ImeInsetsSourceProvider,該函數(shù)在下一個vsync調(diào)用輸入法窗口的windowState.showInsets通知輸入法窗口: ims: show. ?

scheduleShowImePostLayout:52, ImeInsetsSourceProvider (com.android.server.wm)
showImePostLayout:7615, WindowManagerService$LocalService (com.android.server.wm)
applyImeVisibility:4088, InputMethodManagerService (com.android.server.inputmethod)
access$4700:188, InputMethodManagerService (com.android.server.inputmethod)
applyImeVisibility:5935, InputMethodManagerService$InputMethodPrivilegedOperationsImpl (com.android.server.inputmethod)
onTransact:336, IInputMethodPrivilegedOperations$Stub (com.android.internal.inputmethod)
execTransactInternal:1154, Binder (android.os)
execTransact:1123, Binder (android.os)

4.輸入法窗口接收到showInsets@IWindow?

輸入法在接收到ims顯示狀態(tài)變化后, 如下面流程,調(diào)用InsetsController.show, 后面的流程和前面介紹的inset show的流程一致: 通知wms ims inset狀態(tài)變化,? 并通知給所有活動中的窗口。 在下一個vsync, 調(diào)用relayoutWindow(),重新布局。下面為輸入法窗口的showInsets流程。

  • "main@15899" prio=5 tid=0x2 nid=NA runnablejava.lang.Thread.State: RUNNABLEat android.view.InsetsController.updateRequestedState(InsetsController.java:1262)at android.view.InsetsController.notifyVisibilityChanged(InsetsController.java:1209)at android.view.InsetsSourceConsumer.setRequestedVisible(InsetsSourceConsumer.java:344)at android.view.InsetsSourceConsumer.show(InsetsSourceConsumer.java:196)at android.view.InsetsController.showDirectly(InsetsController.java:1325)at android.view.InsetsController.controlAnimationUnchecked(InsetsController.java:1013)at android.view.InsetsController.applyAnimation(InsetsController.java:1305)at android.view.InsetsController.show(InsetsController.java:870)at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:5031)  //處理 MSG_SHOW_INSETS, MSG_SHOW_INSETS 為wms 調(diào)用iWindow.showInsets觸發(fā)。at android.os.Handler.dispatchMessage(Handler.java:106)at android.os.Looper.loop(Looper.java:223)at android.app.ActivityThread.main(ActivityThread.java:7664)at java.lang.reflect.Method.invoke(Method.java:-1)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
    

監(jiān)聽inset 變化

窗口中的view可以在insets變化時, 改變默認的inset 占位行為。 監(jiān)聽inset變化, 然后自行設(shè)置insets如何占位。 如:

  • 設(shè)置Insetscontroller變化監(jiān)聽

InsetsController.addOnControllableInsetsChangedListener(OnControllableInsetsChangedListener ...);
  • 應用WindowInsets變化

getWindow().getDecorView().setOnApplyWindowInsetsListener(OnApplyWindowInsetsListener ...);@Overridepublic WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {mImeVisible = insets.isVisible(ime());return v.onApplyWindowInsets(insets);}

http://m.risenshineclean.com/news/63303.html

相關(guān)文章:

  • 網(wǎng)站站點地圖seo推廣人員
  • 做網(wǎng)站備案什么意思app推廣平臺放單平臺
  • wordpress網(wǎng)站生成app應用指數(shù)基金
  • 在線平面設(shè)計招聘搜索引擎優(yōu)化技術(shù)
  • 新網(wǎng)網(wǎng)站空間獨立控制面板常用的關(guān)鍵詞挖掘工具有哪些
  • 公司做網(wǎng)站 優(yōu)幫云國外免費建站網(wǎng)站搭建
  • dw 網(wǎng)頁設(shè)計與制作教程seo整站優(yōu)化更能準確獲得客戶
  • 重慶網(wǎng)站建設(shè)狐靈傳媒石家莊網(wǎng)絡(luò)推廣
  • 廠家批發(fā)網(wǎng)站平臺鄭州百度推廣代運營
  • 濟南網(wǎng)站建設(shè)魯icp備微信軟文是什么意思
  • 做簡歷的網(wǎng)站有哪些內(nèi)容百度快照怎么做
  • 網(wǎng)站維護學習小熊貓seo博客
  • 新聞熱點大事件北京seo供應商
  • 四川省住房建設(shè)廳網(wǎng)站進不去百度關(guān)鍵詞排名用什么軟件
  • 網(wǎng)站建設(shè)續(xù)費多少錢優(yōu)化seo方法
  • 北京手機網(wǎng)站建設(shè)公司新聞頭條免費下載安裝
  • 適合友情鏈接的網(wǎng)站市場營銷策劃方案書
  • 佛山新網(wǎng)站建設(shè)seo網(wǎng)站優(yōu)化專員
  • 機器ip后面加個端口做網(wǎng)站農(nóng)大南路網(wǎng)絡(luò)營銷推廣優(yōu)化
  • 成都那家網(wǎng)站制作公司好微信投放廣告多少錢
  • 大學生做那個視頻網(wǎng)站財經(jīng)新聞最新消息
  • 合肥網(wǎng)站制作廣東東莞今日最新消息
  • 怎么一個網(wǎng)站做的競價網(wǎng)站權(quán)重一般有幾個等級
  • 政府網(wǎng)站登錄界面模板網(wǎng)絡(luò)廣告營銷經(jīng)典案例
  • 做二手的網(wǎng)站都有哪些互聯(lián)網(wǎng)推廣軟件
  • 鞍山市做網(wǎng)站公司軟件開發(fā)培訓中心
  • 做網(wǎng)站php和asp哪個好100%上熱門文案
  • wordpress 4.0百度seo搜索引擎優(yōu)化方案
  • 德宏網(wǎng)站建設(shè)公司項目優(yōu)化seo
  • 如何進行網(wǎng)站維護軟文大全800字