网站域名后缀有哪些/百度推广怎么弄
目录
简介
Insets管理架构
Insets相关类图
app侧的类
WMS侧的类
inset show的流程
接口
流程
WMS侧确定InsetsSourceControl的流程
两个问题
窗口显示时不改变现有的inset状态
全屏窗口上的dialog 不显示statusbar问题
View 和 DecorView 设置insets信息
输入法显示流程
1. 在某个app侧点击编辑框
2.输入法app接收到显示输入法消息
3.InputMethodManagerService接收到输入法app的显示状态信息
4.输入法窗口接收到showInsets@IWindow
监听inset 变化
设置Insetscontroller变化监听
应用WindowInsets变化
简介
android 11上新增一套inset管理方法。
Insets 是指系统边衬区的窗口, 包括statusbar, navigation bar, 输入法等, 都在insets管理中。下面说的这些insets即为这些窗口。
通过insets相关的接口, app可以控制insets窗口的显示, 隐藏, 沉浸式等。
inset 最基本的控制是show 和hide。 在inset 不同的状态下, 应用区的位置也会发生变化, 这部分的计算也是inset控制的重要内容之一。
insets完整的实现逻辑, 包含app端和服务端,服务端主要是WMS(window manager service)。 本文梳理insets的管理架构和主要逻辑, 如show insets 等。
下面为dump 出来的insets信息, 使用命令adb shell dumpsys window。 InsetsState 是系统当前所有inset状态的集合,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管理架构
Insets相关类图
分为app侧和系统服务侧(wms)侧。
app侧的类
- InsetsState: 为Parceble, 在wms和app中互相传递。其中记录了所有系统Insets的InsetsSource。每个InsetsSource描述了Insets的状态。 可以参看简介中dump信息
- InsetsSource: 为Parceble, 记录一个inset是否显示及frame。可以参看简介中dump信息。
- 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侧持有的InsetsSourceControl来自于添加窗口时 addWindow()和 relayoutWindow()时传回的 mTempControls。 实测 addWindow时mTempControls传回值为null. 在relayoutWindow 时传回mTempControls为实际值。WMS在在relayout 过程中, 会寻找inset 的target 窗口, 通过addToControlMaps@ InsetsStateController.java为该类型的窗口添加target, 然后在 relayoutWindow()中通过调用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显示,隐藏, 更新状态,动画的总调度, 包含 InsetsSourceConsumer map 和 ViewRootInsetsControllerHost。每种insets类型对应一个InsetsSourceConsumer。InsetsController在ViewRootImpl初始化时创建。
创建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要求的状态, 在ViewRootImpl.setview时调用mWindowSession.addToDisplayAsUser之后被同步到InsetsController中。
WMS侧的类
- InsetsStateController: 控制全局整体inset状态。
mProviders为insets的provider的集合。
mTypeControlTargetMap为可以控制每种Insets(如显示或隐藏)的窗口的集合。
mState为InsetsState, 当前系统所有inset 的状态。
(注: 每个WindowState通过InsetsStateController.getInsetsForDispatch获取该窗口的state, 通过relayoutWindow或者addWindow 中的outInsetsState.set(win.getInsetsState(), win.isClientLocal())将当前窗口insetState 转给app。app端通过mInsetsController.onStateChanged @ViewRootImpl将状态设置给InsetsController。 app 根据这个insetstate计算内容区域。 app 计算inset区域:mInsetsController.calculateInsets。)
DisplayContent和InsetsPolicy均持有InsetsStateController,为同一实例。
- InsetsPolicy: 为insets在wms端的总体策略。
- InsetsControlTarget即为WindowState,如果某个窗口可以控制某种类型inset, 在该窗口addToWindow()和relayoutWindow()函数中, 返回对应inset的InsetsSourceControl。例如, 当前top窗口仅允许控制statusbar, 则statusbar的InsetsControlTarget为当前top窗口, 传回给当前top窗口InsetsSourceControl 仅有statusbar, 没有导航栏的InsetsSourceControl。
- InsetsSourceProvider: win: inset 窗口, 例如输入法窗口, 导航栏窗口。 其中mSource为某个 inset的frame及显示状态。 mFrameProvider:计算inset的frame大小的函数,用于设置mSource中的frame。 在updateSourceFrame()中调用。
inset show的流程
inset 基本的控制是show 和hide, inset show和hide流程基本一样,以show流程说明流程。
-
接口
app 控制insets显示或者隐藏调用的接口如下, 关于InsetsController参见InsetsController类说明。
getWindow().getInsetsController().show(insetTypeList) //实际对应InsetsController.show()
getWindow().getInsetsController().hide(insetTypeList) //实际对应InsetsController.hide()
-
流程
调用InsetsController.show/hide的调用stack如下, 从下到上,这个stack只到InsetsController.notifyVisibilityChanged(),该stack只是记录和参考,不作详细说明。 具体需要注意的是InsetsController.notifyVisibilityChanged()之后流程。
//此函数先调用ViewRootInsetsControllerHost.notifyInsetsChanged 后调用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()函数如下, 先调用ViewRootInsetsControllerHost.notifyInsetsChanged 后调用updateRequestedState。
public void notifyVisibilityChanged() {mHost.notifyInsetsChanged(); //实际在viewRootImpl中requestLayout, 也就是在下一个vsync中与wms交互去Relayout()。updateRequestedState(); //调用了ViewRootInsetsControllerHost.onInsetsModified。 交互流程见下面的流程图。}
- ViewRootInsetsControllerHost.notifyInsetsChanged 实际在viewRootImpl中调用requestLayout, 也就是在下一个vsync中与wms交互去Relayout()。从而获取新的InsetsSourceControl和InsetsState,并刷新界面layout。 这里的notify应该指的是通知本app重新刷新layout。在重新layout后, 会调用mInsetsController.calculateInsets根据inset的显示和占位情况, 计算应用区的大小。
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系统inset变化。 调用了ViewRootInsetsControllerHost.onInsetsModified,交互流程见下面的流程图。app端调用IWindowSession.insetsModified(IWindow window, in InsetsState state)通知wms inset变化, 其中InsetsState为修改后的inset状态。 wms通过InsetSourceProvider.setClientVisible设置inset窗口显示状态。 然后发送消息给所有的活动窗口, 通知insetsChanged。 每个活动窗口调用mInsetsController.onStateChanged设置自己的inset窗口状态,onStateChanged也会调用notifyInsetsChanged重新relayout 窗口。而发起show流程的窗口,因为state已经修改为当前的状态, 所以onStateChanged不再执行该操作。
at android.view.ViewRootInsetsControllerHost.onInsetsModified(ViewRootInsetsControllerHost.java:147) //调用WindowSession.insetsModified()通知wms 修改inset visibilityat android.view.InsetsController.updateRequestedState(InsetsController.java:1287)at android.view.InsetsController.notifyVisibilityChanged(InsetsController.java:1209)
注: app 调用notifyInsetsChanged的几个地方,仅做参考:
1. 在onStateChanged@InsetsController中调用, 比如在ViewRootImpl.setView中调用onStateChanged, 从下到上:
ViewRootInsetsControllerHost.notifyInsetsChanged()
android.view.ViewRootInsetsControllerHost.notifyInsetsChanged(ViewRootInsetsControllerHost.java:54)
at android.view.InsetsController.onStateChanged(InsetsController.java:630) //在ViewRootImpl.setView中调用mWindowSession.addToDisplayAsUser后,wms 返回了当前窗口对应的InsetsSourceControl和InsetsState, 调用本函数 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中调用, 如在ViewRootImpl.setView中调用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侧确定InsetsSourceControl的流程
WMS侧如何确定某个app 可以持有哪些InsetsSourceControl。 在该窗口relayout中, 根据当前window 的focus情况, 只有focus的窗口可以获取InsetsSourceControl,也就是控制inset的显示和隐藏, 没有focus的窗口不能获取InsetsSourceControl,也就是不能控制inset的显示和隐藏。所以当一个窗口设置了FLAG_NOT_FOCUSABLE, 就不在能控制inset的显示和隐藏。流程从下到上:
// addToControlMaps 设置了mControlTargetTypeMap@InsetsStateController.java, 设置了mControlTargetTypeMap后, 通过在relayout 中调用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)
两个问题
窗口显示时不改变现有的inset状态
两种方法:
一种就是控制inset 和上一个窗口相同,获取当前insets状态方法: getWindowManager().getCurrentWindowMetrics().getWindowInsets。示例
在onCreate 或 onResume中调用以下代码,也就是mWm.addView(mDecorView, l);之前调用。
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);
另一种,就是设置窗口为FLAG_NOT_FOCUSABLE。
FLAG_NOT_FOCUSABLE, 导致没有focus window 变化, 从而不能设置获取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) // 如果设置FLAG_NOT_FOCUSABLE, canReceiveKeys 返回false, 认为该窗口非焦点窗口, 不改变inset设置。
全屏窗口上的dialog 不显示statusbar问题
受全屏窗口设置影响。 系统单独对status bar做了设置:
View 和 DecorView 设置insets信息
流程如下, DecorView的onApplyWindowInsets 会调用mInsetsController.calculateInsets,计算应用区的大小。
at com.android.internal.policy.DecorView.onApplyWindowInsets(DecorView.java:1046)//demorview 将inset区域减去,其他的区域作为内容区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侧点击编辑框
最后调用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, 即实现inputmethodservice的app。 其与InputMethodManagerService的接口为IInputMethodWrapper。 InputMethodManagerService 调用 IInputMethodWrapper.showSoftInput, 其发送消息DO_SHOW_SOFT_INPUT。 处理DO_SHOW_SOFT_INPUT, 调用到InputMethodService.showSoftInput (), 最终调用到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的显示状态信息
输入法app调用InputMethodManagerService.applyImeVisibility() 通知InputMethodManagerService(IMMS)显示状态变化,IMMS然后调用到scheduleShowImePostLayout@ImeInsetsSourceProvider,该函数在下一个vsync调用输入法窗口的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显示状态变化后, 如下面流程,调用InsetsController.show, 后面的流程和前面介绍的inset show的流程一致: 通知wms ims inset状态变化, 并通知给所有活动中的窗口。 在下一个vsync, 调用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 调用iWindow.showInsets触发。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)
监听inset 变化
窗口中的view可以在insets变化时, 改变默认的inset 占位行为。 监听inset变化, 然后自行设置insets如何占位。 如:
-
设置Insetscontroller变化监听
InsetsController.addOnControllableInsetsChangedListener(OnControllableInsetsChangedListener ...);
-
应用WindowInsets变化
getWindow().getDecorView().setOnApplyWindowInsetsListener(OnApplyWindowInsetsListener ...);@Overridepublic WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {mImeVisible = insets.isVisible(ime());return v.onApplyWindowInsets(insets);}
相关文章:

android inset 管理
目录 简介 Insets管理架构 Insets相关类图 app侧的类 WMS侧的类 inset show的流程 接口 流程 WMS侧确定InsetsSourceControl的流程 两个问题 窗口显示时不改变现有的inset状态 全屏窗口上的dialog 不显示statusbar问题 View 和 DecorView 设置insets信息 输入法显…...

Python中使用opencv-python库进行颜色检测
Python中使用opencv-python库进行颜色检测 之前写过一篇VC中使用OpenCV进行颜色检测的博文,当然使用opencv-python库也可以实现。 在Python中使用opencv-python库进行颜色检测非常简单,首选读取一张彩色图像,并调用函数imgHSV cv2.cvtColor…...

如何修改远程端服务器密钥
前言 一段时间没改密码后,远程就会自动提示CtrlAltEnd键修改密码。但我电脑是笔记本,没有end键。打开屏幕键盘按这三个键也没用。 解决方法 打开远程 1、远程端WINC 输入osk 可以发现打开了屏幕键盘 2、电脑键盘同时按住CtrlAlt(若自身电…...

lnmp指令
LNMP官网:https://lnmp.org 作者: licess adminlnmp.org 问题反馈&技术支持论坛:https://bbs.vpser.net/forum-25-1.html 打赏捐赠:https://lnmp.org/donation.html 自定义参数 lnmp.conf配置文件,可以修改lnmp.conf自定义下…...

Go语言每日一题——链表篇(七)
传送门 牛客面试笔试必刷101题 ----------------删除链表的倒数第n个节点 题目以及解析 题目 解题代码及解析 解析 这一道题与昨天的题目在解题思路上有一定的相似之处,都是基于双指针定义快慢指针,这里我们让快指针先走n步,又因为n一定…...

【stomp实战】websocket原理解析与简单使用
一、WebSocket 原理 WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并…...

2024.1.30力扣每日一题——使循环数组所有元素相等的最少秒数
2024.1.30 题目来源我的题解方法一 暴力模拟(无法通过)方法二 哈希表数学 题目来源 力扣每日一题;题序:2808 我的题解 方法一 暴力模拟(无法通过) 直接暴力枚举。记录每一个元素所在的位置,然…...

【Java万花筒】数据魔术师:探索Java商业智能与数据可视化
开发者的数据魔杖:掌握Java商业智能工具的秘诀 前言 在当今信息爆炸的时代,数据已经成为企业决策和业务发展的重要驱动力。为了更好地理解和利用数据,商业智能(BI)和数据可视化工具变得至关重要。本文将介绍几种基于…...

python用yaml装参数并支持命令行修改
效果: 将实验用的参数写入 yaml 文件,而不是全部用 argparse 传,否则命令会很长;同时支持在命令行临时加、改一些参数,避免事必要在 yaml 中改参数,比较灵活(如 grid-search 时遍历不同的 loss…...

第59讲订单数据下拉实现
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;/*** 订单查询 type值 0 全部订单 1待付款 2 待收货 3 退款/退货* param type* return*/RequestMapping("/list")public R list(Integer type,Integer page,Integer pageSize){System.out.pri…...

[当人工智能遇上安全] 11.威胁情报实体识别 (2)基于BiGRU-CRF的中文实体识别万字详解
您或许知道,作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个《当人工智能遇上安全》系列博客,详细介绍人工智能与安全相关的论文、实践,并分享各种案…...

16:定时器和计数器
定时器和计数器 1、定时器和计数器的介绍2、定时器是如何工作3、寄存器4、51单片机定时器简介(数据手册)5、定时器中的寄存器(数据手册)5.1、TCON(定时器控制寄存器)5.2、TMOD(工作模式寄存器&a…...

c#通过ExpressionTree 表达式树实现对象关系映射
//反射expression实现对象自动映射 void Main() {Person p1new(){Id1,Name"abc"};var persondto p1.MapTo<Person, PersonDto>();Console.WriteLine($"id:{persondto.Id}-name:{persondto.Name}"); }public static class AutoMapperExs { public s…...

《动手学深度学习(PyTorch版)》笔记7.2
注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…...

【MySQL进阶之路】BufferPool 生产环境优化经验
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…...

Vim工具使用全攻略:从入门到精通
引言 在软件开发的世界里,Vim不仅仅是一个文本编辑器,它是一个让你的编程效率倍增的神器。然而,对于新手来说,Vim的学习曲线似乎有些陡峭。本文将手把手教你如何从Vim的新手逐渐变为高手,深入理解Vim的操作模式&#…...

Chapter 8 - 7. Congestion Management in TCP Storage Networks
TCP Flow Monitoring versus I/O Flow Monitoring TCP flow monitoring shouldn’t be confused with I/O flow monitoring because of the following reasons: TCP 流量监控不应与 I/O 流量监控混淆,原因如下: 1. TCP belongs to the transport layer (layer 4) of the OS…...

带你快速入门js高级-基础
1.作用域 全局 scriptxx.js 局部 函数作用域{} 块作用域 const let 2.闭包 函数外有权访问函数内的变量, 闭包可以延长变量生命周期 function 函数名 () {return function () {// 这里的变量不会立刻释放} }3.垃圾回收 不在使用(引用的变量), 防止占用内存,需要…...

数据结构与算法-链表(力扣附链接)
之前我们对C语言进行了一定的学习,有了一些基础之后,我们就可以学习一些比较基础的数据结构算法题了。这部分的知识对于我们编程的深入学习非常有用,对于一些基本的算法,我们学习之后,就可以参加一些编程比赛了&#x…...

多线程JUC:等待唤醒机制(生产者消费者模式)
👨🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:多线程&JUC:解决线程安全问题——synchronized同步代码块、Lock锁 📚订阅专栏:多线程&am…...

无人机动力系统高倍率锂聚合物电池介绍,无人机锂电池使用与保养,无人机飞行控制动力源详解
无人机电池使用及保养 电池是无人机飞行的动力来源,也是一个消耗品,对电池充分了解,采取正确的使用方法,妥善进行维护保养将有助于提高飞行的安全性、延长电池的使用寿命。以下将详细对电池的使用和管理进行讲解。 高倍率锂聚合物电池的含义…...

[BeginCTF]真龙之力
安装程序 双击安装 出现了安装失败的标签,开发者不允许测试。 查看Mainfest入口文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" android:versionCo…...

手写分布式存储系统v0.3版本
引言 承接 手写分布式存储系统v0.2版本 ,今天开始新的迭代开发。主要实现 服务发现功能 一、什么是服务发现 由于咱们的服务是分布式的,那从服务管理的角度来看肯定是要有一个机制来知道具体都有哪些实例可以提供服务。举个例子就是,张三家…...

除夕快乐!
打印的简单实现,祝大家新的一年万事顺意! 龙年大吉! #include <stdio.h> #include <windows.h> #include <string.h>int main() {const char* message "除夕快乐!";int i;for (i 0; i < strlen(message);…...

17:定时器编程实战
1、实验目的 (1)使用定时器来完成LED闪烁 (2)原来实现闪烁时中间的延迟是用delay函数实现的,在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点 (3)本节用定时器来定一个时间(譬如0.3s),在这个定时器定时时间内…...

Fink CDC数据同步(五)Kafka数据同步Hive
6、Kafka同步到Hive 6.1 建映射表 通过flink sql client 建Kafka topic的映射表 CREATE TABLE kafka_user_topic(id int,name string,birth string,gender string ) WITH (connector kafka,topic flink-cdc-user,properties.bootstrap.servers 192.168.0.4:6668…...

ubuntu原始套接字多线程负载均衡
原始套接字多线程负载均衡是一种在网络编程中常见的技术,特别是在高性能网络应用或网络安全工具中。这种技术允许应用程序在多个线程之间有效地分配和处理网络流量,提高系统的并发性能。以下是关于原始套接字多线程负载均衡技术的一些介绍: …...

leetcode (算法)66.加一(python版)
需求 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入:digi…...

DataX源码分析 TaskGroupContainer
系列文章目录 一、DataX详解和架构介绍 二、DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 文章目录 系列文章目录TaskGroupContainer初始…...

2024年华为OD机试真题-螺旋数字矩阵-Java-OD统一考试(C卷)
题目描述: 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m(0 < n ≤ 999,0 < m ≤ 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成一个m行矩阵。 小明对这个矩阵有些要求: 1.每行数字的…...