這是我這麼多次京東面試中印象最深刻的一次,很難受,也不知道誰有這種感受,一面過了,二面15號但是15學校考試 衝突了.
突然在12號下午收到簡訊去上海面試(本人廣西 飛機3小時 ).於是13從沖沖去訂機票,13號一早訂機票 到14晚上1點到(晚上10點機票 因為錢少),我完全沒去過上海,下飛機一直不知道出口在哪...然後一個黑車司機問我要不要住店 和打車.我沒理他 ,一直糾纏我..... 然後看到工作人員說出租車在那邊出去...... 然後再美團訂了個酒店 然後打車過去了.車費80心疼 我真農村的.... 到酒店晚上3點了.我發現我簡歷沒有做於是做簡歷,到晚上5點,睡到6點.然後出去上海鹿角嘴酒店 .我這邊在郊區必須早去 市區酒店有些貴.
到酒店 一樓有個電視提示 面試在3樓,到了之後掃碼簽到.收到簡訊說道XXX面試官面試.後面就是大家關心的面試內容
5分鐘自我介紹 ,面試官看簡歷,我說"我是一個專升本 的同學,也許學歷在京東中是最低的了.(面試官 說不 你很好 很親切) ,然後我就說我在北京工作一年 的事情,我們公司CTO是北京郵電大學教授,
在貝爾實驗室工作過 ,經常受他指導.做過3個商業專案 XXXX,YYYYY,ZZZZ. 還有一個自己無聊做的漫畫軟體,介面資料抓取其他漫畫app.還有xposed 模組開發小米商城秒殺商品,和超星爾雅app 破解刷課,
學校的教務搶課指令碼"
然後面試官叫我 選擇一個 你自己影響最大的專案,我選擇了xposed 破解超星爾雅刷課視訊.提到了xposed原理,還有提到了免註冊啟動activity 原理,涉及handler原理(這裡我擴張到ActivityThread,threadLoal 一些其他知識) activity啟動原理 ,aidl原理.這裡我就不寫我怎麼回答了(我想涉及到jadx和smai,動態偵錯 沒機會了).
然後面試官就問我 訊息推播,這一塊對於想進bat的同學不難吧(反正騰訊 和阿里我掛了).訊息推播無非兩種 push 和pull ,一種是一直迴圈 拉取,一種是長連線(xmpp.xqtt),因為xmpp由於資訊載體過大 所以我選擇xqtt的應用層協定.
.....這裡說就點長了略過...... 關鍵是app包活才是關鍵(我涉及到native,雙service,gcm,alermanage,jobscheuler,心跳同步....).
然後面試官就說 我沒什麼問題 你有什麼想問的.
我就跟他說15號考試,能不能申請電話面試,他真的很和藹說幫我問問,後來第二天下午查官網面試狀態變成複試中 ,但是沒有收到簡訊和郵件.很難受.應該就這樣結束了!
上述面試題已經整理成檔案,有需要的可以 點選進入 檢視領取資料。
1、描述一下Android資料持久儲存方式?
參考回答:Android平臺實現資料持久儲存的常見幾種方式:
SharedPreferences儲存:一種輕型的資料儲存方式,本質是基於XML檔案儲存的key-value鍵值對資料,通常用來儲存一些簡單的設定資訊(如應用程式的各種設定資訊);
SQLite資料庫儲存:一種輕量級嵌入式資料庫引擎,它的運算速度非常快,佔用資源很少,常用來儲存大量複雜的關係資料;
ContentProvider:四大元件之一,用於資料的儲存和共用,不僅可以讓不同應用程式之間進行資料共用,還可以選擇只對哪一部分資料進行共用,可保證程式中的隱私資料不會有洩漏風險;
File檔案儲存:寫入和讀取檔案的方法和 Java中實現I/O的程式一樣;
網路儲存:主要在遠端的伺服器中儲存相關資料,使用者操作的相關資料可以同步到伺服器上;
2、SharedPreferences的應用場景?注意事項?
參考回答:SharedPreferences是一種輕型的資料儲存方式,本質是基於XML檔案儲存的key-value鍵值對資料,通常用來儲存一些簡單的設定資訊,如int,String,boolean、float和long;
注意事項:
勿儲存大型複雜資料,這會引起記憶體GC、阻塞主執行緒使頁面卡頓產生ANR
勿在多程序模式下,操作Sp
不要多次edit和apply,儘量批次修改一次提交
建議apply,少用commit
3、SharedPrefrences的apply和commit有什麼區別?
參考回答:apply沒有返回值而commit返回boolean表明修改是否提交成功。
apply是將修改資料原子提交到記憶體, 而後非同步真正提交到硬體磁碟, 而commit是同步的提交到硬體磁碟,因此,在多個並行的提交commit的時候,他們會等待正在處理的commit儲存到磁碟後在操作,從而降低了效率。而apply只是原子的提交到內容,後面有呼叫apply的函數的將會直接覆蓋前面的記憶體資料,這樣從一定程度上提高了很多效率。
apply方法不會提示任何失敗的提示。由於在一個程序中,sharedPreference是單範例,一般不會出現並行衝突,如果對提交的結果不關心的話,建議使用apply,當然需要確保提交成功且有後續操作的話,還是需要用commit的。
4、瞭解SQLite中的事務操作嗎?是如何做的
參考回答:SQLite在做CRDU操作時都預設開啟了事務,然後把SQL語句翻譯成對應的SQLiteStatement並呼叫其相應的CRUD方法,此時整個操作還是在rollback journal這個臨時檔案上進行,只有操作順利完成才會更新db資料庫,否則會被回滾;
5、使用SQLite做批次操作有什麼好的方法嗎?
參考回答:使用SQLiteDatabase的beginTransaction方法開啟一個事務,將批次操作SQL語句轉化為SQLiteStatement並進行批次操作,結束後endTransaction()
6、如何刪除SQLite中表的個別欄位
參考回答:SQLite資料庫只允許增加欄位而不允許修改和刪除表欄位,只能建立新表保留原有欄位,刪除原表
7、使用SQLite時會有哪些優化操作?
1、Android中程序和執行緒的關係?區別?
2、如何開啟多程序 ?應用是否可以開啟N個程序 ?
在AndroidMenifest中給四大元件指定屬性android:process開啟多程序模式
在記憶體允許的條件下可以開啟N個程序
3、為何需要IPC?多程序通訊可能會出現的問題?
參考回答:所有執行在不同程序的四大元件(Activity、Service、Receiver、ContentProvider)共用資料都會失敗,這是由於Android為每個應用分配了獨立的虛擬機器器,不同的虛擬機器器在記憶體分配上有不同的地址空間,這會導致在不同的虛擬機器器中存取同一個類的物件會產生多份副本。比如常用例子(通過開啟多程序獲取更大記憶體空間、兩個或者多個應用之間共用資料、微信全家桶)
一般來說,使用多程序通訊會造成如下幾方面的問題:
4、Android中IPC方式、各種方式優缺點,為什麼選擇Binder?
參考回答:
與Linux上傳統的IPC機制,比如System V,Socket相比,Binder好在哪呢?
傳輸效率高、可操作性強:傳輸效率主要影響因素是記憶體拷貝的次數,拷貝次數越少,傳輸速率越高。從Android程序架構角度分析:對於訊息佇列、Socket和管道來說,資料先從傳送方的快取區拷貝到核心開闢的快取區中,再從核心快取區拷貝到接收方的快取區,一共兩次拷貝,如圖:
而對於Binder來說,資料從傳送方的快取區拷貝到核心的快取區,而接收方的快取區與核心的快取區是對映到同一塊實體地址的,節省了一次資料拷貝的過程,如圖:
由於共用記憶體操作複雜,綜合來看,Binder的傳輸效率是最好的。
實現C/S架構方便:Linux的IPC方式除了Socket以外都不是基於C/S架構,而Socket主要用於網路間的通訊且傳輸效率較低。Binder基於C/S架構 ,Server端與Client端相對獨立,穩定性較好。
安全性高:傳統Linux IPC的接收方無法獲得對方程序可靠的UID/PID,從而無法鑑別對方身份;而Binder機制為每個程序分配了UID/PID且在Binder通訊時會根據UID/PID進行有效性檢測。
5、Binder機制的作用和原理?
參考回答:Linux系統將一個程序分為使用者空間和核心空間。對於程序之間來說,使用者空間的資料不可共用,核心空間的資料可共用,為了保證安全性和獨立性,一個程序不能直接操作或者存取另一個程序,即Android的程序是相互獨立、隔離的,這就需要跨程序之間的資料通訊方式。
一次完整的 Binder IPC 通訊過程通常是這樣:
首先 Binder 驅動在核心空間建立一個資料接收快取區;
接著在核心空間開闢一塊核心快取區,建立核心快取區和核心中資料接收快取區之間的對映關係,以及核心中資料接收快取區和接收程序使用者空間地址的對映關係;
傳送方程序通過系統呼叫 copyfromuser() 將資料 copy 到核心中的核心快取區,由於核心快取區和接收程序的使用者空間存在記憶體對映,因此也就相當於把資料傳送到了接收程序的使用者空間,這樣便完成了一次程序間的通訊。
6、Binder框架中ServiceManager的作用?
參考回答:Binder框架 是基於 C/S 架構的。由一系列的元件組成,包括 Client、Server、ServiceManager、Binder驅動,其中 Client、Server、Service Manager 執行在使用者空間,Binder 驅動執行在核心空間
Server&Client:伺服器&使用者端。在Binder驅動和Service Manager提供的基礎設施上,進行Client-Server之間的通訊。
ServiceManager(如同DNS域名伺服器)服務的管理者,將Binder名字轉換為Client中對該Binder的參照,使得Client可以通過Binder名字獲得Server中Binder實體的參照。
Binder驅動(如同路由器):負責程序之間binder通訊的建立,傳遞,計數管理以及資料的傳遞互動等底層支援。
圖片出自Carson_Ho文章 —— Android跨程序通訊:圖文詳解 Binder機制 原理
7、Bundle傳遞物件為什麼需要序列化?Serialzable和Parcelable的區別?
參考回答:因為bundle傳遞資料時只支援基本資料型別,所以在傳遞物件時需要序列化轉換成可儲存或可傳輸的本質狀態(位元組流)。序列化後的物件可以在網路、IPC(比如啟動另一個程序的Activity、Service和Reciver)之間進行傳輸,也可以儲存到本地。
序列化實現的兩種方式:實現Serializable/Parcelable介面。不同點如圖:
8、講講AIDL?原理是什麼?如何優化多模組都使用AIDL的情況?
參考回答:AIDL(Android Interface Definition Language,Android介面定義語言):如果在一個程序中要呼叫另一個程序中物件的方法,可使用AIDL生成可序列化的引數,AIDL會生成一個伺服器端物件的代理類,通過它使用者端實現間接呼叫伺服器端物件的方法。
AIDL的本質是系統提供了一套可快速實現Binder的工具。關鍵類和方法:
AIDL介面:繼承IInterface。
Stub類:Binder的實現類,伺服器端通過這個類來提供服務。
Proxy類:伺服器的本地代理,使用者端通過這個類呼叫伺服器的方法。
asInterface():使用者端呼叫,將伺服器端的返回的Binder物件,轉換成使用者端所需要的AIDL介面型別物件。如果使用者端和伺服器端位於統一程序,則直接返回Stub物件本身,否則返回系統封裝後的Stub.proxy物件
asBinder():根據當前呼叫情況返回代理Proxy的Binder物件。
onTransact():執行伺服器端的Binder執行緒池中,當用戶端發起跨程序請求時,遠端請求會通過系統底層封裝後交由此方法來處理。
transact():執行在使用者端,當用戶端發起遠端請求的同時將當前執行緒掛起。之後呼叫伺服器端的onTransact()直到遠端請求返回,當前執行緒才繼續執行。
當有多個業務模組都需要AIDL來進行IPC,此時需要為每個模組建立特定的aidl檔案,那麼相應的Service就會很多。必然會出現系統資源耗費嚴重、應用過度重量級的問題。解決辦法是建立Binder連線池,即將每個業務模組的Binder請求統一轉發到一個遠端Service中去執行,從而避免重複建立Service。
1、講下View的繪製流程?
參考回答:View的工作流程主要是指measure、layout、draw這三大流程,即測量、佈局和繪製,其中measure確定View的測量寬/高,layout確定View的最終寬/高和四個頂點的位置,而draw則將View繪製到螢幕上
View的繪製過程遵循如下幾步:
2、MotionEvent是什麼?包含幾種事件?什麼條件下會產生?
參考回答:MotionEvent是手指接觸控螢幕幕後所產生的一系列事件。典型的事件型別有如下:
正常情況下,一次手指觸控式螢幕幕的行為會觸發一系列點選事件,考慮如下幾種情況:
3、描述一下View事件傳遞分發機制?
參考回答:View事件分發本質就是對MotionEvent事件分發的過程。即當一個MotionEvent發生後,系統將這個點選事件傳遞到一個具體的View上
點選事件的傳遞順序:Activity(Window)→ViewGroup→ View
事件分發過程由三個方法共同完成:
dispatchTouchEvent:用來進行事件的分發。如果事件能夠傳遞給當前View,那麼此方法一定會被呼叫,返回結果受當前View的onTouchEvent和下級View的dispatchTouchEvent方法的影響,表示是否消耗當前事件
onInterceptTouchEvent:在上述方法內部呼叫,對事件進行攔截。該方法只在ViewGroup中有,View(不包含 ViewGroup)是沒有的。一旦攔截,則執行ViewGroup的onTouchEvent,在ViewGroup中處理事件,而不接著分發給View。且只呼叫一次,返回結果表示是否攔截當前事件
onTouchEvent:在dispatchTouchEvent方法中呼叫,用來處理點選事件,返回結果表示是否消耗當前事件
4、如何解決View的事件衝突 ?舉個開發中遇到的例子 ?
參考回答:常見開發中事件衝突的有ScrollView與RecyclerView的滑動衝突、RecyclerView內嵌同時滑動同一方向
滑動衝突的處理規則:
對於由於外部滑動和內部滑動方向不一致導致的滑動衝突,可以根據滑動的方向判斷誰來攔截事件。
對於由於外部滑動方向和內部滑動方向一致導致的滑動衝突,可以根據業務需求,規定何時讓外部View攔截事件,何時由內部View攔截事件。
對於上面兩種情況的巢狀,相對複雜,可同樣根據需求在業務上找到突破點。
滑動衝突的實現方法:
外部攔截法:指點選事件都先經過父容器的攔截處理,如果父容器需要此事件就攔截,否則就不攔截。具體方法:需要重寫父容器的onInterceptTouchEvent方法,在內部做出相應的攔截。
內部攔截法:指父容器不攔截任何事件,而將所有的事件都傳遞給子容器,如果子容器需要此事件就直接消耗,否則就交由父容器進行處理。具體方法:需要配合requestDisallowInterceptTouchEvent方法。
5、scrollTo()和scollBy()的區別?
參考回答:
scollBy內部呼叫了scrollTo,它是基於當前位置的相對滑動;而scrollTo是絕對滑動,因此如果使用相同輸入引數多次呼叫scrollTo方法,由於View的初始位置是不變的,所以只會出現一次View捲動的效果
兩者都只能對View內容的滑動,而非使View本身滑動。可以使用Scroller有過度滑動的效果
6、Scroller是怎麼實現View的彈性滑動?
參考回答:
在MotionEvent.ACTION_UP事件觸發時呼叫startScroll()方法,該方法並沒有進行實際的滑動操作,而是記錄滑動相關量(滑動距離、滑動時間)
接著呼叫invalidate/postInvalidate()方法,請求View重繪,導致View.draw方法被執行
當View重繪後會在draw方法中呼叫computeScroll方法,而computeScroll又會去向Scroller獲取當前的scrollX和scrollY;然後通過scrollTo方法實現滑動;接著又呼叫postInvalidate方法來進行第二次重繪,和之前流程一樣,如此反覆導致View不斷進行小幅度的滑動,而多次的小幅度滑動就組成了彈性滑動,直到整個滑動過程結束
7、 invalidate()和postInvalidate()的區別 ?
參考回答:invalidate()與postInvalidate()都用於重新整理View,主要區別是invalidate()在主執行緒中呼叫,若在子執行緒中使用需要配合handler;而postInvalidate()可在子執行緒中直接呼叫。
8、SurfaceView和View的區別?
View需要在UI執行緒對畫面進行重新整理,而SurfaceView可在子執行緒進行頁面的重新整理
View適用於主動更新的情況,而SurfaceView適用於被動更新,如頻繁重新整理,這是因為如果使用View頻繁重新整理會阻塞主執行緒,導致介面卡頓
SurfaceView在底層已實現雙緩衝機制,而View沒有,因此SurfaceView更適用於需要頻繁重新整理、重新整理時資料處理量很大的頁面(如視訊播放介面)
9、自定義View如何考慮機型適配 ?
今天分享的面試題就到這裡,還是那句話,有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的理解,例如Handler機制,這個是面試必問之題。有些晦澀的點,或許它只活在面試當中,實際工作當中你壓根不會用到它,但是你要知道它是什麼東西。
不管怎麼樣,不論是什麼樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的準備,當然除了這個還需要在平時把自己的基礎打紮實,這樣不論面試官怎麼樣一個知識點裡往死裡鑿,你也能應付如流啊~
鑑於看到很多小夥伴在轉發我的寫的文章,我最近也總結了幾套面試題,【小編在這分享總結的Java面試高頻的面試題(包括了Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技術棧)都進行了整理以及打包整合,上述面試題答案都整理成檔案筆記。 也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成檔案,小部分截圖),有需要的可以 點選進入 檢視領取資料。 】以下是面試資料部分截圖:
點關注,不迷路!如果本文對你有幫助的話不要忘記點贊支援哦!