Android应用程序键盘(Keyboard)消息处理机制分析(10)
16lz
2021-12-04
Step 2.ViewRoot.requestLayout 这个函数定义在frameworks/base/core/java/android/view/ViewRoot.java文件中:
Step 7.InputManager.nativeSetInputWindows 这个函数定义在frameworks/base/services/jni/com_android_server_InputManager.cpp文件中:
- publicfinalclassViewRootextendsHandlerimplementsViewParent,
- View.AttachInfo.Callbacks{
- ......
- publicvoidrequestLayout(){
- ......
- mLayoutRequested=true;
- scheduleTraversals();
- }
- ......
- }
- publicclassWindowManagerServiceextendsIWindowManager.Stub
- implementsWatchdog.Monitor{
- ......
- privatefinalclassSessionextendsIWindowSession.Stub
- implementsIBinder.DeathRecipient{
- ......
- publicintrelayout(IWindowwindow,WindowManager.LayoutParamsattrs,
- intrequestedWidth,intrequestedHeight,intviewFlags,
- booleaninsetsPending,RectoutFrame,RectoutContentInsets,
- RectoutVisibleInsets,ConfigurationoutConfig,SurfaceoutSurface){
- //Log.d(TAG,">>>>>>ENTEREDrelayoutfrom"+Binder.getCallingPid());
- intres=relayoutWindow(this,window,attrs,
- requestedWidth,requestedHeight,viewFlags,insetsPending,
- outFrame,outContentInsets,outVisibleInsets,outConfig,outSurface);
- //Log.d(TAG,"<<<<<<EXITINGrelayoutto"+Binder.getCallingPid());
- returnres;
- }
- ......
- }
- ......
- }
- publicclassWindowManagerServiceextendsIWindowManager.Stub
- implementsWatchdog.Monitor{
- ......
- publicintrelayoutWindow(Sessionsession,IWindowclient,
- WindowManager.LayoutParamsattrs,intrequestedWidth,
- intrequestedHeight,intviewVisibility,booleaninsetsPending,
- RectoutFrame,RectoutContentInsets,RectoutVisibleInsets,
- ConfigurationoutConfig,SurfaceoutSurface){
- ......
- synchronized(mWindowMap){
- ......
- mInputMonitor.updateInputWindowsLw();
- }
- ......
- }
- ......
- }
- publicclassWindowManagerServiceextendsIWindowManager.Stub
- implementsWatchdog.Monitor{
- ......
- finalclassInputMonitor{
- ......
- /*Updatesthecachedwindowinformationprovidedtotheinputdispatcher.*/
- publicvoidupdateInputWindowsLw(){
- //Populatetheinputwindowlistwithinformationaboutallofthewindowsthat
- //couldpotentiallyreceiveinput.
- //Asanoptimization,wecouldtrytoprunethelistofwindowsbutthisturns
- //outtobedifficultbecauseonlythenativecodeknowsforsurewhichwindow
- //currentlyhastouchfocus.
- finalArrayList<WindowState>windows=mWindows;
- finalintN=windows.size();
- for(inti=N-1;i>=0;i--){
- finalWindowStatechild=windows.get(i);
- if(child.mInputChannel==null||child.mRemoved){
- //Skipthiswindowbecauseitcannotpossiblyreceiveinput.
- continue;
- }
- ......
- //Addawindowtoourlistofinputwindows.
- finalInputWindowinputWindow=mTempInputWindows.add();
- ......
- }
- //Sendwindowstonativecode.
- mInputManager.setInputWindows(mTempInputWindows.toNullTerminatedArray());
- ......
- }
- ......
- }
- ......
- }
- publicclassInputManager{
- ......
- publicvoidsetInputWindows(InputWindow[]windows){
- nativeSetInputWindows(windows);
- }
- ......
- }
Step 7.InputManager.nativeSetInputWindows 这个函数定义在frameworks/base/services/jni/com_android_server_InputManager.cpp文件中:
- staticvoidandroid_server_InputManager_nativeSetInputWindows(JNIEnv*env,jclassclazz,
- jobjectArraywindowObjArray){
- if(checkInputManagerUnitialized(env)){
- return;
- }
- gNativeInputManager->setInputWindows(env,windowObjArray);
- }
更多相关文章
- android之针对fragment多次调用onCreateView的问题
- Android应用程序组件Content Provider的共享数据更新通知机制分
- Android高手进阶教程(二十七)之---基于ViewFlipper实现的自定义
- How to destroy an Activity in android
- How to destroy an Activity in android
- Android中获取屏幕信息DisplayMetrics的用法
- Android应用程序键盘(Keyboard)消息处理机制分析(21)
- Android(安卓)中自定义View的应用
- Android(安卓)Universal Image Loader 源码分析