欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

DecorView以及Window的傳遞順序

DecorView、PhoneWindow和Activity/Dialog之間傳遞的順序是什么,下面我們來(lái)看看Input系統(tǒng)、Framework層、DecorView和Activity的相關(guān)內(nèi)容,相信大家就能理解事件先到DecorView的本質(zhì)原因了。

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出含山免費(fèi)做網(wǎng)站回饋大家。

DecorView以及Window的傳遞順序

1、Input系統(tǒng)

當(dāng)用戶觸摸屏幕或者按鍵操作,首次觸發(fā)的是硬件驅(qū)動(dòng),驅(qū)動(dòng)收到事件后,將該相應(yīng)事件寫入到輸入設(shè)備節(jié)點(diǎn),這便產(chǎn)生了最原生態(tài)的內(nèi)核事件。接著,輸入系統(tǒng)取出原生態(tài)的事件,經(jīng)過(guò)層層封裝后成為KeyEvent或者M(jìn)otionEvent;最后,交付給相應(yīng)的目標(biāo)窗口(Window)來(lái)消費(fèi)該輸入事件。

(1)當(dāng)屏幕被觸摸,Linux內(nèi)核會(huì)將硬件產(chǎn)生的觸摸事件包裝為Event存到/dev/input/event[x]目錄下。

(2)Input系統(tǒng)—InputReader線程:loop起來(lái)讓EventHub調(diào)用getEvent()不斷的從/dev/input/文件夾下讀取輸入事件。然后轉(zhuǎn)換成EventEntry事件加入到InputDispatcher的mInboundQueue。

(3)Input系統(tǒng)—InputDispatcher線程:從mInboundQueue隊(duì)列取出事件,轉(zhuǎn)換成DispatchEntry事件加入到connection的outboundQueue隊(duì)列。再然后開(kāi)始處理分發(fā)事件 (比如分發(fā)到ViewRootImpl的WindowInputEventReceiver中),取出outbound隊(duì)列,放入waitQueue.

(4)Input系統(tǒng)—UI線程:創(chuàng)建socket pair,分別位于”InputDispatcher”線程和focused窗口所在進(jìn)程的UI主線程,可相互通信。

2、Framework層

//InputEventReceiver.dispachInputEvent()

private void dispatchInputEvent(int seq, InputEvent event)

mSeqMap.put(event.getSequenceNumber(), seq)

onInputEvent(event);

}

Native層通過(guò)JNI執(zhí)行Framework層的InputEventReceiver.dispachInputEvent(),而真正調(diào)用的是繼承了InputEventReceiver的ViewRootImpl.WindowInputEventReceiver。所以這里執(zhí)行的WindowInputEventReceiver的dispachInputEvent():

final class WindowInputEventReceiver extends InputEventReceiver {

public void onInputEvent(InputEvent event) {

enqueueInputEvent(event, this, 0, true);

}

}

ViewRootImpl

void enqueueInputEvent(InputEvent event,

InputEventReceiver receiver, int flags, boolean processImmediately) {

if (processImmediately) {

 //關(guān)鍵點(diǎn):執(zhí)行Input事件

doProcessInputEvents();

} else {

 //走一遍Handler延遲處理事件

scheduleProcessInputEvents();

}

}

void doProcessInputEvents() {

while (mPendingInputEventHead != null) {

QueuedInputEvent q = mPendingInputEventHead;

mPendingInputEventHead = q.mNext;

if (mPendingInputEventHead == null) {

mPendingInputEventTail = null;

}

q.mNext = null;

mPendingInputEventCount -= 1;

Trace.traceCounter(Trace.TRACE_TAG_INPUT, mPendingInputEventQueueLengthCounterName,

mPendingInputEventCount);

long eventTime = q.mEvent.getEventTimeNano();

long oldestEventTime = eventTime;

if (q.mEvent instanceof MotionEvent) {

MotionEvent me = (MotionEvent)q.mEvent;

if (me.getHistorySize() > 0) {

oldestEventTime = me.getHistoricalEventTimeNano(0);

}

}

mChoreographer.mFrameInfo.updateInputEventTime(eventTime, oldestEventTime);

//關(guān)鍵點(diǎn):進(jìn)一步派發(fā)事件處理

deliverInputEvent(q);

}

}

private void deliverInputEvent(QueuedInputEvent q) {

Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "deliverInputEvent",

q.mEvent.getSequenceNumber());

if (mInputEventConsistencyVerifier != null) {

mInputEventConsistencyVerifier.onInputEvent(q.mEvent, 0);

}

InputStage stage;

if (q.shouldSendToSynthesizer()) {

stage = mSyntheticInputStage;

} else {

stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage;

}

if (stage != null) {

//關(guān)鍵點(diǎn):上面決定將事件派發(fā)到那個(gè)InputStage中處理

stage.deliver(q);

} else {

finishInputEvent(q);

}

}

ViewRootImpl.ViewPostImeInputStage

前面事件會(huì)派發(fā)到ViewRootImpl.ViewPostImeInputStage中處理,它的父類InputStage.deliver()方法會(huì)調(diào)用apply()來(lái)處理Touch事件:

@Override

protected int onProcess(QueuedInputEvent q) {

if (q.mEvent instanceof KeyEvent) {

return processKeyEvent(q);

} else {

final int source = q.mEvent.getSource();

if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {

//關(guān)鍵點(diǎn):執(zhí)行分發(fā)touch事件

return processPointerEvent(q);

} else if ((source & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) {

return processTrackballEvent(q);

} else {

return processGenericMotionEvent(q);

}

}

}

private int processPointerEvent(QueuedInputEvent q) {

final MotionEvent event = (MotionEvent)q.mEvent;

//關(guān)鍵點(diǎn):mView分發(fā)Touch事件,mView就是DecorView

boolean handled = mView.dispatchPointerEvent(event);

maybeUpdatePointerIcon(event);

maybeUpdateTooltip(event);

}

3、DecorView

如果你熟悉安卓的Window,Activity和Dialog對(duì)應(yīng)的ViewRootImpl成員mView就是DecorView,View的dispatchPointerEvent()代碼如下:

//View.java

public final boolean dispatchPointerEvent(MotionEvent event) {

if (event.isTouchEvent())

 //分發(fā)Touch事件

return dispatchTouchEvent(event)

} else {

return dispatchGenericMotionEvent(event);

}

}

因?yàn)镈ecorView繼承FrameLayout,上面所以會(huì)調(diào)用DecorView的dispatchTouchEvent():

@Override

public boolean dispatchTouchEvent(MotionEvent ev)

final Window.Callback cb = mWindow.getCallback()

 return cb != null && !mWindow.isDestroyed() && mFeatureId < 0

cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev);

}

上面Window.Callback都被Activity和Dialog實(shí)現(xiàn),所以變量cb可能就是Activity和Dialog。

4、Activity

當(dāng)上面cb是Activity時(shí),執(zhí)行Activity的dispatchTouchEvent():

public boolean dispatchTouchEvent(MotionEvent ev) {

if (ev.getAction() == MotionEvent.ACTION_DOWN) {

onUserInteraction();

}

if (getWindow().superDispatchTouchEvent(ev)) {//關(guān)鍵點(diǎn):getWindow().superDispatchTouchEvent(ev)

return true;

}

return onTouchEvent(ev);

}

如果你熟悉安卓的Window,Activity的getWindow()拿到的就是PhoneWindow,下面是PhoneWindow的代碼:

//PhoneWindow.java

@Override

public boolean superDispatchTouchEvent(MotionEvent event)

 //調(diào)用DecorView的superDispatchTouchEvent

return mDecor.superDispatchTouchEvent(event);

}

下面是DecorView.superDispatchTouchEvent()代碼:

//DecorView.java

public boolean superDispatchTouchEvent(MotionEvent event)

 //調(diào)用ViewGroup的dispatchTouchEvent()開(kāi)始我們常見(jiàn)的分發(fā)Touch事件

return super.dispatchTouchEvent(event);

}

因?yàn)榻怦畹脑?,所以要DecorView -> Activity -> PhoneWindow -> DecorView傳遞事件。ViewRootImpl并不知道有Activity這種東西存在!它只是持有了DecorView。所以,不能直接把觸摸事件送到Activity.dispatchTouchEvent();不直接分發(fā)給DecorView,而是要通過(guò)PhoneWindow來(lái)間接發(fā)送也是因?yàn)锳ctivity不知道有DecorView!但是,Activity持有PhoneWindow,而PhoneWindow當(dāng)然知道自己的窗口里有些什么了,所以能夠把事件派發(fā)給DecorView。在Android中,Activity并不知道自己的Window中有些什么,這樣耦合性就很低了。不管Window里面的內(nèi)容如何,只要Window仍然符合Activity制定的標(biāo)準(zhǔn),那么它就能在Activity中很好的工作。當(dāng)然,這就是解耦所帶來(lái)的擴(kuò)展性的好處。

看完上訴內(nèi)容,你們對(duì)DecorView以及Window的傳遞順序大概了解了嗎?如果想了解更多,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道哦!

分享名稱:DecorView以及Window的傳遞順序
網(wǎng)頁(yè)路徑:http://aaarwkj.com/article42/peihhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、軟件開(kāi)發(fā)外貿(mào)建站、企業(yè)建站自適應(yīng)網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
国产极白丝白浆日本国产| 欧美日韩69av网| 国产乱码精品一区二区三区爽爽爽| 日韩一区二区三区免费播放| 日本在线观看免费高清| 久久夜色精品亚洲国产| 国产三级三级三级三级| 麻豆久久av免费观看| 国产又粗又长又大又长| 国产日韩精品欧美综合区| 日韩特级黄片在线免费观看| 這裏隻有无码人妻久久| 亚洲一区二区三区欧美精品| 日本不卡二区高清三区| 日本韩国三级伦理在线观看| 青青草视频免费公开播放| 久久精品熟女亚洲av色| 日本中文一区在线观看| 国产一级黄色免费大片| 国产精品伊人久久精品| 日韩av高清不卡一区二区三区 | av天堂男人站在线观看| 久久成人激情免费视频| 亚洲天堂av成人在线观看| 亚洲国产精品中文字幕一区久久 | 亚洲高清成人综合网站| 粉嫩在线一区二区懂色| 欧美日韩一区中文字幕| 日韩不卡永久免费视频观看| 日韩欧美短视频在线观看| 欧美日本午夜福利在线观看| 热九九这里只有热九九| 青青草原这里只有精品| 亚洲精品中文一区二区三区| 亚洲精品一区二区三区pp| 日韩精品在线观看大全套| 一区二区三区高清人妻日本| 国产一区二区黑丝美女| 极品少妇一级人妻av| 日韩亚洲欧美国产另类| 尤物视频网站在线观看|