全面而詳盡的Android面試題集
Android面試系列2018總結(全方面覆蓋Android知識結構)html
1. 什麼是ANR?如何避免?
ANR(Application NotResponding)指的是應用程序在一段時間內無響應,系統會向用戶彈出一個應用無響應的對話框,用戶能夠選擇關閉應用或者繼續等待應用響應,這每每是因爲程序的性能所引起的。在Android開發中,不一樣的組件發生ANR的時間是不同的。Activity是5秒,BroadCastReceiver是10秒,Service是20秒(均爲前臺)。 注意,BroadCastReceiver和Service都是運行在主線程中的,應該儘可能避免在其中作耗時操做。
解決方案:將全部耗時操做:如網絡請求,Socket通訊,查詢大量SQL語句,複雜的邏輯計算等都放到子線程中去處理,而後將處理結果經過Handler、AsyncTask等方式更新UI。android
2. Android各版本新特性
Android5.0新特性:git
- MaterialDesign設計風格
- 支持多種設備(智能手機、平板電腦、筆記本電腦、智能電視、汽車、智能手錶等)
- 支持64位ART虛擬機
Android6.0新特性:github
- 動態權限管理
- 指紋識別
- 支持快速充電的切換
- 支持文件夾拖拽應用
- 相機新增專業模式
Android7.0新特性:面試
Android8.0新特性:緩存
Android9.0新特性:安全
3. 你在項目中遇到過哪些難題?最終是如何解決的?
Android技術難題解決方案
以前在開發時須要設置一張大圖片,按照正常的作法,直接放個ImageView而後加載圖片,可是奇怪的是既沒有出現OOM異常,也沒有正常顯示圖片,顯示的是一個空白頁面。
出現緣由:
http://www.javashuo.com/article/p-nmxqnpsl-cs.html,其實就是不一樣的廠家手機系統對長圖作了限制
開源控件:
https://github.com/LuckyJayce/LargeImage網絡
[https://github.com/davemorrissey/subsampling-scale-image-view](https://github.com/davemorrissey/subsampling-scale-image-view)
解決方案:
Android 高清加載巨圖方案 拒絕壓縮圖片多線程
4. String,StringBuffer,StringBuilder有哪些不一樣
執行速度:StringBuilder > StringBuffer > String
String每變化一個值就會開闢一個新的內存空間
StringBuilder是線程非安全的
StringBuffer是線程安全的 ide
對於三者使用的總結:
1.若是要操做少許的數據用 = String
2.單線程操做字符串緩衝區下操做大量數據 = StringBuilder
3.多線程操做字符串緩衝區下操做大量數據 = StringBuffer
5. Android系統提供了哪些動畫機制?
- 逐幀動畫 — 將一個完整的動畫拆分紅一張張單獨的圖片,而後再將它們連貫起來進行播放,相似於動畫片的工做原理
- 補間動畫(View動畫) — 能夠對View進行一系列的動畫操做,包括淡入淡出、縮放、平移、旋轉四種(缺點:只是改變了View的顯示效果而已,而不會真正去改變View的屬性,即通過補間動畫移動事後,點擊事件的效果仍是在移動前的位置上)
- 屬性動畫 — ObjectAnimator能夠作各類動畫操做(ValueAnimator是整個屬性動畫機制當中最核心的一個類)
6. 寫一種你認爲最優的單例模式?
在實際開發中,我寫得最多的是雙重檢索式,可是這種寫法在第一次調用的時候仍是會synchronized 同步,會浪費必定的時間。相比來講,靜態內部類式會更好:【Java】線程安全的單例模式----靜態內部類
public class SingletonPattern {
private SingletonPattern() {
}
private static class SingletonPatternHolder {
private static final SingletonPattern singletonPattern = new SingletonPattern();
}
public static SingletonPattern getInstance() {
return SingletonPatternHolder.singletonPattern;
}
}
7. Android裏的Intent傳遞的數據有大小限制嗎,如何解決?
Intent傳遞數據大小的限制大概在1M左右,超過這個限制就會靜默崩潰。處理方式以下:
- 進程內:EventBus,文件緩存、磁盤緩存。
- 進程間:經過ContentProvider進行進程間數據共享和傳遞。
8. Serializable和Parcelable的區別?
序列化Serializable和Parcelable的理解和區別
所謂序列化就是將對象變成二進制流,便於存儲和傳輸
- Serializable — Java自帶,實現Serializable接口便可,性能低
- Parcelable — Android專用,可經過AndroidStudio插件實現,性能高
對比:
- 在使用內存的時候,Parcelable比Serializable性能高,因此推薦使用Parcelable
- Serializable在序列化的時候會產生大量的臨時變量,從而引發頻繁的GC。
- Parcelable不能使用在要將數據存儲在磁盤上的狀況,由於Parcelable不能很好的保證數據的持續性在外界有變化的狀況下。儘管Serializable效率低點,但此時仍是建議使用Serializable 。
- Parcelable的速度比Serializable 高十倍以上,在Android中應該儘可能採用Parcelable
- 實現Serializable接口這種方法的缺點是使用了反射,序列化的過程較慢,致使性能相對低下
- Parcelable方式的實現原理是將一個完整的對象進行分解,而分解後的每一部分都是Intent所支持的數據類型,這樣也就實現傳遞對象的功能了(注意,在Activity跳轉之間傳入序列化的對象或者數據時,數據大小不能超過1M,對於數據量大的傳輸,推薦使用EventBus進行傳輸)
9. Android中可能引發內存泄露的緣由?
- 資源對象沒關閉或者Bitmap使用後沒有調用recycle()釋放內存
- 構造Adapter時,沒有使用緩存的convertView
- 在單例中傳入Context時傳入的是Activity相關的Context(解決方案:使用Application的Context代替Activity相關的Context)
- 註冊廣播或者EventBus事件後沒有在對應的生命週期取消註冊
- 集合中對象沒有清理形成內存泄露
- 使用Handler形成的內存泄露 Handler形成的內存泄露緣由
- 非靜態內部類/匿名內部類的靜態實例容易形成內存泄漏 android-內部類致使的內存泄漏實戰解析
10. 談談Android中四種啓動模式?Intent的Flag屬性?
完全弄懂Activity四大啓動模式
Android 深刻解析 Activity 的 launchMode 啓動模式,Intent Flag,taskAffinity
- standard: 每啓動一個Activity都會建立一個新的實例。誰啓動了該模式的Activity,該Activity就屬於啓動它的Activity的任務棧中,例如
Activity a
啓動了Activity b
,那麼Activity b
就屬於Activity a
的任務棧中。
- singleTop: 該模式分兩種狀況:
- 當前棧中沒有該Activity的實例或者當前棧中存在該Activity的實例可是不位於棧頂,此時其行爲和standard啓動模式同樣,當啓動該Activity仍是會建立一個新的實例。
- 當前棧中已有該Activity的實例且該實例位於棧頂,當再啓動該Activity時,不會再新建實例,而是複用棧頂的實例,而且會將Intent對象傳入,回調
onNewIntent(Intent intent)
方法。
- singleTask: 在該模式下,只要當前棧中存在該Activity的實例,就會複用該Activity,並回調
onNewIntent(Intent intent)
方法。須要注意的是,在複用該Activity時,會將該Activity上的其餘Activity所有出棧。該模式下,須要注意能夠在activity配置文件中配置taskAffinity
屬性,若是咱們指定了自定義的taskAffinity屬性值,那麼啓動該Activity時會建立一個新的Task(棧)並將當前Activity入棧道新建立的Task中。這樣的話,咱們能夠將兩個不一樣App中的Activity設置爲相同的taskAffinity,這樣雖然在不一樣的應用中,可是Activity會被分配到同一個Task中去。
- singleInstance: 該模式和singleTask差很少,它們之間的區別就是這種模式下的Activity會單獨佔用一個Task棧,具備全局惟一性,即整個系統中就這麼一個實例。因爲棧內複用的特性,後續的請求均不會建立新的Activity實例,除非這個特殊的任務棧被銷燬了。以singleInstance模式啓動的Activity在整個系統中是單例的,若是在啓動這樣的Activiyt時,已經存在了一個實例,那麼會把它所在的任務調度到前臺,重用這個實例。其實singleInstance啓動模式和singleTask啓動模式指定自定義的
taskAffinity
屬性是同樣的。
11. 談談你對Handler機制的理解?
我對Handler機制的理解
12.談談Android中的事件分發機制?
Android事件分發機制徹底解析,帶你從源碼的角度完全理解(上)
Android事件分發機制徹底解析,帶你從源碼的角度完全理解(下)
13.RxJava經常使用操做符及使用場景?
這多是最好的RxJava 2.x 教程(完結版)
14.LruCache實現原理?
Android LruCache源碼分析
15.Android中加載大圖片如何避免OOM?
Android高效加載大圖、多圖解決方案,有效避免程序OOM