Android面試知識整理

全面而詳盡的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新特性:面試

  • 分屏多任務
  • 支持Java8開發
  • 夜間模式

Android8.0新特性:緩存

  • 畫中畫
  • 通知標誌
  • 自動填寫
  • 系統優化
  • 後臺限制

Android9.0新特性:安全

  • 支持劉海屏
  • 室內wifi定位
  • 新的圖片解碼等

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的理解和區別
所謂序列化就是將對象變成二進制流,便於存儲和傳輸

  1. Serializable — Java自帶,實現Serializable接口便可,性能低
  2. Parcelable — Android專用,可經過AndroidStudio插件實現,性能高

對比:

  • 在使用內存的時候,Parcelable比Serializable性能高,因此推薦使用Parcelable
  • Serializable在序列化的時候會產生大量的臨時變量,從而引發頻繁的GC。
  • Parcelable不能使用在要將數據存儲在磁盤上的狀況,由於Parcelable不能很好的保證數據的持續性在外界有變化的狀況下。儘管Serializable效率低點,但此時仍是建議使用Serializable 。
  • Parcelable的速度比Serializable 高十倍以上,在Android中應該儘可能採用Parcelable
  • 實現Serializable接口這種方法的缺點是使用了反射,序列化的過程較慢,致使性能相對低下
  • Parcelable方式的實現原理是將一個完整的對象進行分解,而分解後的每一部分都是Intent所支持的數據類型,這樣也就實現傳遞對象的功能了(注意,在Activity跳轉之間傳入序列化的對象或者數據時,數據大小不能超過1M,對於數據量大的傳輸,推薦使用EventBus進行傳輸)

9. Android中可能引發內存泄露的緣由?

  1. 資源對象沒關閉或者Bitmap使用後沒有調用recycle()釋放內存
  2. 構造Adapter時,沒有使用緩存的convertView
  3. 在單例中傳入Context時傳入的是Activity相關的Context(解決方案:使用Application的Context代替Activity相關的Context)
  4. 註冊廣播或者EventBus事件後沒有在對應的生命週期取消註冊
  5. 集合中對象沒有清理形成內存泄露
  6. 使用Handler形成的內存泄露 Handler形成的內存泄露緣由
  7. 非靜態內部類/匿名內部類的靜態實例容易形成內存泄漏 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: 該模式分兩種狀況:
  1. 當前棧中沒有該Activity的實例或者當前棧中存在該Activity的實例可是不位於棧頂,此時其行爲和standard啓動模式同樣,當啓動該Activity仍是會建立一個新的實例。
  2. 當前棧中已有該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

相關文章
相關標籤/搜索