bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

DecorView以及Window的傳遞順序

DecorView、PhoneWindow和Activity/Dialog之間傳遞的順序是什么,下面我們來看看Input系統、Framework層、DecorView和Activity的相關內容,相信大家就能理解事件先到DecorView的本質原因了。

公司主營業務:網站設計制作、成都網站建設、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。成都創新互聯公司是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創新互聯公司推出含山免費做網站回饋大家。

DecorView以及Window的傳遞順序

1、Input系統

當用戶觸摸屏幕或者按鍵操作,首次觸發的是硬件驅動,驅動收到事件后,將該相應事件寫入到輸入設備節點,這便產生了最原生態的內核事件。接著,輸入系統取出原生態的事件,經過層層封裝后成為KeyEvent或者MotionEvent;最后,交付給相應的目標窗口(Window)來消費該輸入事件。

(1)當屏幕被觸摸,Linux內核會將硬件產生的觸摸事件包裝為Event存到/dev/input/event[x]目錄下。

(2)Input系統—InputReader線程:loop起來讓EventHub調用getEvent()不斷的從/dev/input/文件夾下讀取輸入事件。然后轉換成EventEntry事件加入到InputDispatcher的mInboundQueue。

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

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

2、Framework層

//InputEventReceiver.dispachInputEvent()

private void dispatchInputEvent(int seq, InputEvent event)

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

onInputEvent(event);

}

Native層通過JNI執行Framework層的InputEventReceiver.dispachInputEvent(),而真正調用的是繼承了InputEventReceiver的ViewRootImpl.WindowInputEventReceiver。所以這里執行的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) {

 //關鍵點:執行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);

//關鍵點:進一步派發事件處理

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) {

//關鍵點:上面決定將事件派發到那個InputStage中處理

stage.deliver(q);

} else {

finishInputEvent(q);

}

}

ViewRootImpl.ViewPostImeInputStage

前面事件會派發到ViewRootImpl.ViewPostImeInputStage中處理,它的父類InputStage.deliver()方法會調用apply()來處理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) {

//關鍵點:執行分發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;

//關鍵點:mView分發Touch事件,mView就是DecorView

boolean handled = mView.dispatchPointerEvent(event);

maybeUpdatePointerIcon(event);

maybeUpdateTooltip(event);

}

3、DecorView

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

//View.java

public final boolean dispatchPointerEvent(MotionEvent event) {

if (event.isTouchEvent())

 //分發Touch事件

return dispatchTouchEvent(event)

} else {

return dispatchGenericMotionEvent(event);

}

}

因為DecorView繼承FrameLayout,上面所以會調用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實現,所以變量cb可能就是Activity和Dialog。

4、Activity

當上面cb是Activity時,執行Activity的dispatchTouchEvent():

public boolean dispatchTouchEvent(MotionEvent ev) {

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

onUserInteraction();

}

if (getWindow().superDispatchTouchEvent(ev)) {//關鍵點:getWindow().superDispatchTouchEvent(ev)

return true;

}

return onTouchEvent(ev);

}

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

//PhoneWindow.java

@Override

public boolean superDispatchTouchEvent(MotionEvent event)

 //調用DecorView的superDispatchTouchEvent

return mDecor.superDispatchTouchEvent(event);

}

下面是DecorView.superDispatchTouchEvent()代碼:

//DecorView.java

public boolean superDispatchTouchEvent(MotionEvent event)

 //調用ViewGroup的dispatchTouchEvent()開始我們常見的分發Touch事件

return super.dispatchTouchEvent(event);

}

因為解耦的原因,所以要DecorView -> Activity -> PhoneWindow -> DecorView傳遞事件。ViewRootImpl并不知道有Activity這種東西存在!它只是持有了DecorView。所以,不能直接把觸摸事件送到Activity.dispatchTouchEvent();不直接分發給DecorView,而是要通過PhoneWindow來間接發送也是因為Activity不知道有DecorView!但是,Activity持有PhoneWindow,而PhoneWindow當然知道自己的窗口里有些什么了,所以能夠把事件派發給DecorView。在Android中,Activity并不知道自己的Window中有些什么,這樣耦合性就很低了。不管Window里面的內容如何,只要Window仍然符合Activity制定的標準,那么它就能在Activity中很好的工作。當然,這就是解耦所帶來的擴展性的好處。

看完上訴內容,你們對DecorView以及Window的傳遞順序大概了解了嗎?如果想了解更多,歡迎關注創新互聯行業資訊頻道哦!

分享名稱:DecorView以及Window的傳遞順序
網頁路徑:http://vcdvsql.cn/article42/peihhc.html

成都網站建設公司_創新互聯,為您提供手機網站建設軟件開發外貿建站企業建站自適應網站營銷型網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站優化排名