1. 程式人生 > >【彙總】Android知識清單

【彙總】Android知識清單

本文對網路上的相應內容做上相應的總結與整合,以供自己整理知識使用,各部分來自於哪個網址,未能及時給出,如有侵犯,請與我說明,以及時更正,帶來的不便還望諒解。

此部分(到分割線為止)來自出自AWeiLoveAndroid的部落格https://www.jianshu.com/p/c70989bd5f29。初次看到是在鴻洋的微信公眾號上,第一次見到這麼全的清單。對作者的辛苦勞動成果表示感謝!

java面試題彙總

熟練掌握java是很關鍵的,大公司不僅僅要求你會使用幾個api,更多的是要你熟悉原始碼實現原理,甚至要你知道有哪些不足,怎麼改進,還有一些java有關的一些演算法,設計模式等等。

一、java基礎面試知識點

  • java中==和equals和hashCode的區別
  • int、char、long各佔多少位元組數
  • int與integer的區別
  • 探探對java多型的理解
  • String、StringBuffer、StringBuilder區別
  • 什麼是內部類?內部類的作用
  • 抽象類和介面區別
  • 抽象類的意義
  • 抽象類與介面的應用場景
  • 抽象類是否可以沒有方法和屬性?
  • 介面的意義
  • 泛型中extends和super的區別
  • 父類的靜態方法能否被子類重寫
  • 程序和執行緒的區別
  • final,finally,finalize的區別
  • 序列化的方式
  • Serializable 和Parcelable 的區別
  • 靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?以及原因?
  • 靜態內部類的設計意圖
  • 成員內部類、靜態內部類、區域性內部類和匿名內部類的理解,以及專案中的應用
  • 談談對kotlin的理解
  • 閉包和區域性內部類的區別
  • string 轉換成 integer的方式及原理

二、java深入原始碼級的面試題(有難度)

  • 哪些情況下的物件會被垃圾回收機制處理掉?
  • 講一下常見編碼方式?
  • utf-8編碼中的中文佔幾個位元組;int型幾個位元組?
  • 靜態代理和動態代理的區別,什麼場景使用?
  • Java的異常體系
  • 談談你對解析與分派的認識。
  • 修改物件A的equals方法的簽名,那麼使用HashMap存放這個物件例項的時候,會呼叫哪個equals方法?
  • Java中實現多型的機制是什麼?
  • 如何將一個Java物件序列化到檔案裡?
  • 說說你對Java反射的理解
  • 說說你對Java註解的理解
  • 說說你對依賴注入的理解
  • 說一下泛型原理,並舉例說明
  • Java中String的瞭解
  • String為什麼要設計成不可變的?
  • Object類的equal和hashCode方法重寫,為什麼?

三、資料結構

  • 常用資料結構簡介
  • 併發集合瞭解哪些?
  • 列舉java的集合以及集合之間的繼承關係
  • 集合類以及集合框架
  • 容器類介紹以及之間的區別(容器類估計很多人沒聽這個詞,Java容器主要可以劃分為4個部分:List列表、Set集合、Map對映、工具類(Iterator迭代器、Enumeration列舉類、Arrays和Collections),具體的可以看看這篇博文 Java容器類
  • List,Set,Map的區別
  • List和Map的實現方式以及儲存方式
  • HashMap的實現原理
  • HashMap資料結構?
  • HashMap原始碼理解
  • HashMap如何put資料(從HashMap原始碼角度講解)?
  • HashMap怎麼手寫實現?
  • ConcurrentHashMap的實現原理
  • ArrayMap和HashMap的對比
  • HashTable實現原理
  • TreeMap具體實現
  • HashMap和HashTable的區別
  • HashMap與HashSet的區別
  • HashSet與HashMap怎麼判斷集合元素重複?
  • 集合Set實現Hash怎麼防止碰撞
  • ArrayList和LinkedList的區別,以及應用場景
  • 陣列和連結串列的區別
  • 二叉樹的深度優先遍歷和廣度優先遍歷的具體實現
  • 堆的結構
  • 堆和樹的區別
  • 堆和棧在記憶體中的區別是什麼(解答提示:可以從資料結構方面以及實際實現方面兩個方面去回答)?
  • 什麼是深拷貝和淺拷貝
  • 手寫連結串列逆序程式碼
  • 講一下對樹,B+樹的理解
  • 講一下對圖的理解
  • 判斷單鏈表成環與否?
  • 連結串列翻轉(即:翻轉一個單項鍊表)
  • 合併多個單有序連結串列(假設都是遞增的)

四、執行緒、多執行緒和執行緒池

  • 開啟執行緒的三種方式?
  • 執行緒和程序的區別?
  • 為什麼要有執行緒,而不是僅僅用程序?
  • run()和start()方法區別
  • 如何控制某個方法允許併發訪問執行緒的個數?
  • 在Java中wait和seelp方法的不同;
  • 談談wait/notify關鍵字的理解
  • 什麼導致執行緒阻塞?
  • 執行緒如何關閉?
  • 講一下java中的同步的方法
  • 資料一致性如何保證?
  • 如何保證執行緒安全?
  • 如何實現執行緒同步?
  • 兩個程序同時要求寫或者讀,能不能實現?如何防止程序的同步?
  • 執行緒間操作List
  • Java中物件的生命週期
  • Synchronized用法
  • synchronize的原理
  • 談談對Synchronized關鍵字,類鎖,方法鎖,重入鎖的理解
  • static synchronized 方法的多執行緒訪問和作用
  • 同一個類裡面兩個synchronized方法,兩個執行緒同時訪問的問題
  • volatile的原理
  • 談談volatile關鍵字的用法
  • 談談volatile關鍵字的作用
  • 談談NIO的理解
  • synchronized 和volatile 關鍵字的區別
  • synchronized與Lock的區別
  • ReentrantLock 、synchronized和volatile比較
  • ReentrantLock的內部實現
  • lock原理
  • 死鎖的四個必要條件?
  • 怎麼避免死鎖?
  • 物件鎖和類鎖是否會互相影響?
  • 什麼是執行緒池,如何使用?
  • Java的併發、多執行緒、執行緒模型
  • 談談對多執行緒的理解
  • 多執行緒有什麼要注意的問題?
  • 談談你對併發程式設計的理解並舉例說明
  • 談談你對多執行緒同步機制的理解?
  • 如何保證多執行緒讀寫檔案的安全?
  • 多執行緒斷點續傳原理
  • 斷點續傳的實現

併發程式設計有關知識點(這個是一般Android開發用的少的,所以建議多去看看):

平時Android開發中對併發程式設計可以做得比較少,Thread這個類經常會用到,但是我們想提升自己的話,一定不能停留在表面,,我們也應該去了解一下java的關於執行緒相關的原始碼級別的東西。

學習的參考資料如下:

Java 記憶體模型

執行緒狀態:

鎖:

併發程式設計:

Android面試題

Android面試題除了Android基礎之外,更多的問的是一些原始碼級別的、原理這些等。所以想去大公司面試,一定要多看看原始碼和實現方式,常用框架可以試試自己能不能手寫實現一下,鍛鍊一下自己。

一、Android基礎知識點

  • 四大元件是什麼
  • 四大元件的生命週期和簡單用法
  • Activity之間的通訊方式
  • Activity各種情況下的生命週期
  • 橫豎屏切換的時候,Activity 各種情況下的生命週期
  • Activity與Fragment之間生命週期比較
  • Activity上有Dialog的時候按Home鍵時的生命週期
  • 兩個Activity 之間跳轉時必然會執行的是哪幾個方法?
  • 前臺切換到後臺,然後再回到前臺,Activity生命週期回撥方法。彈出Dialog,生命值週期回撥方法。
  • Activity的四種啟動模式對比
  • Activity狀態保存於恢復
  • fragment各種情況下的生命週期
  • Fragment狀態儲存startActivityForResult是哪個類的方法,在什麼情況下使用?
  • 如何實現Fragment的滑動?
  • fragment之間傳遞資料的方式?
  • Activity 怎麼和Service 繫結?
  • 怎麼在Activity 中啟動自己對應的Service?
  • service和activity怎麼進行資料互動?
  • Service的開啟方式
  • 請描述一下Service 的生命週期
  • 談談你對ContentProvider的理解
  • 說說ContentProvider、ContentResolver、ContentObserver 之間的關係
  • 請描述一下廣播BroadcastReceiver的理解
  • 廣播的分類
  • 廣播使用的方式和場景
  • 在manifest 和程式碼中如何註冊和使用BroadcastReceiver?
  • 本地廣播和全域性廣播有什麼差別?
  • BroadcastReceiver,LocalBroadcastReceiver 區別
  • AlertDialog,popupWindow,Activity區別
  • Application 和 Activity 的 Context 物件的區別
  • Android屬性動畫特性
  • 如何匯入外部資料庫?
  • LinearLayout、RelativeLayout、FrameLayout的特性及對比,並介紹使用場景。
  • 談談對介面與回撥的理解
  • 回撥的原理
  • 寫一個回撥demo
  • 介紹下SurfView
  • RecycleView的使用
  • 序列化的作用,以及Android兩種序列化的區別
  • 差值器
  • 估值器
  • Android中資料儲存方式

二、Android原始碼相關分析

  • Android動畫框架實現原理
  • Android各個版本API的區別
  • Requestlayout,onlayout,onDraw,DrawChild區別與聯絡
  • invalidate和postInvalidate的區別及使用
  • Activity-Window-View三者的差別
  • 談談對Volley的理解
  • 如何優化自定義View
  • 低版本SDK如何實現高版本api?
  • 描述一次網路請求的流程
  • HttpUrlConnection 和 okhttp關係
  • Bitmap物件的理解
  • looper架構
  • ActivityThread,AMS,WMS的工作原理
  • 自定義View如何考慮機型適配
  • 自定義View的事件
  • AstncTask+HttpClient 與 AsyncHttpClient有什麼區別?
  • LaunchMode應用場景
  • AsyncTask 如何使用?
  • SpareArray原理
  • 請介紹下ContentProvider 是如何實現資料共享的?
  • AndroidService與Activity之間通訊的幾種方式
  • IntentService原理及作用是什麼?
  • 說說Activity、Intent、Service 是什麼關係
  • ApplicationContext和ActivityContext的區別
  • SP是程序同步的嗎?有什麼方法做到同步?
  • 談談多執行緒在Android中的使用
  • 程序和 Application 的生命週期
  • 封裝View的時候怎麼知道view的大小
  • RecycleView原理
  • AndroidManifest的作用與理解

三、常見的一些原理性問題

  • Handler機制和底層實現
  • Handler、Thread和HandlerThread的差別
  • handler發訊息給子執行緒,looper怎麼啟動?
  • 關於Handler,在任何地方new Handler 都是什麼執行緒下?
  • ThreadLocal原理,實現及如何保證Local屬性?
  • 請解釋下在單執行緒模型中Message、Handler、Message Queue、Looper之間的關係
  • 請描述一下View事件傳遞分發機制
  • Touch事件傳遞流程
  • 事件分發中的onTouch 和onTouchEvent 有什麼區別,又該如何使用?
  • View和ViewGroup分別有哪些事件分發相關的回撥方法
  • View重新整理機制
  • View繪製流程
  • 自定義控制元件原理
  • 自定義View如何提供獲取View屬性的介面?
  • Android程式碼中實現WAP方式聯網
  • AsyncTask機制
  • AsyncTask原理及不足
  • 如何取消AsyncTask?
  • 為什麼不能在子執行緒更新UI?
  • ANR產生的原因是什麼?
  • ANR定位和修正
  • oom是什麼?
  • 什麼情況導致oom?
  • 有什麼解決方法可以避免OOM?
  • Oom 是否可以try catch?為什麼?
  • 記憶體洩漏是什麼?
  • 什麼情況導致記憶體洩漏?
  • 如何防止執行緒的記憶體洩漏?
  • 記憶體洩露場的解決方法
  • 記憶體洩漏和記憶體溢位區別?
  • LruCache預設快取大小
  • ContentProvider的許可權管理(解答:讀寫分離,許可權控制-精確到表級,URL控制)
  • 如何通過廣播攔截和abort一條簡訊?
  • 廣播是否可以請求網路?
  • 廣播引起anr的時間限制是多少?
  • 計算一個view的巢狀層級
  • Activity棧
  • Android執行緒有沒有上限?
  • 執行緒池有沒有上限?
  • ListView重用的是什麼?
  • Android為什麼引入Parcelable?
  • 有沒有嘗試簡化Parcelable的使用?

四、開發中常見的一些問題

  • ListView 中圖片錯位的問題是如何產生的?
  • 混合開發有了解嗎?
  • 知道哪些混合開發的方式?說出它們的優缺點和各自使用場景?(解答:比如:RN,weex,H5,小程式,WPA等。做Android的瞭解一些前端js等還是很有好處的);
  • 螢幕適配的處理技巧都有哪些?
  • 伺服器只提供資料接收介面,在多執行緒或多程序條件下,如何保證資料的有序到達?
  • 動態佈局的理解
  • 怎麼去除重複程式碼?
  • 畫出 Android 的大體架構圖
  • Recycleview和ListView的區別
  • ListView圖片載入錯亂的原理和解決方案
  • 動態許可權適配方案,許可權組的概念
  • Android系統為什麼會設計ContentProvider?
  • 下拉狀態列是不是影響activity的生命週期
  • 如果在onStop的時候做了網路請求,onResume的時候怎麼恢復?
  • Bitmap 使用時候注意什麼?
  • Bitmap的recycler()
  • Android中開啟攝像頭的主要步驟
  • ViewPager使用細節,如何設定成每次只初始化當前的Fragment,其他的不初始化?
  • 點選事件被攔截,但是想傳到下面的View,如何操作?
  • 微信主頁面的實現方式
  • 微信上訊息小紅點的原理
  • CAS介紹(這是阿里巴巴的面試題,我不是很瞭解,可以參考部落格: CAS簡介

高階技術面試題

這裡講的是大公司需要用到的一些高階Android技術,這裡專門整理了一個文件,希望大家都可以看看。這些題目有點技術含量,需要好點時間去研究一下的。

一、圖片

  • 圖片庫對比
  • 圖片庫的原始碼分析
  • 圖片框架快取實現
  • LRUCache原理
  • 圖片載入原理
  • 自己去實現圖片庫,怎麼做?
  • Glide原始碼解析
  • Glide使用什麼快取?
  • Glide記憶體快取如何控制大小?

二、網路和安全機制

  • 網路框架對比和原始碼分析
  • 自己去設計網路請求框架,怎麼做?
  • okhttp原始碼
  • 網路請求快取處理,okhttp如何處理網路快取的
  • 從網路載入一個10M的圖片,說下注意事項
  • TCP的3次握手和四次揮手
  • TCP與UDP的區別
  • TCP與UDP的應用
  • HTTP協議
  • HTTP1.0與2.0的區別
  • HTTP報文結構
  • HTTP與HTTPS的區別以及如何實現安全性
  • 如何驗證證書的合法性?
  • https中哪裡用了對稱加密,哪裡用了非對稱加密,對加密演算法(如RSA)等是否有了解?
  • client如何確定自己傳送的訊息被server收到?
  • 談談你對WebSocket的理解
  • WebSocket與socket的區別
  • 談談你對安卓簽名的理解。
  • 請解釋安卓為啥要加簽名機制?
  • 視訊加密傳輸
  • App 是如何沙箱化,為什麼要這麼做?
  • 許可權管理系統(底層的許可權是如何進行 grant 的)?

三、資料庫

  • sqlite升級,增加欄位的語句
  • 資料庫框架對比和原始碼分析
  • 資料庫的優化
  • 資料庫資料遷移問題

四、演算法

  • 排序演算法有哪些?
  • 最快的排序演算法是哪個?
  • 手寫一個氣泡排序
  • 手寫快速排序程式碼
  • 快速排序的過程、時間複雜度、空間複雜度
  • 手寫堆排序
  • 堆排序過程、時間複雜度及空間複雜度
  • 寫出你所知道的排序演算法及時空複雜度,穩定性
  • 二叉樹給出根節點和目標節點,找出從根節點到目標節點的路徑
  • 給阿里2萬多名員工按年齡排序應該選擇哪個演算法?
  • GC演算法(各種演算法的優缺點以及應用場景)
  • 蟻群演算法與蒙特卡洛演算法
  • 子串包含問題(KMP 演算法)寫程式碼實現
  • 一個無序,不重複陣列,輸出N個元素,使得N個元素的和相加為M,給出時間複雜度、空間複雜度。手寫演算法
  • 萬億級別的兩個URL檔案A和B,如何求出A和B的差集C(提示:Bit對映->hash分組->多檔案讀寫效率->磁碟定址以及應用層面對定址的優化)
  • 百度POI中如何試下查詢最近的商家功能(提示:座標映象+R樹)。
  • 兩個不重複的陣列集合中,求共同的元素。
  • 兩個不重複的陣列集合中,這兩個集合都是海量資料,記憶體中放不下,怎麼求共同的元素?
  • 一個檔案中有100萬個整數,由空格分開,在程式中判斷使用者輸入的整數是否在此檔案中。說出最優的方法
  • 一張Bitmap所佔記憶體以及記憶體佔用的計算
  • 2000萬個整數,找出第五十大的數字?
  • 燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?
  • 求1000以內的水仙花數以及40億以內的水仙花數
  • 5枚硬幣,2正3反如何劃分為兩堆然後通過翻轉讓兩堆中正面向上的硬8幣和反面向上的硬幣個數相同
  • 時針走一圈,時針分針重合幾次
  • N*N的方格紙,裡面有多少個正方形
  • x個蘋果,一天只能吃一個、兩個、或者三個,問多少天可以吃完?

五、外掛化、模組化、元件化、熱修復、增量更新、Gradle

  • 對熱修復和外掛化的理解
  • 外掛化原理分析
  • 模組化實現(好處,原因)
  • 熱修復,外掛化
  • 專案元件化的理解
  • 描述清點選 Android Studio 的 build 按鈕後發生了什麼

六、架構設計和設計模式

  • 談談你對Android設計模式的理解
  • MVC MVP MVVM原理和區別
  • 你所知道的設計模式有哪些?
  • 專案中常用的設計模式
  • 手寫生產者/消費者模式
  • 寫出觀察者模式的程式碼
  • 介面卡模式,裝飾者模式,外觀模式的異同?
  • 用到的一些開源框架,介紹一個看過原始碼的,內部實現過程。
  • 談談對RxJava的理解
  • RxJava的功能與原理實現
  • RxJava的作用,與平時使用的非同步操作來比的優缺點
  • 說說EventBus作用,實現方式,代替EventBus的方式
  • 從0設計一款App整體架構,如何去做?
  • 說一款你認為當前比較火的應用並設計(比如:直播APP,P2P金融,小視訊等)
  • 談談對java狀態機理解
  • Fragment如果在Adapter中使用應該如何解耦?
  • Binder機制及底層實現
  • 對於應用更新這塊是如何做的?(解答:灰度,強制更新,分割槽域更新)?
  • 實現一個Json解析器(可以通過正則提高速度)
  • 統計啟動時長,標準

七、效能優化

  • 如何對Android 應用進行效能分析以及優化?
  • ddms 和 traceView
  • 效能優化如何分析systrace?
  • 用IDE如何分析記憶體洩漏?
  • Java多執行緒引發的效能問題,怎麼解決?
  • 啟動頁白屏及黑屏解決?
  • 啟動太慢怎麼解決?
  • 怎麼保證應用啟動不卡頓?
  • App啟動崩潰異常捕捉
  • 自定義View注意事項
  • 現在下載速度很慢,試從網路協議的角度分析原因,並優化(提示:網路的5層都可以涉及)。
  • Https請求慢的解決辦法(提示:DNS,攜帶資料,直接訪問IP)
  • 如何保持應用的穩定性
  • RecyclerView和ListView的效能對比
  • ListView的優化
  • RecycleView優化
  • View渲染
  • Bitmap如何處理大圖,如一張30M的大圖,如何預防OOM
  • java中的四種引用的區別以及使用場景
  • 強引用置為null,會不會被回收?

八、NDK、jni、Binder、AIDL、程序通訊有關

  • 請介紹一下NDK
  • 什麼是NDK庫?
  • jni用過嗎?
  • 如何在jni中註冊native函式,有幾種註冊方式?
  • Java如何呼叫c、c++語言?
  • jni如何呼叫java層程式碼?
  • 程序間通訊的方式?
  • Binder機制
  • 簡述IPC?
  • 什麼是AIDL?
  • AIDL解決了什麼問題?
  • AIDL如何使用?
  • Android 上的 Inter-Process-Communication 跨程序通訊時如何工作的?
  • 多程序場景遇見過麼?
  • Android程序分類?
  • 程序和 Application 的生命週期?
  • 程序排程
  • 談談對程序共享和執行緒安全的認識
  • 談談對多程序開發的理解以及多程序應用場景
  • 什麼是協程?

九、framework層、ROM定製、Ubuntu、Linux之類的問題

  • java虛擬機器的特性
  • 談談對jvm的理解
  • JVM記憶體區域,開執行緒影響哪塊記憶體
  • 對Dalvik、ART虛擬機器有什麼瞭解?
  • Art和Dalvik對比
  • 虛擬機器原理,如何自己設計一個虛擬機器(記憶體管理,類載入,雙親委派)
  • 談談你對雙親委派模型理解
  • JVM記憶體模型,記憶體區域
  • 類載入機制
  • 談談對ClassLoader(類載入器)的理解
  • 談談對動態載入(OSGI)的理解
  • 記憶體物件的迴圈引用及避免
  • 記憶體回收機制、GC回收策略、GC原理時機以及GC物件
  • 垃圾回收機制與呼叫System.gc()區別
  • Ubuntu編譯安卓系統
  • 系統啟動流程是什麼?(提示:Zygote程序 –> SystemServer程序 –> 各種系統服務 –> 應用程序)
  • 大體說清一個應用程式安裝到手機上時發生了什麼
  • 簡述Activity啟動全部過程
  • App啟動流程,從點選桌面開始
  • 邏輯地址與實體地址,為什麼使用邏輯地址?
  • Android為每個應用程式分配的記憶體大小是多少?
  • Android中程序記憶體的分配,能不能自己分配定額記憶體?
  • 程序保活的方式
  • 如何保證一個後臺服務不被殺死?(相同問題:如何保證service在後臺不被kill?)比較省電的方式是什麼?
  • App中喚醒其他程序的實現方式

非技術性問題&HR問題彙總

這裡整理的是一些與技術沒有直接關係的面試題,但是能夠考察你的綜合水平,所以不要以為不是技術問題,就不看,往往有時候就是這樣一些細節的題目被忽視,而錯過了一次次面試機會。

非技術問題

  • 介紹你做過的哪些專案
  • 都使用過哪些框架、平臺?
  • 都使用過哪些自定義控制元件?
  • 研究比較深入的領域有哪些?
  • 對業內資訊的關注渠道有哪些?
  • 最近都讀哪些書?
  • 有沒有什麼開源專案?
  • 自己最擅長的技術點,最感興趣的技術領域和技術點
  • 專案中用了哪些開源庫,如何避免因為引入開源庫而導致的安全性和穩定性問題
  • 實習過程中做了什麼,有什麼產出?

HR提出的面試問題

  • 您在前一家公司的離職原因是什麼?
  • 講一件你印象最深的一件事情
  • 介紹一個你影響最深的專案
  • 介紹你最熱愛最擅長的專業領域
  • 公司實習最大的收穫是什麼?
  • 與上級意見不一致時,你將怎麼辦?
  • 自己的優點和缺點是什麼?並舉例說明?
  • 你的學習方法是什麼樣的?實習過程中如何學習?實習專案中遇到的最大困難是什麼以及如何解決的?
  • 說一件最能證明你能力的事情
  • 針對你你申請的這個職位,你認為你還欠缺什麼
  • 如果通過這次面試我們單位錄用了你,但工作一段時間卻發現你根本不適合這個職位,你怎麼辦?
  • 專案中遇到最大的困難是什麼?如何解決的?
  • 你的職業規劃以及個人目標、未來發展路線及求職定位
  • 如果你在這次面試中沒有被錄用,你怎麼打算?
  • 評價下自己,評價下自己的技術水平,個人程式碼量如何?
  • 通過哪些渠道瞭解的招聘資訊,其他同學都投了哪些公司?
  • 業餘都有哪些愛好?
  • 你做過的哪件事最令自己感到驕傲?
  • 假如你晚上要去送一個出國的同學去機場,可單位臨時有事非你辦不可,你怎麼辦?
  • 就你申請的這個職位,你認為你還欠缺什麼?
  • 當前的offer狀況;如果BATH都給了offer該如何選?
  • 你對一份工作更看重哪些方面?平臺,技術,氛圍,城市,還是money?
  • 理想薪資範圍;杭州崗和北京崗選哪個?
  • 理想中的工作環境是什麼?
  • 談談你對跳槽的看法
  • 說說你對行業、技術發展趨勢的看法
  • 實習過程中周圍同事/同學有哪些值得學習的地方?
  • 家人對你的工作期望及自己的工作期望
  • 如果你的工作出現失誤,給本公司造成經濟損失,你認為該怎麼辦?
  • 若上司在公開會議上誤會你了,該如何解決?
  • 是否可以實習,可以實習多久?
  • 在五年的時間內,你的職業規劃
  • 你看中公司的什麼?或者公司的那些方面最吸引你?

~~~~~~~~~~~~~~~~~~~~~~~ 我是華麗的分割線 ~~~~~~~~~~~~~~~~~~~~~~~

一、基礎知識

1. 虛擬機器相關知識基礎

重點關注:

  1. 虛擬機器的記憶體管理
  2. 虛擬機器的垃圾回收
  3. 虛擬機器的種類:Java虛擬機器、Android兩種虛擬機器的對比
  4. class與dex檔案
  5. Class載入

這裡推薦筆者的文章:

2. Java基礎:

尤其需要深入理解容器、I/O、執行緒、反射、泛型等。尤其是容器的原始碼實現。

相關文章網上比較多,筆者只推薦一小部分:

3. Kotlin基礎

這裡推薦:

4. 資料結構與演算法

這裡重點關注:

  1. 基本的資料結構
  2. 基本的排序演算法
  3. 演算法的時空複雜度

推薦:

  1. 書籍:《大話資料結構》
  2. 視訊:《小甲魚資料結構》
  3. 有條件的看動腦學院Danny的《演算法資料結構》
  4. 演算法題:牛客網左程雲的演算法視訊、他的相關書籍《程式設計師程式碼面試指南》

5. 作業系統基礎與計算機網路

這個就不用作太多介紹了,大學的基礎課。

其中,值得注意的是:

  1. 計算機網路方面,注意TCP/UDP,三次握手;HTTP/HTTPS等知識

6. 設計原則與設計模式、架構

推薦:

  1. 《Android原始碼與設計模式》,誰看誰知道,好書不解釋,一本就夠了。
  2. 架構、思想方面的知識,推薦去看潭州學院的架構視訊,也推薦上有心課堂學習Stay的架構課程。

7. 版本控制與持續整合、自動化構建、Gradle

  1. 版本控制推薦學習Git和GitHub,可以去看廖雪峰大神的文章。也可以看筆者總結的文章《Git學習筆記》:http://www.jianshu.com/p/7eb0f4667cc1。另外,想去手機廠商的朋友,最好也掌握以下Repo。
  2. 持續整合、自動化構建平臺搭建:有興趣的朋友去研究jenkins
  3. Gradle:推薦徐宜生大神的《Android神兵利器》

二、Android常問知識篇

Android基礎就不再贅述了,相信大家都比較熟悉,找一個系列的部落格或者買本書籍補習即可,也推薦去看黑馬的Android視訊。重點關注四大元件的生命週期、Activity啟動模式、Service等等。

推薦:

  1. 郭霖大神的《第一行程式碼第二版》
  2. 任玉剛大神《Android開發藝術探索》,這本書講解面試常見的基本知識之餘,作了一定的拓展。

下面主要介紹一下Android基礎知識以外的。

1. Android系統架構、原始碼分析

招聘資訊上面經常寫“熟悉Android系統架構”、還會經常被問“有沒有看過什麼原始碼”,那麼到底什麼是系統架構呢,參考文章:

  1. 包建強的原始碼分析系列文章《寫給Android App開發人員看的Android底層知識》:http://jax.cnblogs.com/
  2. 《Android開發藝術探索》中關於原始碼、機制的相關章節

注:作為Android APP開發人員,原始碼不必深入掌握程式碼每個細節。但是有些東西,掌握了就會加深對Android的理解,這就是原始碼的魅力所在,它深深地吸引著筆者。這也是區分各位應聘者的門檻。

至於其它的一般的框架原始碼的話,例如:

  1. 熱修復與外掛化框架原始碼
  2. Android路由、元件化原始碼
  3. 非同步框架
  4. 新的動畫框架
  5. 網路請求框架原始碼(Retrofit的話推薦去有心課堂看視訊)
  6. 圖片載入框架原始碼(Glide、Fresco等)
  7. 資料庫框架原始碼(留意2017年新出的框架)

這些其實都應該重點關注一下的,面試的時候大致能夠說出一個流程或者原理。側重點看什麼需要根據公司而定,如果公司是搞電商的,那麼網路請求、圖片載入肯定少不了。

每樣挑一個比較牛逼、或者比較新的框架去研究即可。最好其它框架也要懂個大致的原理、會使用。

2. 新技術

學習一些外掛化、熱修復框架,Android路由、元件化、非同步框架、新的動畫框架。

例如:

  1. 外掛化:滴滴(任玉剛)的外掛化框架VirtualAPK、奇虎360的外掛化框架RePlugin等
  2. 熱修復:阿里巴巴第三代非侵入式移動熱修復解決方案(注意不是AndFix哦)等
  3. 路由:ARouter等
  4. 元件化:Atlas等
  5. 非同步:RxJava、RxAndroid等一系列框架等(推薦有心課堂)
  6. 新的動畫框架:Lottie等

以上只是列出一些比較常見、比較新的框架,具體深入修行需要靠個人。應付面試的話,只需要大致能說出原理、使用體驗過也就差不多了。資料網上比較多,就不逐個推薦了。

3. 效能優化

效能優化也是Android面試中常問的點,這裡推薦一些相關資料:

  1. 騰訊音樂大神的書籍:《Android應用效能優化最佳實踐》
  2. Android效能優化官方文件
  3. 《Android開發藝術探索》中的關於效能優化的相關章節

4. 自定義View與動畫

這是Android中比較難的一部分知識,需要平時就不斷積累、鍛鍊,相關的文章比較多,就不推薦了。

5. NDK開發(含JNI)

NDK開發也是用人單位區分應聘者的手段之一,企業不一定要用到,但是可以通過是否掌握NDK來篩選人才。相對來說,大公司比較喜歡使用NDK技術。

相關推薦文章:

注:如果想去手機廠商的話,最好懂一些Linux的基本命令、adb命令、Ubuntu/MAC的使用

6. 專案實戰

  1. 推薦上菜鳥窩官網隨便買一個專案視訊學習
  2. 推薦去找個小公司實習或者接個外包
  3. 上網(例如GitHub)找一些成熟的、完整的專案學習,模仿

三、手寫題目篇

這裡推薦大家上牛客網https://www.nowcoder.com/刷題,筆試離不開上面的基礎知識的積累,因此這裡不再贅述。

~~~~~~~~~~~~~~~~~~~~分割線~~~~~~~~~~~~~~~~~~~~

忘記出處了,對不住了啊

四、補充題

  • 基礎知識 – 四大元件(生命週期,使用場景,如何啟動)
  • java基礎 – 資料結構,執行緒,mvc框架
  • 通訊 – 網路連線(HttpClient,HttpUrlConnetion),Socket
  • 資料持久化 – SQLite,SharedPreferences,ContentProvider
  • 效能優化 – 佈局優化,記憶體優化,電量優化
  • 安全 – 資料加密,程式碼混淆,WebView/Js呼叫,https
  • UI– 動畫
  • 其他 – JNI,AIDL,Handler,Intent等
  • 開源框架 – Volley,Gilde,RxJava等(簡歷上寫你會的,用過的)
  • 拓展 – Android6.0/7.0/8.0特性,kotlin語言,I/O大會

順序是根據記憶排的,沒有優先順序之分,都是重點。(固定答案不解答,自己可以找到)

2.Activity的啟動模式以及使用場景
(1)manifest設定,(2)startActivity flag
http://blog.csdn.net/CodeEmperor/article/details/50481726
此處延伸:棧(First In Last Out)與佇列(First In First Out)的區別

4.Broadcast註冊方式與區別
(1)靜態註冊(minifest),(2)動態註冊
http://www.jianshu.com/p/ea5e233d9f43
此處延伸:什麼情況下用動態註冊

5.HttpClient與HttpUrlConnection的區別
http://blog.csdn.net/guolin_blog/article/details/12452307
此處延伸:Volley裡用的哪種請求方式(2.3前HttpClient,2.3後HttpUrlConnection)

24.設計模式(單例,工廠,觀察者。作用,使用場景)
一般說自己會的就ok,不要只記得名字就一輪嘴說出來,不然有你好受。
http://blog.csdn.net/jason0539/article/details/23297037/
此處延伸:Double Check的寫法被要求寫出來。

26.開源框架,為什麼使用,與別的有什麼區別
這個問題基本必問。在自己簡歷上寫什麼框架,他就會問什麼。
如:Volley,面試官會問我Volley的實現原理,與okhttp和retrofit的區別。
開源框架很多,我就選幾個多數公司都會用的出來(框架都是針對業務和效能,所以不一定出名的框架就有人用)
網路請求:Volley,okhttp,retrofit
非同步:RxJava,AsyncTask
圖片處理:Picasso,Glide
訊息傳遞:EventBus
以上框架請自行查詢,太多了就不貼出來了。

OK,點到即止。

五、接著補充

01、Activity生命週期?
這幾乎是個老少咸宜,永遠不會過時的問題,而且極有可能是第一個問題。這個問題當然沒什麼好講的啦,死記硬背是沒什麼用的了,關鍵是理解。本人就曾遇到這個問題的變種問題,問onStart(),與onResume()有什麼區別?如果面試官丟擲這個問題,是不是有點措手不及。今天又聽說有同學遭遇了更變態的問題:什麼情況下Activity走了onCreat(),而不走onStart(),這簡直就是腦筋急轉彎嘛。

02、Service生命週期?

這裡要注意service有兩種啟動方式,startService()和bindService()

03、理解Activity,View,Window三者關係

這個問題真的很不好回答。所以這裡先來個算是比較恰當的比喻來形容下它們的關係吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示檢視)LayoutInflater像剪刀,Xml配置像窗花圖紙。
1:Activity構造的時候會初始化一個Window,準確的說是PhoneWindow。
2:這個PhoneWindow有一個“ViewRoot”,這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根檢視。
3:“ViewRoot”通過addView方法來一個個的新增View。比如TextView,Button等
4:這些View的事件監聽,是由WindowManagerService來接受訊息,並且回撥Activity函式。比如onClickListener,onKeyDown等。

04、四種LaunchMode及其使用場景

standard 模式
這是預設模式,每次啟用Activity時都會建立Activity例項,並放入任務棧中。使用場景:大多數Activity。
singleTop 模式
如果在任務的棧頂正好存在該Activity的例項,就重用該例項( 會呼叫例項的 onNewIntent() ),否則就會建立新的例項並放入棧頂,即使棧中已經存在該Activity的例項,只要不在棧頂,都會建立新的例項。使用場景如新聞類或者閱讀類App的內容頁面。
singleTask 模式
如果在棧中已經有該Activity的例項,就重用該例項(會呼叫例項的 onNewIntent() )。重用時,會讓該例項回到棧頂,因此在它上面的例項將會被移出棧。如果棧中不存在該例項,將會建立新的例項放入棧中。使用場景如瀏覽器的主介面。不管從多少個應用啟動瀏覽器,只會啟動主介面一次,其餘情況都會走onNewIntent,並且會清空主介面上面的其他頁面。
singleInstance 模式
在一個新棧中建立該Activity的例項,並讓多個應用共享該棧中的該Activity例項。一旦該模式的Activity例項已經存在於某個棧中,任何應用再啟用該Activity時都會重用該棧中的例項( 會呼叫例項的 onNewIntent() )。其效果相當於多個應用共享一個應用,不管誰啟用該 Activity 都會進入同一個應用中。使用場景如鬧鈴提醒,將鬧鈴提醒與鬧鈴設定分離。singleInstance不要用於中間頁面,如果用於中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出後,在此啟動,首先開啟的是B。

05、View的繪製流程

06、Touch事件傳遞機制

public boolean dispatchTouchEvent(MotionEventev);  
//用來分派event
public boolean onInterceptTouchEvent(MotionEventev);
//用來攔截event
public boolean onTouchEvent(MotionEventev);
//用來處理event

其中Activity和View控制元件(TextView)擁有分派和處理事件方法,View容器(LinearLayout)具有分派,攔截,處理事件方法。這裡也有個比喻:領導都會把任務向下分派,一旦下面的人把事情做不好,就不會再把後續的任務交給下面的人來做了,只能自己親自做,如果自己也做不了,就只能告訴上級不能完成任務,上級又會重複他的過程。另外,領導都有權利攔截任務,對下級隱瞞該任務,而直接自己去做,如果做不成,也只能向上級報告不能完成任務。
http://gold.xitu.io/entry/56af0ba0c24aa800547b60ea

07、Android中的幾種動畫

曾被問到Android中有幾種動畫,這個問題也好難回答。Android3.0之前有2種,3.0後有3種。
FrameAnimation(逐幀動畫):將多張圖片組合起來進行播放,類似於早期電影的工作原理,很多App的loading是採用這種方式。
TweenAnimation(補間動畫):是對某個View進行一系列的動畫的操作,包括淡入淡出(Alpha),縮放(Scale),平移(Translate),旋轉(Rotate)四種模式。
PropertyAnimation(屬性動畫):屬性動畫不再僅僅是一種視覺效果了,而是一種不斷地對值進行操作的機制,並將值賦到指定物件的指定屬性上,可以是任意物件的任意屬性。

08、Android中跨程序通訊的幾種方式

1:訪問其他應用程式的Activity
如呼叫系統通話應用

Intent callIntent=new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);

2:Content Provider
如訪問系統相簿

3:廣播(Broadcast)
如顯示系統時間

4:AIDL服務

09、AIDL理解

10、Handler的原理

11、Binder機制原理

12、熱修復的原理

13、設計一套圖片非同步載入快取方案

14、Android記憶體洩露及管理

15、Activity和Fragment通訊

16、Fragment的那些坑

17、Android UI適配

18、佈局優化

19、Http https

20、網路請求優化

21、資料庫優化

22、圖片優化

23、HybridJAVA和JS互動

24、單例設計模式

25、JAVA GC原理

26、ANR

27

28、JAVA註解反射原理

29、演算法

30、設計模式

31、RxJava

32、MVP,MVC,MVVM

33

React Native跨平臺技術

35、Android 5.0

MD風格

36、Android6.0執行時許可權

37、Android7.0新特性

38、Android外掛化和組合化開發

六、常見題及答案

  • 請描述一下Activity 生命週期。

答: 如下圖所示。共有七個周期函式,按順序分別是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。

onCreate(): 建立Activity時呼叫,設定在該方法中,還以Bundle的形式提供對以前儲存的任何狀態的訪問。

onStart(): Activity變為在螢幕上對使用者可見時呼叫。

onResume(): Activity開始與使用者互動時呼叫(無論是啟動還是重新啟動一個活動,該方法總是被呼叫。

onPause(): Activity被暫停或收回cpu和其他資源時呼叫,該方法使用者保護活動狀態的,也是保護現場。

onStop(): Activity被停止並轉為不可見階段及後續的生命週期事件時呼叫。

onRestart(): Activity被重新啟動時呼叫。該活動仍然在棧中,而不是啟動新的Activity。

1、完整生命週期: 即從一個Activity從出現到消失,對應的週期方法是從onCreate()到onDestroy()。

2、可見生命週期: 當Activity處於可以使用者看見的狀態,但不一定能與使用者互動時,將多次執行從onStart()到onStop()。

3、前景生命週期: 當Activity處於Activity棧最頂端,能夠與其他使用者進行互動時,將多次執行從onResume()到onPause()。

  • 兩個Activity之間跳轉時必然會執行的是哪幾個方法。

答: 兩個Activity之間跳轉必然會執行的是下面幾個方法。

onCreate()//在Activity生命週期開始時呼叫。

onRestoreInstanceState()//用來恢復UI狀態。

onRestart()//當Activity重新啟動時呼叫。

onStart()//當Activity對使用者即將可見時呼叫。

onResume()//當Activity與使用者互動時,繪製介面。

onSaveInstanceState()//即將移出棧頂保留UI狀態時呼叫。

onPause()//暫停當前活動Activity,提交持久資料的改變,停止動畫或其他佔用GPU資源的東西,由於下一個Activity在這個方法返回之前不會resume,所以這個方法的程式碼執行要快。

onStop()//Activity不再可見時呼叫。

onDestroy()//Activity銷燬棧時被呼叫的最後一個方法。

  • 橫豎屏切換時候Activity的生命週期。

答:

1、不設定Activity的android: configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。

2、設定Activity的android: configChanges=“orientation”時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次。

3、設定Activity的android: configChanges=“orientation|keyboardHidden”時,切屏不會重新呼叫各個生命週期,只會執行onConfiguration方法

  • 如何將一個Activity設定成視窗的樣式。

答: 第一種方法,在styles.xml檔案中,可以新建如下的類似Dialog的style。

第二種方法,在AndroidManifest.xml中在需要顯示為視窗的Activity中新增如下屬性: android: theme=“@style/Theme.FloatActivity”即可。也可以直接新增對應需要展示為Dialog style的Activity的android: theme屬性為android: theme=“@ android: style/Theme.Dialog”。

  • 兩個Activity之間怎麼傳遞資料?

答: 可以在Intent物件中利用Extra來傳遞儲存資料。

在Intent的物件請求中,使用putExtra(“鍵值對的名字”,”鍵值對的值”);在另外一個Activity中將Intent中的請求資料取出來:

Intent intent = getIntent();

String value = intent.getStringExtra(“testIntent”);

  • 怎麼讓在啟動一個Activity是就啟動一個service?

答: 首先定義好一個service,然後在Activity的onCreate裡面進行連線並bindservice或者直接startService。

  • Activity怎麼和service繫結,怎麼在activity中啟動自己對應的service?

答:

1、activity能進行繫結得益於Serviece的介面。為了支援Service的繫結,實現onBind方法。

2、Service和Activity的連線可以用ServiceConnection來實現。需要實現一個新的ServiceConnection,重現onServiceConnected和OnServiceDisconnected方法,一旦連線建立,就能得到Service例項的引用。

3、執行繫結,呼叫bindService方法,傳入一個選擇了要繫結的Service的Intent(顯示或隱式)和一個你實現了的ServiceConnection的例項

  • 什麼是Service以及描述下它的生命週期。Service有哪些啟動方法,有什麼區別,怎樣停用Service?

答: Android Service是執行在後臺的程式碼,不能與使用者互動,可以執行在自己的程序,也可以執行在其他應用程式程序的上下文裡。需要通過某一個Activity或者Context物件來呼叫。Service有兩個啟動方法,分別是Context.startService()和Context.bindService()。如果在Service執行耗時的操作需要啟動一個新執行緒來執行。

Android Service只繼承了onCreate(), onStart(),onDestroy()三個方法,當我們第一次啟動Service時,先後呼叫onCreate(), onStart()這兩個方法,當停止Service時,則執行onDestroy()方法時。如果Service已經啟動了,當我們再次啟動Service時,不會再執行onCreate()方法,而是直接執行onStart()方法。

  • 什麼時候使用Service?

答: 比如播放多媒體的時候,使用者啟動了其他Activity,這個時候程式要在後臺繼續播放,比如檢測SD卡上檔案的變化,再或者在後臺記錄你的地理資訊位置的改變等等。

  • 請描述一下Intent 和 Intent Filter。

答: Intent在Android中被翻譯為”意圖”,他是三種應用程式基本元件-Activity,Service和broadcast receiver之間相互啟用的手段。在呼叫Intent名稱時使用ComponentName也就是類的全名時為顯示呼叫。這種方式一般用於應用程式的內部呼叫,因為你不一定會知道別人寫的類的全名。而Intent Filter是指意圖過濾,不出現在程式碼中,而是出現在android Manifest檔案中,以的形式。(有一個例外是broadcast receiver的intent
filter是使用Context.registerReceiver()來動態設定的,其中intent filter也是在程式碼中建立的)

一個intent有action,data,category等欄位。一個隱式intent為了能夠被某個intent filter接收,必須通過3個測試,一個intent為了被某個元件接收,則必須通過它所有的intent filter中的一個。

  • Intent傳遞資料時,可以傳遞哪些型別資料?

答: intent間傳送資料一般有兩種常用的方法: 1、extra 2、data。

extra可以用Intent.putExtra放入資料。新啟動的Activity可用Intent.getExtras取出Bundle,然後用Bundles.getLong,getInt,getBoolean,getString等函式來取放進去的值。

Data則是傳輸url。url可以是指我們熟悉的http,ftp等網路地址,也可以指content來指向ContentProvider提供的資源。Intent.setData可以放入資料,Intent.getData可以取出資料。

  • 說說Activity,Intent,Service是什麼關係 ?

答: 一個Activity通常是一個單獨的螢幕,每一個Activity都被實現為一個單獨的類,這些類都是從Activity基類中繼承而來的。Activity類會顯示由檢視控制元件組成的使用者介面,並對檢視控制元件的事件做出響應。

Intent的呼叫是用來進行螢幕之間的切換。Intent描述應用想要做什麼。Intent資料結構中兩個最重要的部分是動作和動作對應的資料,一個動作對應一個動作資料。

Service是執行在後臺的程式碼,不能與使用者互動,可以執行在自己的程序裡,也可以執行在其他應用程式程序的上下文裡。需要一個Activity或者其他Context物件來呼叫。

Activity跳轉Activity,Activity啟動Service,Service開啟Activity都需要Intent表明意圖,以及傳遞引數,Intent是這些元件間訊號傳遞的承載著。

  • 請描述一下BroadcastReceiver。

答: Broadcast Receiver用於接收並處理廣播通知(broadcast announcements)。多數的廣播是系統發起的,如地域變換、電量不足、來電簡訊等。程式也可以播放一個廣播。程式可以有任意數量的broadcast receivers來響應它覺得重要的通知。Broadcast receiver可以通過多種方式通知使用者: 啟動activity、使用NotificationManager、開啟背景燈、振動裝置、播放聲音等,最典型的是在狀態列顯示一個圖示,這樣使用者就可以點它開啟看通知內容。通常我們的某個應用或系統本身在某些事件(電池電量不足、來電簡訊)來臨時會廣播一個Intent出去,我們利用註冊一個broadcast
receiver來監聽這些Intent並獲取Intent中的資料。

  • 在manifest和程式碼中如何註冊和使用 broadcast receiver 。

答: 在android的manifest中註冊

<receiver android: name =“Receiver1”><intent-filter><!----和Intent中的action對應---><actionandroid: name=“com.forrest.action.mybroadcast”/></intent-filter>
</receiver>

在程式碼中註冊

1、 IntentFilter filter = new IntentFilter(“com.forrest.action.mybroadcast”);//和廣播中Intent的action對應;

2、 MyBroadcastReceiver br= new MyBroadcastReceiver();

3、 registerReceiver(br, filter);

  • 請介紹下ContentProvider是如何實現資料共享的。

答: 一個程式可以通過實現一個Content provider的抽象介面將自己的資料完全暴露出去,而且Content provider是以類似資料庫中的表的方式將自己的資料暴露。Content provider儲存和檢索資料,通過它可以讓所有的應用程式訪問到,這也是應用程式之間唯一共享資料的方法。

要想使應用程式的資料公開化,可通過2種方法:建立一個數據自己的Content Provider或者將你的資料新增到一個已經存在的Content Provider中,前提是有相同資料型別並且有寫入Content Provider的許可權,Android提供了Content Resolverr,外界的程式可以通過Content Resolver介面訪問Content Provider提供的資料。

  • 請介紹下Android的資料儲存方式。

答: Android提供了5中儲存資料的方式,分別是以下幾種

1、使用Shared Preferences儲存資料,用來儲存key-value,pairs格式的資料,它是一個輕量級的鍵值儲存機制,只可以儲存基本資料型別。

2、使用檔案儲存資料,通過FileInputStream和FileOutputStream對檔案進行操作。在Android中,檔案是一個應用程式私有的,一個應用程式無法讀寫其他應用程式的檔案。

3、使用SQLite資料庫儲存資料,Android提供的一個標準資料庫,支援SQL語句。

4、使用Content Provider儲存資料,是所有應用程式之間資料儲存和檢索的一個橋樑,它的作用就是使得各個應用程式之間實現資料共享。它是一個特殊的儲存資料的型別,它提供了一套標準的介面用來獲取資料,操作資料。系統也提供了音訊、視訊、影象和個人資訊等幾個常用的Content Provider。如果你想公開自己的私有資料,可以建立自己的Content Provider類,或者當你對這些資料擁有控制寫入的許可權時,將這些資料新增到Content Provider中實現共享。外部訪問通過Content Resolver去訪問並操作這些被暴露的資料。

5、使用網路儲存資料

  • 請介紹下Android中常用的五種佈局。

答: 最常用的佈局方式為Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常用的方式,他們可以通過在xml配置檔案或者程式碼中進行佈局。

1、Frame Layout是最簡單的佈局方式,放置的控制元件都只能羅列到左上角,控制元件會有重疊,不能進行復雜的佈局。

2、Linear Layout可以通過orientation屬性設定線性排列的方向是垂直還是縱向的,每行或每列只有一個元素,可以進行復雜的佈局。

3、Absolute Layout可以讓子元素指定準確的x、y座標值,並顯示在螢幕上。Absolute Layout沒有頁邊框,允許元素之間相互重疊。它是絕對座標,所以在實際中不提倡使用。

4、Relative Layout允許子元素制定他們相對於其他元素或父元素的位置(通過ID制定)。因此,你可以以右對齊,或上下,或置於螢幕中央的形式來排列兩個元素。元素按順序排列,因此如果第一個元素在螢幕的中央,那麼相對於這個元素的其他元素將以螢幕中央的相對位置來排列。這個是相對於Absolute Layout的,採用相對座標,所以在實際中比較常用。

5、Table Layout將以子元素的位置分配到行或列。一個Table Layout由許多的Table Row組成,每個Table Row都會定義一個row。Table Layout容器不會顯示row、column或者cell的邊線框。每個row擁有0個或多個的cell; 和html中的table差不多。在實際中也經常使用。

  • 談談UI中, Padding和Margin有什麼區別?

答: Padding是控制元件的內容相對控制元件的邊緣的邊距,而Margin是控制元件邊緣相對於其他控制元件的邊距。如下圖所示:

  • android本身的一些限制,比如apk包大小限制,讀取大檔案時的時間限。

答:apk包大小限制不好說,有的apk為100M,還是能裝到手機上。一般的apk大小為5~10M左右。讀取大檔案的時間應該是在main執行緒裡面,時間限制為5秒左右。

  • ListView如何提高其效率?

答:1、使用分頁載入,不要一次性載入所有資料。

2、複用convertView。在getItemView中,判斷converView是否為空,如果不為空,可複用。

3、非同步載入圖片。Item中如果包含有webimage,那麼最好非同步載入。

4、快速滑動時,不顯示圖片。當快速滑動列表(SCROLL_STATE_FLING),item中的圖片或獲取需要消耗資源的view,可以不顯示出來;而處於其他兩種狀態(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),則將那些view顯示出來

  • Android程式與Java程式的區別?
區別 Java程式 Android程式
執行入口點 Main Android Mainfest.xml配置檔案中的intent-filter
UI Frame· Activity
是否基於配置檔案
是否基於元件 是Activity,Service,Broadcast Receiver,Content Provider
  • 談談對Android NDK的理解。

答: android NDK是一套工具,允許Android應用開發者嵌入從C、C++原始碼編譯來的本地機器程式碼到各自的應用軟體包中。

1、 NDK是一系列工具的集合。

NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者幫助時巨大的。

NDK集成了交叉編輯器,並提供了相應的mk檔案隔離CPU、平臺、API等差異,開發人員只需要簡單修改mk檔案(指出“那些檔案需要編譯”、“編譯特性要求”等),就可以創建出so。NDK可以自動將so和Java應用一起打包,極大的減輕了開發人員的打包工作。

2、NDK提供了一份穩定、功能有限的API標頭檔案宣告。這些API支援的功能非常有限,包含有:C標準庫(libc)、標準數學庫(libm)、壓縮庫(libz)、log庫(liblog)。

  • 談談Android的優點和不足之處。

答: 優點如下所示:

1、android是開源、市場佔有率大。

2、android能夠有豐富的硬體選擇。

3、android是一款基於Linux平臺的開源作業系統,從而避免了專利壁壘,是一款完全免費的只能手機平臺。

4、由於android是google開發的,因此能夠無縫結合Google應用。

缺點如下所示:

1、安全與隱私。手機與網際網路緊密聯絡,個人隱私很難得到保守。

  • Android系統中GC什麼情況下會出現記憶體洩露呢?

答: 導致記憶體洩露主要的原因是,先前申請了記憶體空