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

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

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

以前吧不少面試題目整理在了GitHub上了,短短几周就有554多個star.因爲個別緣由刪了原來的那個庫(俗稱刪庫跑路~手動滑稽)如今建立了新的你們能夠點一點https://github.com/xiangjiana...
以上全部的加上GitHub上面面試題都整理成一份新的PDF~但願這些對你們有所幫助和突破
(VX:mm14525201314)android

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

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

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

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 上架以前就有一些初始數據須要內置,也會碰到數據的升級等問題,我是這麼作的…… 同時我碰到最有意思的問題就是關於數據庫併發操做的問題,
好比: 多線程操做數據庫的時候,我採起的是封裝使用互斥鎖來解
決……sql

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

若是有一個任務,能夠分紅不少個子任務,須要按照順序來完成,若是須要放到一個服務中完成,那麼使用 IntentService 是最好的選擇。通常咱們所使用的 Service 是運行在主線程當中的,因此在 service 裏面編寫耗時的操做代碼,則會卡主線程會 ANR。爲了解決這樣的問題,谷歌引入了 IntentService.shell

IntentService 的優勢:數據庫

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

總結: 使用 IntentService 的好處有哪些。首先,省去了手動開線程的麻煩;第二,不用手動中止 service;第三,因爲設計了工做隊列,能夠啓動屢次---startService(),可是隻有一個 service 實例和一個工做線程。一個一個熟悉怒執行。canvas

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.重疊;

  1. 註解 newAPI(兼容包解決);
  2. Setarguement()初始化數據;
  3. 不能在 onsave()方法後,commit;
  4. 入棧出棧問題; --事務。像 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

PDF獲取

相關文章
相關標籤/搜索