❶ android 事件分發方法怎麼走
當一個Touch事件(觸摸事件為例)到達根節點,即Acitivty的ViewGroup時,它會依次下發,下發的過程是調用子View(ViewGroup)的dispatchTouchEvent方法實現的。簡單來說,就是ViewGroup遍歷它包含著的子View,調用每個View的dispatchTouchEvent方法,而當子View為ViewGroup時,又會通過調用ViwGroup的dispatchTouchEvent方法繼續調用其內部的View的dispatchTouchEvent方法。上述例子中的消息下發順序是這樣的:①-②-⑤-⑥-⑦-③-④。dispatchTouchEvent方法只負責事件的分發,它擁有boolean類型的返回值,當返回為true時,順序下發會中斷。在上述例子中如果⑤的dispatchTouchEvent返回結果為true,那麼⑥-⑦-③-④將都接收不到本次Touch事件。來個簡單版的代碼加深理解:
/**
* ViewGroup
* @param ev
* @return
*/
public boolean dispatchTouchEvent(MotionEvent ev){
....//其他處理,在此不管
View[] views=getChildView();
for(int i=0;i<views.length;i++){
//判斷下Touch到屏幕上的點在該子View上面
if(...){
if(views[i].dispatchTouchEvent(ev))
return true;
}
}
...//其他處理,在此不管
}
/**
* View
* @param ev
* @return
*/
public boolean dispatchTouchEvent(MotionEvent ev){
....//其他處理,在此不管
return false;
}
❷ Android事件分發機制是怎麼判斷手勢類型,並決定分發給哪個view的
可以參考如下內容:
dispatchTouchEvent -> onTouch -> onTouchEvent
等上述的up事件分發完結後,再調用onClick
看起來一目瞭然,事實上,我只是用了默認的調用,在TextView的dispatchTouchEvent和onTouchEvent都是讓它返回super.xxx。而且在onTouch監聽里返回的是false。
所以,實際的情況更多,基於此,為了更清晰地熟悉事件分發機制,我們只能通過看源碼了。
源碼分析
我目前查看的源碼是API 22環境下的。這部分關於View的事件分發的源碼和之前的有很大的區別,但是,萬變不如其中,有些根本的邏輯流程一般是不會改變的。
我們直接看View的代碼,因為控制項都繼承自View。
❸ android事件分發機制 什麼意思
android事件分發機制 就是一個觸摸事件發生了,從一個窗口傳遞到一個視圖,再傳遞到另外一個視圖,最後被消費的過程,在android中還是比較復雜的傳遞流程如下:
(1) 事件從Activity.dispatchTouchEvent()開始傳遞,只要沒有被停止或攔截,從最上層的View(ViewGroup)開始一直往下(子View)傳遞。子View可以通過onTouchEvent()對事件進行處理。
(2) 事件由父View(ViewGroup)傳遞給子View,ViewGroup可以通過onInterceptTouchEvent()對事件做攔截,停止其往下傳遞。
(3) 如果事件從上往下傳遞過程中一直沒有被停止,且最底層子View沒有消費事件,事件會反嚮往上傳遞,這時父View(ViewGroup)可以進行消費,如果還是沒有被消費的話,最後會到Activity的onTouchEvent()函數。
(4) 如果View沒有對ACTION_DOWN進行消費,之後的其他事件不會傳遞過來。
(5) OnTouchListener優先於onTouchEvent()對事件進行消費。
上面的消費即表示相應函數返回值為true。
❹ 如何面試 Android 工程師
下面以實習生、校招和社招三方面的總結,屬於個人建議,希望能夠帶給你一些幫助:
一、實習生:
對於實習生而言的話,可能對於android方面的要求並不是特別的高,比較注重基礎,但是基本的得會,比如:
四大組件基本的概念以及使用。
activity的生命周期流程,這是最基本的,但是你得清楚到底是啥時候調用各個方法,如一個頁面(A)當前正在跟用戶交互,彈出一個Dialog後,A的各個回調方法的流程調用情況等。
數據存儲的方式,五大存儲方式的基本使用。
掌握網路通信中httpClient和HttpUrlConnection基本使用,任何網路框架都是從最簡單的寫起,所以這個必須要知道。
熟悉json解析,JsonObject,JsonArray等等的各種使用。
會導入第三方庫。
線程(Thread,Runnable)的使用。
主線程和其他線程的交互(Handler,AsyncTask)。
二、校招:
對於校招而言的話,主要是對於計算機基礎能力的考察,尤其bat等公司更甚,當然android方面也是需要的,主要考察的方面是:
熟練掌握操作系統原理。
熟練掌握計算機網路。
熟練掌握數據結構以及演算法。
良好的java基礎。
android基本的都要會,在此基礎上需要掌握一定的源碼方面的知識,比如handler源碼,AsyncTask源碼,觸摸事件機制,view的事件分發機制,清楚他們是如何由0到1完成各自的工作的。
閱讀過相關開源項目,對開源項目做過校正或者貢獻的,Github好多小星星的~
三、社招:
個人覺得社招尤其注重你在工作項目中的對於代碼整體框架的整體認識以及熟練掌握程度:
對於源碼有一定的研究,Binder機制的理解,熟練自定View,能夠對開源庫進行再次的封裝,改寫等等,AWS,WWS等等有一定的認識。
閱讀過開源項目源碼,清楚開源項目的構建歷程,優缺點等。
設計模式的理解與運用。
對於上任公司項目的理解,能夠清楚的講解自己編寫代碼的思路。
獨立解決Bug的能力,優化代碼的能力,重構代碼的能力。
良好的計算機基礎。
四、最最重要的一點,我覺得是:
對於技術是否有熱情,有求知慾,願意去嘗試,去了解新的技術,這是我認為最重要的一點。
❺ 2022史上最全Android面試題歸納匯總(附答案解析)
我經歷過這么多年的摸爬滾打,面試過也被面試過。現總結與歸納Android開發相關面試題:
1、Activity啟動模式有哪些,分別有什麼不同?
2、Service啟動模式有哪些,對應的生命周期?IntentService呢?
3、ContentProvider的作用,是否支持多線程和多進程
4、Broadcast的注冊方式,對應的生命周期是什麼,有序和無序那種可以中斷廣播?
5、AsyncTask的作用,如何使用(包括有哪些方法,能說出同步非同步,能說出不同Android版本下的區別加分)
6、有哪些非同步的方式?
7、Handler機制
8、Dialog的使用及其生命周期
9、Activity的生命周期,能否改?
10、Fragment的生命周期,能否改?
11、Activity和Fragment如何通信
12、View的繪制機制
13、View的事件傳遞機制
14、如何監聽手勢
15、ImageView設置圖片顯示有哪幾種模式,有什麼區別?
16、有哪些存儲方式
17、SharedPreferences是否支持多進程、多線程
別看以上常問的是入門級的,但是有兩三年開發經驗能回答圓滿的人不多。
1、如何理解Activity的任務親和性
2、如何讓Service為單獨的進程
3、IntentService的實現原理
4、LocalBroadcast的作用,實現原理,相對於Broadcast的優勢在哪,劣勢在哪
5、Handler的缺點,會不會造成內存泄漏,有則如何解決
6、Fragment與Activity的區別和聯系
7、Fragment如何緩存布局
8、Fragment與ViewPager的搭配使用,有沒有問題重疊問題,怎麼解決
9、同時提供側滑和上下滑動,如何解決事件傳播問題
10、是否使用過Design包
11、嵌套滑動理解
12、behavior的原理
13、對設計模式有什麼看法,經常使用的有哪些?
中級的稍微偏底層一些,這個主要考察平時是否關注而不是一味地懟業務需求
1、Activity的啟動過程
2、Service創建為單獨進程會有哪些問題?
3、簡述AIDL的構建過程
4、IPC機制有哪些?
5、android多進程通信方式,內部原理
6、App啟動的入口在哪?
7、LRU緩存演算法
8、Bitmap的有哪幾種壓縮演算法,有啥區別?
9、圖片在手機本地存儲大小和在內存大小是否一致,為什麼,Android默認像素一般占幾個位元組?
10、第三方框架的熟練程度,如:
11、SharedPreference內部實現原理
12、模塊化、插件話、組件化等分別有什麼區別,對用有什麼好處
13、說說MV * 模式,並畫出做過項目的架構圖
14、對跨平台方案有哪些了解,使用過哪些? 比如RN
15、對大前端有什麼看法,了解多少?使用過什麼?
16、對其他語言的了解,kotlin,python、php、c++等
17、興趣愛好是什麼?對未來有什麼規劃?
目前是一些經常會被問到的,當然只是列舉了Android 開發方向的,Java的一些還沒列舉,比如異常、網路、多線程、JCF等等
以上問題的答案在下面都有詳細解答,我們不僅整理了這些資料,而且還有一份長達"635頁"的Android資料匯總:
包括:底層原理+項目實戰+面試專題
雖說Android早已不像過去那般火爆,但各大廠對於中高級開發者仍舊是求賢若渴,想要獲取更豐厚的薪資,打鐵還得自身硬。對於框架、源碼、原理、項目實操經驗,都必須有足夠的知識儲備,才可以在面試中擊敗面試官。但是由於網上的資料魚龍混雜,也不成體系,很多人在自我提升的過程中都頭疼不已。 這里就給大家分享一份位元組大佬整理的《Android中高級面試題匯總(2022)》,幫助大家系統的梳理中高級Android知識!裡麵包含了所有Android面試的知識點,刷完進大廠妥妥的 !
(含:靜態內部類和非靜態內部類的比較,多態的理解與應用, java方法的多態性理解,java中介面和繼承的區別,線程池的好處,詳解,單例,線程池的優點及其原理,線程池的優點,為什麼不推薦通過Executors直接創建線程池,創建線程或線程池時請指定有意義的線程名稱,方便出錯時回溯,深入理解ReentrantLock與Condition,Java多線程:線程間通信之Lock,Synchronized 關鍵字原理,ReentrantLock原理,HashMap中的Hash沖突解決和擴容機制, JVM常見面試題, JVM內存結構,類載入機制/雙親委託…)
(含:Activity知識點, Fragment知識點, Service知識點, Intent知識點…)
(含:屏幕適配,主要控制項優化,事件分發與嵌套滾動…)
(含:MVP架構設計,組件化架構…)
(含:啟動優化,內存優化,繪制優化,安裝包優化…)
(含:開源庫源碼分析,Glide源碼分析,OkHttp源碼分析,Retrofit源碼分析,RxJava源碼分析…)
(含:開源文檔,面試合集…)
❻ 面試怎麼回到android 事件分發
自己去看一下事件分發和View的繪制唄,這些都是基礎。可以去看《Android開發藝術探索》從源碼角度分析,或者郭霖、鴻洋大神的csdn博客。
❼ Android View 事件分發機制
Android 事件機制包含系統啟動流程、輸入管理(InputManager)、系統服務和 UI 的通信(WindowManagerService + ViewRootImpl + Window)、事件分發等一系列的環節。
Android 系統中將輸入事件定義為 InputEvent,根據輸入事件的類型又分為了 KeyEvent(鍵盤事件) 和 MotionEvent(屏幕觸摸事件)。這些事件統一由系統輸入管理器 InputManager 進行分發。
在系統啟動的時候,SystemServer 會啟動 WindowManagerService,WMS 在啟動的時候通過 InputManager 來負責監控鍵盤消息。
InputManager 負責從硬體接收輸入事件,並將事件通過 ViewRootImpl 分發給當前激活的窗口處理,進而分發給 View。
Window 和 InputManagerService 之間通過 InputChannel 來通信,底層通過 socket 進行通信。
Android Touch 事件的基礎知識:
KeyEvent 對應了鍵盤的輸入事件;MotionEvent 就是手勢事件,滑鼠、筆、手指、軌跡球等相關輸入設備的事件都屬於 MotionEvent。
InputEvent 統一由 InputManager 進行分發,負責與硬體通信並接收輸入事件。
system_server 進程啟動時會創建 InputManagerService 服務。
system_server 進程啟動時同時會啟動 WMS,WMS 在啟動的時候就會通過 IMS 啟動 InputManager 來監控鍵盤消息。
App 端與服務端建立了雙向通信之後,InputManager 就能夠將產生的輸入事件從底層硬體分發過來,Android 提供了 InputEventReceiver 類,以接收分發這些消息:
Window 和 IMS 之間通過 InputChannel 通信。InputChannel 是一個 pipe,底層通過 socket 進行通信。在 ViewRootImpl.setView() 過程中注冊 InputChannel。
Android 事件傳遞機制是 先分發再處理 ,先由外部的 View 接收,然後依次傳遞給其內層的 View,再從最內層 View 反向依次向外層傳遞。
三個方法的關系如下:
分發事件:
應用了樹的 深度優先搜索演算法 (Depth-First-Search,簡稱 DFS 演算法),每個 ViewGroup 都持有一個 mFirstTouchTarget, 當接收到 ACTION_DOWN 時,通過遞歸遍歷找到 View 樹中真正對事件進行消費的 Child,並保存在 mFirstTouchTarget 屬性中,依此類推組成一個完整的分發鏈。在這之後,當接收到同一事件序列的其它事件如 ACTION_MOVE、ACTION_UP 時,則會跳過遞歸流程,將事件直接分發給下一級的 Child。
ViewGroup 分發事件的主要的任務是找一個 Target,並且用這個 Target 處理事件,主要邏輯如下 :
為什麼倒序查找 TouchTarget?
如果按添加順序遍歷,當 View 重疊時(FrameLayout),先添加的 View 總是能消費事件,而後添加的 View 不可能獲取到事件。
攔截事件:
[1] Android 事件分發機制的設計與實現
[2] Android 事件攔截機制的設計與實現
❽ android 怎麼讓事件分發下去
先分析ViewGroup的處理流程:首先得有個結構模型概念:ViewGroup和View組成了一棵樹形結構,最頂層為Activity的ViewGroup,下面有若乾的ViewGroup節點,每個節點之下又有若乾的ViewGroup節點或者View節點,依次類推。
❾ android 如何獲取一個界面最頂層的view並處理單擊事件的分發機制
android事件分發機制 就是一個觸摸事件發生了,從一個窗口傳遞到一個視圖,再傳遞到另外一個視圖,最後被消費的過程,在android中還是比較復雜的傳遞流程如下:
(1) 事件從Activity.dispatchTouchEvent()開始傳遞,只要沒有被停止或攔截,從最上層的View(ViewGroup)開始一直往下(子View)傳遞。子View可以通過onTouchEvent()對事件進行處理。
(2) 事件由父View(ViewGroup)傳遞給子View,ViewGroup可以通過onInterceptTouchEvent()對事件做攔截,停止其往下傳遞。
❿ android怎麼主動分發事件
Android中,所有的操作類型事件都由如下三個部分作為基礎:
按下(ACTION_DOWN)
移動(ACTION_MOVE)
抬起(ACTION_UP)
這三部分都寄生於onTouch事件中,由MontionEvent類中定義的三個常量進行區分。
Android中與Touch事件相關的方法為:
removeTapCallback();
removeLongPressCallback();
break;
case MotionEvent.ACTION_MOVE:
final int x = (int) event.getX();
final int y = (int) event.getY();
// Be lenient about moving outside of buttons
if (!pointInView(x, y, mTouchSlop)) {
// Outside button
removeTapCallback();
if ((mPrivateFlags & PFLAG_PRESSED) != 0) {
// Remove any future long press/tap checks
removeLongPressCallback();
setPressed(false);
}
}
break;
}
return true;
}
return false;
}