当前位置: 首页 > news >正文

做的好的中医网站网站建设评估体系

做的好的中医网站,网站建设评估体系,互联网域名注册查询,创意设计文案Android14 WMS-窗口添加流程(一)-Client端-CSDN博客 Android14 WMS-窗口添加流程(二)-Server端-CSDN博客 经过上述两个流程后#xff0c;窗口的信息都已经传入了WMS端。 1. ViewRootImpl#setView 在窗口添加流程(一)中#xff0c;有这个方法#xff1a; http://aospxref…Android14 WMS-窗口添加流程(一)-Client端-CSDN博客 Android14 WMS-窗口添加流程(二)-Server端-CSDN博客 经过上述两个流程后窗口的信息都已经传入了WMS端。 1. ViewRootImpl#setView 在窗口添加流程(一)中有这个方法 http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/view/ViewRootImpl.java#1314 public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,int userId) { ...// Schedule the first layout -before- adding to the window// manager, to make sure we do the relayout before receiving// any other events from the system.requestLayout(); ...} 2. ViewRootImpl#requestLayout requestLayout中的scheduleTraversals是一个异步方法 Overridepublic void requestLayout() {if (!mHandlingLayoutInLayoutRequest) {checkThread();mLayoutRequested true; //异步方法scheduleTraversals();}} 3. ViewRootImpl#scheduleTraversals scheduleTraversals中有一个Runnable方法 关于Choreographer编舞者这里也不重点介绍。 final class TraversalRunnable implements Runnable {Overridepublic void run() { //执行view遍历操作,进行measurelayoutdraw操作doTraversal();}}final TraversalRunnable mTraversalRunnable new TraversalRunnable();UnsupportedAppUsage(maxTargetSdk Build.VERSION_CODES.R, trackingBug 170729553)void scheduleTraversals() {if (!mTraversalScheduled) {mTraversalScheduled true;mTraversalBarrier mHandler.getLooper().getQueue().postSyncBarrier(); //Choreographer Posts a callback to run on the next frame. // The callback runs once then is automatically removed.mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);notifyRendererOfFramePending();pokeDrawLockIfNeeded();}} 4. ViewRootImpl#doTraversal 来看看Runnable中的方法 void doTraversal() {if (mTraversalScheduled) {mTraversalScheduled false;mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier); ... //要执行到了真正的遍历操作这就要对view执行measurelayout, draw流程了performTraversals(); ...}} 5. ViewRootImpl#performTraversals private void performTraversals() { ...// cache mView since it is used so much below... //这个mView是通过setView方法传进来的,也就是Activity的根布局DecorView使用final修饰以防在遍历过程中被修改final View host mView; ... //mAdded指DecorView是否被成功加入到window中在setView()中被赋值为trueif (host null || !mAdded) {mLastPerformTraversalsSkipDrawReason host null ? no_host : not_added;return;} ...mIsInTraversal true;//是否正在遍历mWillDrawSoon true;//是否需要马上绘制boolean cancelDraw false;String cancelReason null;boolean isSyncRequest false;boolean windowSizeMayChange false;WindowManager.LayoutParams lp mWindowAttributes; //顶层视图DecorView窗口的期望宽高int desiredWindowWidth;int desiredWindowHeight; //DecorView是否可见final int viewVisibility getHostVisibility(); //视图可见性改变final boolean viewVisibilityChanged !mFirst (mViewVisibility ! viewVisibility || mNewSurfaceNeeded// Also check for possible double visibility update, which will make current// viewVisibility value equal to mViewVisibility and we may miss it.|| mAppVisibilityChanged); ...WindowManager.LayoutParams params null; ...boolean windowShouldResize layoutRequested windowSizeMayChange ((mWidth ! host.getMeasuredWidth() || mHeight ! host.getMeasuredHeight())|| (lp.width ViewGroup.LayoutParams.WRAP_CONTENT frame.width() desiredWindowWidth frame.width() ! mWidth)|| (lp.height ViewGroup.LayoutParams.WRAP_CONTENT frame.height() desiredWindowHeight frame.height() ! mHeight));windowShouldResize | mDragResizing mPendingDragResizing; ... //第一次执行测量布局绘制操作||Activity窗口大小需要改变||View的可见性发生了变化||窗口属性发生了变化||ViewRootHandler接收到消息MSG_RESIZED_REPORT即size改变了if (mFirst || windowShouldResize || viewVisibilityChanged || params ! null|| mForceNextWindowRelayout) { ... //如果此窗口为窗口管理器提供内部insets那么我们首先要在布局期间使提供的insets保持不变。 //这样可以避免它短暂地导致其他窗口根据窗口的原始框架调整大小/移动 //等到我们完成此窗口的布局并返回窗口管理器并最终计算出插图。insetsPending computesInternalInsets; ... //判断是否有surfaceboolean hadSurface mSurface.isValid();try { ...if (mFirst || viewVisibilityChanged) {mViewFrameInfo.flags | FrameInfo.FLAG_WINDOW_VISIBILITY_CHANGED;} //params窗口属性变化内容 //请求WMS计算Activity窗口大小及边衬区域大小relayoutResult relayoutWindow(params, viewVisibility, insetsPending); ...// Ask host how big it wants to be//绘制三部曲之measureperformMeasure(childWidthMeasureSpec, childHeightMeasureSpec);...//绘制三部曲之layoutperformLayout(lp, mWidth, mHeight);...//绘制三部曲之drawperformDraw(); ... 6. ViewRootImpl#relayoutWindow 我们主要是来看看ViewRootImpl如何向WMS申请布局的 private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,boolean insetsPending) throws RemoteException { ... //window申请的宽final int requestedWidth (int) (measuredWidth * appScale 0.5f); //window申请的高final int requestedHeight (int) (measuredHeight * appScale 0.5f);int relayoutResult 0;mRelayoutSeq;if (relayoutAsync) {mWindowSession.relayoutAsync(mWindow, params,requestedWidth, requestedHeight, viewVisibility,insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, mRelayoutSeq,mLastSyncSeqId);} else { //请求重新布局relayoutResult mWindowSession.relayout(mWindow, params,requestedWidth, requestedHeight, viewVisibility,insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, mRelayoutSeq,mLastSyncSeqId, mTmpFrames, mPendingMergedConfiguration, mSurfaceControl,mTempInsets, mTempControls, mRelayoutBundle); ... 这里就又用到了AIDLWindowSessionWindowSession是APP和WMS沟通的桥梁 final IWindowSession mWindowSession; 可以看下这篇文章加强理解 Android14 WMS-IWindowSession介绍-CSDN博客 7. Session #relayout //Session继承了IWindowSession.Stub class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { ...Overridepublic int relayout(IWindow window, WindowManager.LayoutParams attrs,int requestedWidth, int requestedHeight, int viewFlags, int flags, int seq,int lastSyncSeqId, ClientWindowFrames outFrames,MergedConfiguration mergedConfiguration, SurfaceControl outSurfaceControl,InsetsState outInsetsState, InsetsSourceControl.Array outActiveControls,Bundle outSyncSeqIdBundle) {if (false) Slog.d(TAG_WM, ENTERED relayout from Binder.getCallingPid());Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag); //调用到了Server端int res mService.relayoutWindow(this, window, attrs,requestedWidth, requestedHeight, viewFlags, flags, seq,lastSyncSeqId, outFrames, mergedConfiguration, outSurfaceControl, outInsetsState,outActiveControls, outSyncSeqIdBundle);Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);if (false) Slog.d(TAG_WM, EXITING relayout to Binder.getCallingPid());return res;} 8. WindowManagerService #relayoutWindow Server端流程太多了另起一篇文章分析。
http://www.w-s-a.com/news/426422/

相关文章:

  • 网站开发工具 知乎工业软件开发技术就业前景
  • 永济微网站建设费用新手如何自学编程
  • 在本地怎么做网站深圳保障房申请条件2022
  • 广州天河区网站建设公司东莞网络游戏制作开发
  • 哪个网站做免费小程序rio门户网站的制作
  • 短网站生成查询网站所有关键词排名
  • 阿里云购买网站登录技术服务外包公司
  • 淘宝单页面网站手机制作游戏的软件
  • 汉中市网站建设wordpress编辑器好麻烦
  • 织梦做的网站快照被攻击在线看crm系统
  • 青岛物流公司网站建设网站建设提议
  • 企业网站建设高端品牌宿州注册公司多少钱
  • 个人微信公众号怎么做微网站吗湛江网站制作方案
  • 学校网站改版南京展厅设计装修
  • 手机网站有免费做的吗建设银行网站不能登录
  • 树莓派做影视网站网站建设企业 熊账号
  • 网站iis7.5配置免费网站建设模板下载
  • 生物公司网站建设方案wordpress自定义字段调用
  • 静态网站公用头部如何调用标题wordpress自动采集翻译插件怎么用
  • 网站做单链 好不好网站营销不同阶段的网站分析目标
  • 网线制作颜色顺序兰州网站推广优化
  • 北京沙河教做网站的企业融资以什么为基础
  • 给网站添加百度地图绵阳做绵阳做网站网站
  • 用电脑做服务器制作网站东莞营销网站建设
  • 网站需要怎么做wordpress 重装
  • 做电影网站赚钱的方法世界500强企业排名2023
  • 领卷网站怎么做的西宁设计网站建设
  • 东莞网站建设价位软件开发税率是13%还是6
  • 企业网站建设一条龙如何在网上推广自己
  • 成品网站制作公司企梦网站建设