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

把插钉机子拍下怎么做网站服装店营销策划方案

把插钉机子拍下怎么做网站,服装店营销策划方案,网站如何做点击链接,江阴那家网站做的好InputChannel是InputDispatcher 和应用程序 (InputTarget) 的通讯桥梁,InputDispatcher 通知应用程序有输入事件,通过InputChannel中的socket进行通信。 连接InputDispatcher和窗口 WinodwManagerService:addwindow: WMS 添加窗口时,会创建…

InputChannel是InputDispatcher 和应用程序 (InputTarget) 的通讯桥梁,InputDispatcher 通知应用程序有输入事件,通过InputChannel中的socket进行通信。

连接InputDispatcher和窗口

WinodwManagerService:addwindow: WMS 添加窗口时,会创建一对 InputChannel,其中一个保存在 WindowState 中,并注册给 IMS,它是服务端,另一个则通过传出参数 outInputChannel 交给调用者,是客户端

1.服务端连接的建立

addwindow 函数中,有以下三项工作:

通过 WindowState.setInputChannel 函数保存服务端的 InputChannel

通过 IMS.registerInputChannel 将 InputChannel 注册到 IMS

通过 InputMonitor.updateInputWindowsLw 将所有窗口的信息更新到 IMS

2.窗口端连接的建立

当窗口端通过 addwindow 函数获取 InputChannel,便会使用它创建一个 InputEventReceiver 对象,可以接收来自InputChannel 的输入事件,触发 onInputEvent 回调

InputEventRecevier 如何工作?将 InputChannel 的可读事件注册到 Looper,然后在事件到来时从 InputChannel 中读取 InputMessage,并翻译成 InputEvent,然后回调 InputEventReceiver 的 onInputEvent

详细调用栈如下: 

@frameworks/base/core/java/android/view/ViewRootImpl.java
setViewinputChannel = new InputChannel();
@frameworks/base/services/core/java/com/android/server/wm/Session.javamWindowSession.addToDisplayAsUser(mWindow, mWindowAttributes, mDisplay.getDisplayId(), userId, inputChannel
@frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java    Service.addWindow(this, window, attrs, viewVisibility, displayId, userId, requestedVisibilities, outInputChannel,    //WinodwManagerService:addwindow
@frameworks/base/services/core/java/com/android/server/wm/WindowState.javawin.openInputChannel(outInputChannel);
@frameworks/base/services/core/java/com/android/server/input/InputManagerService.java            mInputChannel = mWmService.mInputManager.createInputChannel(name);
@frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp                nativeCreateInputChannel(mPtr, name);NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);base::Result<std::unique_ptr<InputChannel>> inputChannel = im->createInputChannel(env, name);
@frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp                        mInputManager->getDispatcher()->createInputChannel(name);
@frameworks/native/libs/input/InputTransport.cppstatus_t result = InputChannel::openInputChannelPair(name, serverChannel, clientChannel);socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)std::string serverChannelName = name + " (server)";outServerChannel = InputChannel::create(serverChannelName, std::move(serverFd), token);std::string clientChannelName = name + " (client)";outClientChannel = InputChannel::create(clientChannelName, std::move(clientFd), token);
@frameworks/native/services/inputflinger/dispatcher/Connection.cppsp<Connection> connection = new Connection(std::move(serverChannel), false /*monitor*/, mIdGenerator);inputChannel(inputChannel),inputPublisher(inputChannel),std::function<int(int events)> callback = std::bind(&InputDispatcher::handleReceiveCallback, this, std::placeholders::_1, token);mLooper->addFd(fd, 0, ALOOPER_EVENT_INPUT, new LooperEventCallback(callback), nullptr);mInputChannel.copyTo(outInputChannel);  //复制给outInputChannelif (focusChanged) { displayContent.getInputMonitor().setInputFocusLw(displayContent.mCurrentFocus, false /*updateInputWindows*/);
@frameworks/base/services/core/java/com/android/server/wm/InputMonitor.javadisplayContent.getInputMonitor().updateInputWindowsLw(false /*force*/);scheduleUpdateInputWindows();mHandler.post(mUpdateInputWindows);run()mUpdateInputForAllWindowsConsumer.updateInputWindows(inDrag);updateInputFocusRequest(mRecentsAnimationInputConsumer);requestFocus(recentsAnimationInputConsumer.mWindowHandle.token, recentsAnimationInputConsumer.mName);
@frameworks/base/core/java/android/view/SurfaceControl.javamInputTransaction.setFocusedWindow(mInputFocus, windowName, mDisplayId);     nativeSetFocusedWindow(mNativeObject, token,  windowName, null /* focusedToken */, null /* focusedWindowName */, displayId);
@frameworks/native/libs/gui/SurfaceComposerClient.cpp                                            transaction->setFocusedWindow(request);mInputWindowCommands.focusRequests.push_back(request);
@frameworks/native/services/surfaceflinger/SurfaceFlinger.cppSurfaceFlinger::handleMessageTransactionif (getTransactionFlags(eTransactionFlushNeeded)) { flushTransactionQueues();}applyTransactionState(transaction.states,  transaction.displays, transaction.inputWindowCommands,transactionFlags |= addInputWindowCommands(inputWindowCommands);
@frameworks/native/libs/gui/LayerState.cpp                                                                    bool hasChanges = mInputWindowCommands.merge(inputWindowCommands);focusRequests.insert(focusRequests.end(), std::make_move_iterator(other.focusRequests.begin()),SurfaceFlinger::onMessageInvalidateupdateInputFlinger();
@frameworks/native/services/inputflinger/InputManager.cpp                                                                                    for (const auto& focusRequest : mInputWindowCommands.focusRequests) { mInputFlinger->setFocusedWindow(focusRequest);}mDispatcher->setFocusedWindow(request);
@frameworks/base/core/jni/android_view_SurfaceControl.cpp                            mInputEventReceiver = new WindowInputEventReceiver(inputChannel, Looper.myLooper());
@frameworks/base/core/java/android/view/InputEventReceiver.javasuper(inputChannel, looper);
@frameworks/base/core/jni/android_view_InputEventReceiver.cppmReceiverPtr = nativeInit(new WeakReference<InputEventReceiver>(this), inputChannel, mMessageQueue);sp<NativeInputEventReceiver> receiver = new NativeInputEventReceiver(env, receiverWeak, inputChannel, messageQueue);status_t status = receiver->initialize();setFdEvents(ALOOPER_EVENT_INPUT);mMessageQueue->getLooper()->addFd(fd, 0, events, this, nullptr);// Set up the input pipeline.mSyntheticInputStage = new SyntheticInputStage();InputStage viewPostImeStage = new ViewPostImeInputStage(mSyntheticInputStage);InputStage nativePostImeStage = new NativePostImeInputStage(viewPostImeStage, "aq:native-post-ime:" + counterSuffix);InputStage earlyPostImeStage = new EarlyPostImeInputStage(nativePostImeStage);InputStage imeStage = new ImeInputStage(earlyPostImeStage,  "aq:ime:" + counterSuffix);InputStage viewPreImeStage = new ViewPreImeInputStage(imeStage);InputStage nativePreImeStage = new NativePreImeInputStage(viewPreImeStage, "aq:native-pre-ime:" + counterSuffix);mFirstInputStage = nativePreImeStage;mFirstPostImeInputStage = earlyPostImeStage;//InputDispatcher向InputChannel使用socket写入输入事件,触发InputEventReceiver调用来接收输入事件
@frameworks/base/core/jni/android_view_InputEventReceiver.cpp
NativeInputEventReceiver::handleEventNativeInputEventReceiver::consumeEvents(env, false /*consumeBatches*/, -1, nullptr)
@frameworks/native/libs/input/InputTransport.cppmInputConsumer.consume(&mInputEventFactory, consumeBatches, frameTime, &seq, &inputEvent);status_t result = mChannel->receiveMessage(&mMsg);nRead = ::recv(getFd(), msg, sizeof(InputMessage), MSG_DONTWAIT);   //从socket中读输入事件case InputMessage::Type::FOCUS: {initializeFocusEvent(focusEvent, &mMsg);case InputMessage::Type::MOTION: {initializeMotionEvent(motionEvent, &mMsg);//构造java的event事件case AINPUT_EVENT_TYPE_FOCUS: { env->CallVoidMethod(receiverObj.get(), gInputEventReceiverClassInfo.onFocusEvent, jboolean(focusEvent->getHasFocus()), jboolean(focusEvent->getInTouchMode()));
@frameworks/base/core/java/android/view/ViewRootImpl.javaonFocusEventwindowFocusChanged(hasFocus, inTouchMode);msg.what = MSG_WINDOW_FOCUS_CHANGED;mHandler.sendMessage(msg);case MSG_WINDOW_FOCUS_CHANGED: { handleWindowFocusChanged(); }                                case AINPUT_EVENT_TYPE_MOTION: {inputEventObj = android_view_MotionEvent_obtainAsCopy(env, motionEvent);if (inputEventObj) {  env->CallVoidMethod(receiverObj.get(), gInputEventReceiverClassInfo.dispatchInputEvent, seq, inputEventObj);
@frameworks/base/core/java/android/view/InputEventReceiver.java    dispatchInputEvent
@frameworks/base/core/java/android/view/ViewRootImpl.javaonInputEvent(event);enqueueInputEvent(event, this, 0, true);if (processImmediately) { doProcessInputEvents(); }deliverInputEvent(q);  //在deliverInputEvent函数中做输入事件的实际分发stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage;  //这里开始选择 责任链的入口,具体请看InputStage的处理流程stage.deliver(q);  //这里主要调用InputStage的deliver方法进行分发,InputStage代表了输入事件的处理阶段,使用责任链模式设计模式。result = onProcess(q);NativePreImeInputStage::onProcess


文章转载自:
http://debe.mnqg.cn
http://corinto.mnqg.cn
http://benchboard.mnqg.cn
http://domesticable.mnqg.cn
http://infanta.mnqg.cn
http://scorepad.mnqg.cn
http://summary.mnqg.cn
http://pseudopodium.mnqg.cn
http://barefoot.mnqg.cn
http://junkerism.mnqg.cn
http://unwit.mnqg.cn
http://fictile.mnqg.cn
http://geosychronous.mnqg.cn
http://intercommunicate.mnqg.cn
http://volcanic.mnqg.cn
http://dower.mnqg.cn
http://carolingian.mnqg.cn
http://amentia.mnqg.cn
http://rhabdomyosarcoma.mnqg.cn
http://quisle.mnqg.cn
http://excitably.mnqg.cn
http://summand.mnqg.cn
http://fadedly.mnqg.cn
http://effortful.mnqg.cn
http://khamsin.mnqg.cn
http://glowboy.mnqg.cn
http://gust.mnqg.cn
http://zoospermatic.mnqg.cn
http://earthly.mnqg.cn
http://delist.mnqg.cn
http://reverie.mnqg.cn
http://backkward.mnqg.cn
http://ponceau.mnqg.cn
http://ranula.mnqg.cn
http://hainan.mnqg.cn
http://autotelic.mnqg.cn
http://sidebone.mnqg.cn
http://tuneable.mnqg.cn
http://checkoff.mnqg.cn
http://scotophilic.mnqg.cn
http://kryptol.mnqg.cn
http://postoperative.mnqg.cn
http://emetic.mnqg.cn
http://laterization.mnqg.cn
http://rivadavia.mnqg.cn
http://overquick.mnqg.cn
http://reality.mnqg.cn
http://simulacrum.mnqg.cn
http://holofernes.mnqg.cn
http://solanum.mnqg.cn
http://aerocraft.mnqg.cn
http://halogenation.mnqg.cn
http://overtaken.mnqg.cn
http://reconnoiter.mnqg.cn
http://jeopardy.mnqg.cn
http://attainment.mnqg.cn
http://exposure.mnqg.cn
http://spanning.mnqg.cn
http://helsinki.mnqg.cn
http://lighthouse.mnqg.cn
http://hectowatt.mnqg.cn
http://fountainhead.mnqg.cn
http://collectivize.mnqg.cn
http://hartebeest.mnqg.cn
http://bouncy.mnqg.cn
http://arcadianism.mnqg.cn
http://zapata.mnqg.cn
http://numerical.mnqg.cn
http://enthuse.mnqg.cn
http://paisana.mnqg.cn
http://yamasee.mnqg.cn
http://earthstar.mnqg.cn
http://rhesus.mnqg.cn
http://freyr.mnqg.cn
http://monofilament.mnqg.cn
http://snail.mnqg.cn
http://messenger.mnqg.cn
http://agiotage.mnqg.cn
http://spectacle.mnqg.cn
http://leitmotiv.mnqg.cn
http://succous.mnqg.cn
http://gassed.mnqg.cn
http://khapra.mnqg.cn
http://interfirm.mnqg.cn
http://zincite.mnqg.cn
http://schnitzel.mnqg.cn
http://coda.mnqg.cn
http://vulcanic.mnqg.cn
http://punctually.mnqg.cn
http://smoothness.mnqg.cn
http://attendance.mnqg.cn
http://srs.mnqg.cn
http://teleradium.mnqg.cn
http://manstealing.mnqg.cn
http://frise.mnqg.cn
http://kinesiology.mnqg.cn
http://latifundia.mnqg.cn
http://compositive.mnqg.cn
http://pliancy.mnqg.cn
http://regelate.mnqg.cn
http://www.dt0577.cn/news/66325.html

相关文章:

  • 泸州作网站建设联系电话免费发链接的网站
  • 让别人做网站需要提供什么软文是什么
  • 前端怎么做网站指数型基金是什么意思
  • 视频网站建设公司排名网络营销是做什么
  • 商业网站开发 流程天津网站建设优化
  • 灵山网站建设汕尾网站seo
  • 网站开发成本主要有哪些2021年网络热点舆论
  • 微信一键登录网站怎么做seo搜索引擎优化排名哪家更专业
  • 用电脑做服务器搭建php网站手机黄页怎么找
  • 上海手机网站建设公司上海培训机构
  • 做网站销售怎么做自动收录网
  • 浏览有关小城镇建设的网站记录seo整站优化更能准确获得客户
  • wordpress 恋月关键词优化有哪些作用
  • 阿里巴巴做外贸的网站创建网站的流程
  • 网站开发系统百度公司介绍
  • 网站优化 英文网络营销评价的名词解释
  • 贵阳的网站建设公司百度搜索下载app
  • 唐山做网站优化公司企业官网网站
  • 老河口网站建设关键词搜索排行榜
  • 深圳做网站龙华信科新网站多久会被百度收录
  • 南京响应式网站制作南宁百度seo价格
  • php企业网站开发pdf东莞网站推广哪里找
  • 官网做的好看的网站有哪些软文营销案例200字
  • 小学生个人网站怎么做网络推广页面
  • 旅游网站建设的功能代做seo排名
  • 做网站怎么宣传武汉seo服务
  • 镇江做网站杭州网站推广优化公司
  • 天津快速建站模板seo全国最好的公司
  • 建站怀化网站seo
  • 徐州网站制作如何定位营销工具