真香定律,我就是從這裏跳下去也不刷面試題!真香~

本文主要是整理了中高級安卓需要的(或者說面試被頻繁問到的內容),主要作爲參考大綱,之後會陸續更新每個詳細部分,供大家參考,互相學習。

記得前幾年看到一檔綜藝節目“我就是從這裏跳下去,也不吃這碗炒飯~~~真香”王境澤的一句隨口的話成了所謂的真香定律。記得前幾年看到身邊很多人都在刷面試題,那個時候也沒怎麼刷,後來卻加入了真香定律的一員

之前吧很多面試題目整理在了GitHub上了,短短几周就有554多個star.由於個別原因刪了原來的那個庫(俗稱刪庫跑路~手動滑稽)現在創建了新的大家可以點一點https://github.com/xiangjiana/Android-MS
以上所有的加上GitHub上面面試題都整理成一份新的PDF~希望這些對大家有所幫助和突破
(VX:mm14525201314)

有好的面試內容歡迎投稿我

一丶數據庫的操作類型有哪些,如何導入外部數據庫?

讀懂題目。如果碰到問題比較模糊的時候可以適當問問面試官。
配合面試官來面試: 面試是一個相互瞭解的過程,要充分利用面試的題目和時間把自己的能力和技術展現出來,面試官能夠看到你的真實技術。

1) 使用數據庫的方式有哪些?

①.openOrCreateDatabase(String path);
② .繼 承 SqliteOpenHelper 類 對 數 據 庫 及 其 版 本 進 行 管 理(onCreate,onUpgrade)
當 在 程 序 當 中 調 用 這 個 類 的 方 法 getWritableDatabase()或者 getReadableDatabase();的時候纔會打開數據庫。如果當時沒有數據庫文件的時候,系統就會自動生成一個數據庫。

2) 操作的類型:增刪改查 CRUD

直接操作 SQL 語句: SQliteDatabase.execSQL(sql);
面 向 對 象 的 操 作 方 式:SQLiteDatabase.insert(table,nullColumnHack,ContentValues);

如何導入外部數據庫?

一般外部數據庫文件可能放在 SD 卡或者 res/raw 或者 assets 目錄下面。寫一個 DBManager 的類來管理,數據庫文件搬家,先把數據庫文件複製到”/data/data/包名/databases/”目錄下面,然後通過db.openOrCreateDatabase(db 文件),打開數據庫使用。我上一個項目就是這麼做的,由於 app 上架之前就有一些初始數據需要內置,也會碰到數據的升級等問題,我是這麼做的…… 同時我碰到最有意思的問題就是關於數據庫併發操作的問題,
比如: 多線程操作數據庫的時候,我採取的是封裝使用互斥鎖來解
決……

二丶是否使用過IntentService作用是什麼,AIDL 解決了什麼問題?

如果有一個任務,可以分成很多個子任務,需要按照順序來完成,如果需要放到一個服務中完成,那麼使用 IntentService 是最好的選擇。一般我們所使用的 Service 是運行在主線程當中的,所以在 service 裏面編寫耗時的操作代碼,則會卡主線程會 ANR。爲了解決這樣的問題,谷歌引入了 IntentService.

IntentService 的優點:

(1) 它創建一個獨立的工作線程來處理所有一個一個 intent。
(2) 創建了一個工作隊列,來逐個發送 intent 給 onHandleIntent()
(3) 不需要主動調用 stopSelf()來結束服務,因爲源碼裏面自己實現了自動關閉。
(4) 默認實現了 onBind()返回的 null。
(5) 默認實現的 onStartCommand()的目的是將 intent 插入到工作隊列。

總結: 使用IntentService 的好處有哪些。首先,省去了手動開線程的麻煩;第二,不用手動停止 service;第三,由於設計了工作隊列,可以啓動多次—startService(),但是隻有一個 service 實例和一個工作線程。一個一個熟悉怒執行。

AIDL 解決了什麼問題?

AIDL 的全稱: Android Interface Definition Language,安卓接口定義語言。由於 Android 系統中的進程之間不能共享內存,所以需要提供一些機制在不同的進程之間進行數據通信。
遠程過程調用: RPC—Remote Procedure Call。 安卓就是提供了一種 IDL 的解決方案來公開自己的服務接口。AIDL:可以理解爲雙方的一個協議合同。雙方都要持有這份協議—文本協議 xxx.aidl 文件(安卓內部編譯的時候會將 aidl 協議翻譯生成一個xxx.java 文件—代理模式:Binder 驅動有關的,Linux 底層通訊有關的。)
在系統源碼裏面有大量用到 aidl,比如系統服務。
電視機頂盒系統開發。你的服務要暴露給別的開發者來使用。
講解 Binder 機制。

三丶 fragment的特點?

fragment的特點?( 你用 fragment有沒有領略到一些樂趣或者有沒有踩過什麼坑?)

fragment 的設計主要是把 Activity 界面包括其邏輯打碎成很多個獨立的模塊,這樣便於模塊的重用和更靈活地組裝呈現多樣的界面。

1) Fragment 可以作爲 Activity 界面的一個部分組成;
2) 可以在一個 Activity 裏面出現多個 Fragment,並且一個 fragment 可以在多個Activity 中使用;
3) 在 Activity 運行中,可以動態地添加、刪除、替換 Fragment。
4) Fragment 有自己的生命週期的,可以響應輸入事件。

踩過的坑:

1.重疊;
2. 註解 newAPI(兼容包解決);
3. Setarguement()初始化數據;
4. 不能在 onsave()方法後,commit;
5. 入棧出棧問題; --事務。像 Activity 跳轉一樣的效果,同時返回的時候還能回到之前的頁面(fragment)並且狀態都還在。replace(f1,f2)嚴重影響生命週期

四丶View繪製流程和優化自定義 view

Measure: 測量,測量自己。如果是 ViewGroup 就需要測量裏面的所有 childview.測 量 的 結 果 怎 麼 辦 ? setMeasuredDimension(resolveSizeAndState(maxWidth,widthMeasureSpec, childState), heightSizeAndState);設置自己的大小。
Layout: 擺放,把自己擺放在哪個位置。如果是 ViewGroup 就需要發放裏面的所有childview.
怎麼去具體擺放呢?
Draw: 繪製

  /*
   * Draw traversal performs several drawing steps which must be executed
        in the appropriate order:
        Draw the background
          If necessary, save the canvas' layers to prepare for fading
        Draw view's content
        Draw children
           If necessary, draw the fading edges and restore layers
        Draw decorations (scrollbars for instance)
*/
優化自定義 view

1)減少在 onDraw 裏面大量計算和對象創建和大量內存分配。
2)應該儘量少用 invalidate()次數。
3)view 裏面耗時的操作 layout。減少 requestLayout()避免讓 UI 系統重新遍歷整棵樹。Mearsure
4)如果你有一個很複雜的佈局,不如將這個複雜的佈局直接使用你自己的寫的ViewGroup 來實現。減少了一個樹的層次關係 全部都是自己測量和 layout,達到優化的目的。(Facebook 就經常這麼幹)

五丶 什麼情況導致內存泄漏

內存溢出和內存泄漏有什麼區別?

程序運行時所需的內存大於程序允許的最高內存,這時會出現內存溢出; 應該被回收的內存,由於各種原因回收不了,這就是內存泄漏。內存泄漏過多,就容易導致內存溢出。

1)什麼是內存泄漏: 最好解釋清楚 GC 垃圾回收機制以及概念 GC Root。
**2)爲什麼會有內存泄漏:**因爲內存泄漏是屬於人爲的失誤造成的。而且面向對象開發關係複雜、多線程的關係,很容易出現引用層級關係很深以及很混亂。

六丶Bitmap很容易造成OOM,一般有幾種優化方式?什麼情況導致OOM?

Bitmap很容易造成OOM,一般有幾種優化方式?

1.使用緩存;
2.壓縮圖片;
3.及時回收;

什麼情況導致oom:

OOM 產生的原因: 內存不足,android 系統爲每一個應用程序都設置了一個硬性的條件:
DalvikHeapSize 最大閥值 64M/48M/24M.如果你的應用程序內存佔用接近這個閥值,此時如果再嘗試內存分配的時候就會造成 OOM

1)內存泄露多了就容易導致 OOM
2)大圖的處理。壓縮圖片。平時開發就要注意對象的頻繁創建和回收。
3)可以適當的檢測: ActivityManager.getMemoryClass()可以用來查詢當前應用的HeapSize閥值。可以通過命名 adb shellgetProp | grepdalvik.vm.heapxxxlimit 查看。

如何避免內存泄露:

1) 減小對象的內存佔用:

①使用更加輕量級的數據結構: 考慮適當的情況下替代 HashMap 等傳統數據結構而使用安卓專門爲手機研發的 數 據 結 構 類ArrayMap/SparseArray SparseLongMap/SparseIntMap/SparseBoolMap 更加高效HashMap.put(string,Object);Object o = map.get(string);會導致一些沒必要的自動裝箱和拆箱。
適當的避免在 android 中使用 Enum 枚舉,替代使用普通的 static 常量。(一般還是提倡多用枚舉—軟件的架構設計方面;如果碰到這個枚舉需要大量使用的時候就應該更加傾向於解決性能問題)
③較少 Bitmap 對象的內存佔用: 使用 inSampleSize:計算圖片壓縮比例進行圖片壓縮,可以避免大圖加載造成OOM; decodeformat : 圖 片 的 解 碼 格 式 選 擇 ,ARGB_8888/RGB_565/ARGB_4444/ALPHA_8,還可以使用 WebP。
④使用更小的圖片: 資源圖片裏面,是否存在還可以繼續壓縮的空間。

2) 內存對象的重複利用:

使用對象池技術,兩種:

1.自己寫;
2.利用系統既有的對象池機制。比如 LRU(Last Recently Use)算法
ListView/GridView 源 碼 可 以 看 到 重 用 的 情 況 ConvertView 的 復 用 。RecyclerView 中 Recycler 源碼。
Bitmap 的複用,Listview 等要顯示大量圖片。需要使用LRU 緩存機制來複用圖片。
避免在 onDraw 方法裏面執行對象的創建,要複用。避免內存抖動。
常見的 java 基礎問題—StringBuilder
3) 避免對象的內存泄露
4) 使用一些內存的優化策略

七丶Android動畫框架實現原理

傳統的動畫框架: View.startAnimation();
弊端: 移動後不能點擊。原因?跟實現機制有關係。所有的透明度、旋轉、平移、縮放動畫,都是在 view 不斷刷新調用 draw 的情況下實現的。調用的canvas.translate(xxx),canvas.scaleX(xxx)…. Xxx:matrix 像素矩陣來控制動畫的數據。記得看源碼,結合多隻縮放的 demo 看源碼。

補間動畫分爲哪幾種形式:
補間動畫可以分爲四種形式,分別是alpha(淡入淡出),translate(位移),scale(縮放大小),rotate(旋轉)。

Android 中的動畫有哪幾類: 幀動畫、補間動畫、屬性動畫

八丶爲什麼要用Handler機制去更新UI呢

我們經常會在子線程去處理大量運算、網絡請求、圖片壓縮等操作。當我們操作完,要通知主線程操作結果,可以進行下一步行動了。這時候又有一個問題,如果幾個線程同時去通知主線程呢,那麼必然會有併發問題,我們怎麼避免這個問題又不會影響性能呢?(加同步鎖會影響性能)

Google還是瞭解開發者意願的,搬出來了Handler機制,內部有Looper MessageQueue兩個重要角色,光看名字我們就知道這是一個消息隊列,通過隊列方式去對UI進行更新。很好解決了多個子線程的併發問題,還不影響性能。

handler機制
Binder通信機制
線程池是如何管理線程狀態的
熱修復原理
手寫快速排序算法。

大廠比較看重思路與抽象的解決方案

順手留下GitHub鏈接,需要獲取相關面試等內容的可以自己去找
https://github.com/xiangjiana/Android-MS

更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。
可以點擊關於我聯繫我獲取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章