1. 程式人生 > >2018 android中高階面試題總結

2018 android中高階面試題總結

        最近在考慮著換工作的事情,面試了大概十幾家吧,因為在職所以不著急,總結了一些長問的問題,都是些理論的問題,回答完這些就看面試官怎麼問原理了,小夥伴們自由發揮吧,這些都回答不了,別人就沒別的機會問的細一點了對吧!!!

oom當前佔用記憶體加上我們申請的記憶體資源超過虛擬機器的最大記憶體限制,就會出現.記憶體溢位:指程式申請記憶體時,沒有足夠的空間供其使用記憶體洩漏:指程式分配出去的記憶體不再使用,無法回收記憶體抖動:指短時間內大量建立物件,然後回收物件解決oomBitMap:圖片壓縮 > 載入縮圖 > 在滾動時不載入圖片 > 使用完回收BitMap >使用Inbitmap屬性避免Ondraw方法執行物件建立LruCache 內部使用LinkhashMap實現UI卡頓原因分析
在ui執行緒中做稍微耗時操作導致卡頓 > layout過於複雜,無法再16ms完成渲染 >同時間執行動畫次數過多導致cpu負載過重 > view頻繁的觸發measure layout 導致累計耗時過多 > 頻繁的觸發Gc 到時執行緒暫停 > 多餘資源及邏輯導致載入和執行緩慢UI卡頓優化 >佈局優化 >使用<include>,<merge>,<viewstub>標籤不要出現過於巢狀和多餘的佈局使用自定義view取代複雜的view記憶體洩漏引起的主要原因:長生命週期物件持有短生命週期物件的引用就可能發生記憶體洩漏java記憶體分配策略:靜態方法區:儲存全域性變數和靜態變數,在整個程式執行間都存在棧區:方法體的區域性變數,在方法結束後釋放空間和記憶體堆區: 儲存動態產生的資料,如new處理的物件陣列,在不使用的時候由java回收器自動回收andorid記憶體洩漏的例子
單例造成的記憶體洩漏,在單例中使用application的context匿名內部類,由於非靜態內部類持有匿名外部類的引用,必須將內部類設定成staticHandler造成的記憶體洩漏,使用static的handler內部類,在實現內部類中使用context的弱引用少使用靜態變數資源未關閉asyncTask造成的記憶體洩漏,使用activity的弱引用,使用靜態內部類,在activity銷燬時cancelandroid記憶體管理機制更少的佔用記憶體在合適的時候,合理的釋放系統資源在系統資源緊張的時候,能釋放掉大部分不重要的資源能合理的在特殊生命週期中,儲存或還原重要資料記憶體優化方法service完成任務應該取消他,用intentservice(完成任務後自動停止)代替service在ui不可見時 釋放ui資源在系統記憶體緊張的時候釋放不重要的資源避免濫用bitmap造成資源浪費使用針對記憶體優化過的容器使用多程序冷啟動熱啟動
冷啟動:在系統啟動前系統中沒有應用的任何資訊,建立application後再建立和初始化mainactivity熱啟動:再已有的程序上啟動應用,建立和初始化mainactivity即可優化:減少第一個介面oncreate方法的工作量不要讓application參與業務的操作,進行耗時操作,不再application中儲存過多靜態變數減少佈局的複雜性和深度不要在主執行緒中載入資源通過懶載入方式載入第三方sdkandroid不適用靜態變數儲存資料sharepreference安全問題,不能跨程序同步,檔案不能過大記憶體物件序列化serializeble是java物件序列化 serializeble在序列化是產生大量臨時物件,從而引起頻繁的GCpracelable是android序列化方式,效能比serializeble高,precelable不能使用在將資料儲存在硬碟上的情況MVC模式優點:耦合性低>重用性高>生命週期成本低>部署快>可維護性高>缺點:檢視與控制器過於緊密連線 >沒有明確的定義 > 增加系統結構和實現的複雜性 > 檢視對模型資料的低效率訪問 MVP模式model:資料層,負責處理資料的載入和儲存view:檢視層,負責介面的展示和使用者互動persenter:中間者,繫結model層和view層,是model和view的橋樑優點:模型與檢視完全分離,修改檢視不影響模型更高效的使用模型,所有的互動都在persenter內部可以將persenter用於多個檢視,而不需要改變persenter的邏輯如果我們把邏輯放在Presenter中,那麼我們就可以脫離使用者介面來測試這些邏輯(單元測試)JNIJava呼叫C++1在java中宣告native方法2編譯java原始檔javac(得到.class)檔案,通過javah命令到處jni的標頭檔案(.h檔案)3使用java需要互動的原生代碼,實現java中宣告的native方法4編譯.so庫檔案5執行java程式,最終實現呼叫原生代碼webView優化預載入webView載入webView同時請求h5資料pathClassLoader 只能載入安裝到android系統裡的apk檔案,android預設的類載入器dexClassLoader 可以載入任意目錄下的dex,apk,jar,zip檔案android記憶體快取和磁碟快取記憶體快取基於Lrucache實現,磁碟快取基於diskLruCache實現,都是基於LRU演算法和linkHashMap實現LruCache的原理是利用LinkHashMap持有物件的強引用,按照Lru演算法進行淘汰,假設從表尾訪問資料,在表頭刪除資料,當訪問的資料項在連結串列中存在時,則將資料移動到表尾,否則在表尾建立一個數據項,當連結串列容量超過一定閾值,則移除表頭資料程序保活提升程序的優先順序,降低被殺死的概率拉活已經被殺死的程序監控手機鎖屏事件,鎖屏時啟動一個1畫素的activity,解鎖時關閉,前臺activity可以將程序變成前臺程序,優先順序最高利用廣播拉活activity序列化序列化就是將物件變成二進位制流,便於傳輸和儲存serializable是java實現的一套序列化方式,會生成大量臨時物件,頻繁觸發GC操作,效率低,適用於將物件儲存在磁碟上pracelable是android實現的序列化機制,將序列化的物件寫入到一塊共性記憶體中,其他物件可以從這塊共性記憶體中讀取位元組流,並反序列化成物件,效率高,適合物件間或程序間傳遞資訊SQLite升級將現有的表命名為臨時表建立新表將臨時表的資料匯入到新表裡刪除臨時表android中的幾種程序前臺程序 :使用者當前操作必須得程序可見程序 :沒有任何前臺元件,但會影響使用者在螢幕上所見內容服務程序: 正在執行使用者使用startService()方法啟動的服務切不屬於上兩個最高級別程序後臺程序:包含對使用者不可見的activity的程序空程序:不含任何應用元件的程序,目的為了快取andorid Binder機制是android實現程序通訊的機制之一client 用來獲取服務service 提供服務serviceManager:servicemanager的作用是將字元形式的binder轉化成client中對該binder的應用,使client端能通過binder名字獲得service端binder實體的引用binder驅動:負責程序間binder通訊的建立,binder在程序間的傳遞,等一系列底層支援handler機制message:訊息分為硬體產生的訊息(觸控,按鈕)和軟體產生的訊息messagequeue:訊息佇列,用來向訊息池存放和取走訊息looper:訊息迴圈器,用來把訊息傳送給相應的處理者hanlder:訊息處理器,主要向訊息佇列傳送以及處理各種訊息hanlder通過sendmessage()傳送訊息到訊息佇列looper通過loop不斷提取觸發條件的訊息,並將訊息交給對應的target:hanlder處理target hanlder通過hanldermessage()方法處理訊息view繪製過程onMeasure()測量檢視大小,從頂層父view到子view遞迴呼叫measure()方法,onmeasure()呼叫onMeasure(),onMeasure方法測量檢視大小onLayout() 確定檢視位置,從頂層父view到子view遞迴呼叫layout()方法,父view根據上一步measure()得到的子view佈局大小,將子view放到合適的位置上onDraw()繪製最終的檢視,viewRoot建立canvers()物件,呼叫ondraw()方法繪製,流程為1.繪製檢視背景,2.繪製畫布圖層;3.繪製view內容;4.繪製子view;5還原圖層;,6繪製滾動條view,viewGroup事件分發1.touch事件分發只有兩個豬腳:viewgroup和view,viewGroup包含onInterceptTouchEvent,dispatchTouchEvent,onTouchEvent三個相關事件,View包含dispatchTouchEvent和onTouchEvent兩個,其中ViewGroup繼承View.2.ViewGroup和View組成了一個樹狀結構,根節點為Activity內部包含的Viewgroup3.觸控事件有ACTION_DOWN,ACTOIN_MOVE,ACTION_UP組成,一次完整的觸控事件中,DOWN,UP只會執行一次,MOVE會執行多次,也可以為0.4.當activity接收到Touch事件時將遍歷子view進行DOWN事件分發,ViewGroup的遍歷可以看成遞迴的,分發的目的是為了找到真正要處理本次完整觸控事件的view,這個view會在onTouchEvent中返回true5.當某個子view返回true時會終止DOWN事件分發,同時在viewGroup中記錄該子view,接下來的UP,MOVE事件將有該子view直接處理,由於子view時儲存在ViewGroup中的,多層ViewGroup節點結構時,上級ViewGroup儲存的會是真實處理事件的View所在的Viewgroup物件,:如ViewGroup0-ViewGroup1-TextView的結構中,TextView返回了true,它將被儲存在ViewGroup1中,而ViewGroup1也會返回true,被儲存在ViewGroup0中。當Move和UP事件來時,會先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。6.當ViewGroup中所有子View都不捕獲DOWN事件時,將觸發ViewGroup自身的onTouch事件,觸發的方式是呼叫super.dispatchTouchEvent(),在所有子View都不處理的情況下,觸發activity的onTouchEvent方法;7.OnInterceptTouchEvent有兩個作用:1.攔截DOWN事件分發,2.終止UP和MOVE事件向目標View傳遞,使得view所在的ViewGroup捕獲UP和DOWN事件android動畫幀動畫:通過指定每一幀的圖片和播放時間,有序的進行播放而形成的動畫效果補間動畫:通過指定View的初始狀態,變化時間,方式,經過演算法進行圖形變換從而形成的動畫效果,有Alpha,Translate,Rotate,Scale.只是在檢視層實現了動畫效果,並沒有改變view的屬性,比如滑動列表,改變標題欄透明度屬性動畫:3.0後才支援,通過不斷的改變view的屬性,不斷的重繪而形成的動畫效果,相比於檢視動畫,View的屬性是真的改變了,比如view的放大,縮小,旋轉.跨程序通訊的幾種方式android跨程序通訊,intent,contentprovider,廣播,service都可以跨程序intent: 這種跨程序方式不是訪問記憶體的形式,需要傳遞一個uri比如打電話contentProvider:這種方式是使用資料共享的形式進行資料共享service: 遠端服務,AIDLbinder機制理解在android系統中,有client,service,serviceManager,和Binder驅動四部分組成,其中client,service,serviceManager執行在使用者空間中,binder驅動執行在核心空間中,而binder就是把這四種元件粘合在一起的粘合劑,核心元件就是binder驅動,serviceManager提供輔助管理功能,client和service正是在binder驅動和serviceManager提供的基礎設施上完成C/S通訊的.http和https的區別1,https需要ca證書,需要一定費用2,http是超文字傳輸協議,資訊是明文傳輸,https是具有安全性的ssl加密傳輸協議3,http和https用的完全不同的連線方式,用的埠也不一樣,前者是80,後者是4434,http連線是無狀態的,https是由ssl+http協議構建的可進行加密傳輸,身份認證的網路協議,比http協議更安全http協議的特點:客戶端每次傳送求情都需要伺服器回送響應,在請求結束後,主動釋放連線,從建立連線到關閉連線的過程叫"一次連線"TCP和UDP的區別tcp是面向連線的,由於tcp需要三次握手,所以能夠最低層度降低風險保證連線的可靠udp不是面向連線的,連線前不需要於物件建立連線,無論傳送還是接收,都沒有傳送訊號,udp是不可靠的,傳輸速率高