Android工程師之Android面試大綱

作者:Hensen_

鏈接:http://blog.csdn.net/qq_30379689/article/details/73698192

本文為作者投稿。


正處于秋招時(shí)期,在此,作者要求我?guī)兔で笠环莼ヂ?lián)網(wǎng)公司2018年校招的安卓開發(fā)崗位,希望和志同道合的同志一起奮發(fā)向上,有朋友有職位推薦可留下聯(lián)系方式,或者直接聯(lián)系作者,謝謝。

微信:510402535

郵箱:xyj510402535@qq.com


文章目錄如下:


  • Activity面試題

  • Fragment面試題

  • Service面試題

  • Broadcast Receiver面試題

  • WebView面試題

  • Binder面試題

  • Handler面試題

  • AsyncTask面試題

  • HandlerThread面試題

  • IntentService面試題

  • 視圖工作機(jī)制面試題

  • 事件分發(fā)機(jī)制面試題

  • ListView面試題

  • Android項(xiàng)目構(gòu)建面試題

  • ANR面試題

  • OOM面試題

  • Bitmap面試題

  • UI卡頓面試題

  • 內(nèi)存泄漏面試題

  • 內(nèi)存管理面試題

  • 冷啟動(dòng)和熱啟動(dòng)面試題

  • 其他優(yōu)化面試題

  • 架構(gòu)模式面試題

  • 插件化面試題

  • 熱更新面試題

  • 進(jìn)程?;蠲嬖囶}

  • Lint面試題

  • Kotlin面試題


1 Activity面試題


1、Activity是什么

Activity是四大組件之一,它提供一個(gè)界面讓用戶點(diǎn)擊和各種滑動(dòng)操作,這就是Activity


2、Activity四種狀態(tài)

  • runing

  • paused

  • stopped

  • killed


3、Activity生命周期

  • onCreate()

  • onStart()

  • onResume()

  • onPause()

  • onStop()

  • onDestroy()

  • onRestart()


4、進(jìn)程的優(yōu)先級(jí)

  • 空進(jìn)程

  • 后臺(tái)進(jìn)程

  • 服務(wù)進(jìn)程

  • 可見進(jìn)程

  • 前臺(tái)進(jìn)程


5、Activity任務(wù)棧

  • 先進(jìn)后出


6、Activity啟動(dòng)模式

  • standard

  • singletop

  • singletask

  • singleinstance


7、scheme跳轉(zhuǎn)協(xié)議

Android中的scheme是一種頁面內(nèi)跳轉(zhuǎn)協(xié)議,通過定義自己的scheme協(xié)議,可以跳轉(zhuǎn)到app中的各個(gè)頁面

  • 服務(wù)器可以定制化告訴app跳轉(zhuǎn)哪個(gè)頁面

  • App可以通過跳轉(zhuǎn)到另一個(gè)App頁面

  • 可以通過H5頁面跳轉(zhuǎn)頁面



2 Fragment面試題


1、Fragment為什么被稱為第五大組件

Fragment比Activity更節(jié)省內(nèi)存,其切換模式也更加舒適,使用頻率不低于四大組件,且有自己的生命周期,而且必須依附于Activity


2、Activity創(chuàng)建Fragment的方式

  • 靜態(tài)創(chuàng)建

  • 動(dòng)態(tài)創(chuàng)建


3、FragmentPageAdapter和FragmentPageStateAdapter的區(qū)別

  • FragmentPageAdapter在每次切換頁面的的時(shí)候,是將Fragment進(jìn)行分離,適合頁面較少的Fragment使用以保存一些內(nèi)存,對(duì)系統(tǒng)內(nèi)存不會(huì)多大影響

  • FragmentPageStateAdapter在每次切換頁面的時(shí)候,是將Fragment進(jìn)行回收,適合頁面較多的Fragment使用,這樣就不會(huì)消耗更多的內(nèi)存


4、Fragment生命周期

  • onAttach()

  • onCreate()

  • onCreateView()

  • onActivityCreated()

  • onStart()

  • onResume()

  • onPause()

  • onStop()

  • onDestroyView()

  • onDestroy()

  • onDetach()


5、Fragment的通信

  • Fragment調(diào)用Activity中的方法:getActivity

  • Activity調(diào)用Fragment中的方法:接口回調(diào)

  • Fragment調(diào)用Fragment中的方法:FragmentManager.findFragmentById


6、Fragment的replace、add、remove方法

  • replace:替代Fragment的棧頂頁面

  • add:添加Fragment到棧頂頁面

  • remove:移除Fragment棧頂頁面



3 Service面試題


1、Service是什么

Service是四大組件之一,它可以在后臺(tái)執(zhí)行長時(shí)間運(yùn)行操作而沒有用戶界面的應(yīng)用組件


2、Service和Thread的區(qū)別

  • Service是安卓中系統(tǒng)的組件,它運(yùn)行在獨(dú)立進(jìn)程的主線程中,不可以執(zhí)行耗時(shí)操作。Thread是程序執(zhí)行的最小單元,分配CPU的基本單位,可以開啟子線程執(zhí)行耗時(shí)操作

  • Service在不同Activity中可以獲取自身實(shí)例,可以方便的對(duì)Service進(jìn)行操作。Thread在不同的Activity中難以獲取自身實(shí)例,如果Activity被銷毀,Thread實(shí)例就很難再獲取得到


3、Service啟動(dòng)方式

  • startService

  • bindService


4、Service生命周期

  1. startService

  • onCreate()

  • onStartCommand()

  • onDestroy()

  • bindService

    • onCreate()

    • onBind()

    • onUnbind()

    • onDestroy()



    4 Broadcast Receiver面試題


    1、Broadcast Receiver是什么

    Broadcast是四大組件之一,是一種廣泛運(yùn)用在應(yīng)用程序之間傳輸信息的機(jī)制,通過發(fā)送Intent來傳送我們的數(shù)據(jù)


    2、Broadcast Receiver的使用場景

    • 同一App具有多個(gè)進(jìn)程的不同組件之間的消息通信

    • 不同App之間的組件之間的消息通信


    3、Broadcast Receiver的種類

    • 普通廣播

    • 有序廣播

    • 本地廣播

    • Sticky廣播


    4、Broadcast Receiver的實(shí)現(xiàn)

    • 靜態(tài)注冊(cè):注冊(cè)后一直運(yùn)行,盡管Activity、進(jìn)程、App被殺死還是可以接收到廣播

    • 動(dòng)態(tài)注冊(cè):跟隨Activity的生命周期


    5、Broadcast Receiver實(shí)現(xiàn)機(jī)制

    • 自定義廣播類繼承BroadcastReceiver,復(fù)寫onReceiver()

    • 通過Binder機(jī)制向AMS進(jìn)行注冊(cè)廣播

    • 廣播發(fā)送者通過Binder機(jī)制向AMS發(fā)送廣播

    • AMS查找符合相應(yīng)條件的廣播發(fā)送到BroadcastReceiver相應(yīng)的循環(huán)隊(duì)列中

    • 消息隊(duì)列執(zhí)行拿到廣播,回調(diào)BroadcastReceiver的onReceiver()


    6、LocalBroadcastManager特點(diǎn)

    • 本地廣播只能在自身App內(nèi)傳播,不必?fù)?dān)心泄漏隱私數(shù)據(jù)

    • 本地廣播不允許其他App對(duì)你的App發(fā)送該廣播,不必?fù)?dān)心安全漏洞被利用

    • 本地廣播比全局廣播更高效

    • 以上三點(diǎn)都是源于其內(nèi)部是用Handler實(shí)現(xiàn)的



    5 WebView面試題


    1、WebView安全漏洞

    • API16之前存在遠(yuǎn)程代碼執(zhí)行安全漏洞,該漏洞源于程序沒有正確限制使用WebView.addJavascriptInterface方法,遠(yuǎn)程攻擊者可通過使用Java反射機(jī)制利用該漏洞執(zhí)行任意Java對(duì)象的方法


    2、WebView銷毀步驟

    • WebView在其他容器上時(shí)(如:LinearLayout),當(dāng)銷毀Activity時(shí),需要在onDestroy()中先移除容器上的WebView,然后再將WebView.destroy(),這樣就不會(huì)導(dǎo)致內(nèi)存泄漏


    3、WebView的jsbridge

    • 客戶端和服務(wù)端之間可以通過Javascript來互相調(diào)用各自的方法


    4、WebViewClient的onPageFinished

    • WebViewClient的onPageFinished在每次完成頁面的時(shí)候調(diào)用,但是遇到未加載完成的頁面跳轉(zhuǎn)其他頁面時(shí),就會(huì)一直調(diào)用,使用WebChromeClient.onProgressChanged可以替代


    5、WebView后臺(tái)耗電

    • 在WebView加載頁面的時(shí)候,會(huì)自動(dòng)開啟線程去加載,如果不很好的關(guān)閉這些線程,就會(huì)導(dǎo)致電量消耗加大,可以采用暴力的方法,直接在onDestroy方法中System.exit(0)結(jié)束當(dāng)前正在運(yùn)行中的java虛擬機(jī)


    6、WebView硬件加速

    Android3.0引入硬件加速,默認(rèn)會(huì)開啟,WebView在硬件加速的情況下滑動(dòng)更加平滑,性能更加好,但是會(huì)出現(xiàn)白塊或者頁面閃爍的副作用,建議WebView暫時(shí)關(guān)閉硬件加速


    7、WebView內(nèi)存泄漏

    由于WebView是依附于Activity的,Activity的生命周期和WebView啟動(dòng)的線程的生命周期是不一致的,這會(huì)導(dǎo)致WebView一直持有對(duì)這個(gè)Activity的引用而無法釋放,解決方案如下

    • 獨(dú)立進(jìn)程,簡單暴力,不過可能涉及到進(jìn)程間通信(推薦)

    • 動(dòng)態(tài)添加WebView,對(duì)傳入WebView中使用的Context使用弱引用



    6 Binder面試題


    1、Linux內(nèi)核的基本知識(shí)

    • 進(jìn)程隔離/虛擬地址空間:進(jìn)程間是不可以共享數(shù)據(jù)的,相當(dāng)于被隔離,每個(gè)進(jìn)程被分配到不同的虛擬地址中

    • 系統(tǒng)調(diào)用:Linux內(nèi)核對(duì)應(yīng)用有訪問權(quán)限,用戶只能在應(yīng)用層通過系統(tǒng)調(diào)用,調(diào)用內(nèi)核的某些程序

    • binder驅(qū)動(dòng):它負(fù)責(zé)各個(gè)用戶的進(jìn)程,通過binder通信內(nèi)核來進(jìn)行交互的模塊


    2、為什么使用Binder

    • 性能上,相比傳統(tǒng)的Socket更加高效

    • 安全性高,支持協(xié)議雙方互相校驗(yàn)


    3、Binder通信模型

    • Service服務(wù)端通過Binder驅(qū)動(dòng)在ServiceManager的查找表中注冊(cè)O(shè)bject對(duì)象的add方法

    • Client客戶端通過Binder驅(qū)動(dòng)在ServiceManager的查找表中找到Object對(duì)象的add方法,并返回proxy的add方法,add方法是個(gè)空實(shí)現(xiàn),proxy也不是真正的Object對(duì)象,是通過Binder驅(qū)動(dòng)封裝好的代理類的add方法

    • 當(dāng)Client客戶端調(diào)用add方法時(shí),Client客戶端通過Binder驅(qū)動(dòng)將proxy的add方法,請(qǐng)求ServiceManager來找到Service服務(wù)端真正對(duì)象的add方法,進(jìn)行調(diào)用


    4、AIDL

    • 客戶端通過aidl文件的Stub.asInterface()方法,拿到Proxy代理類

    • 通過調(diào)用Proxy代理類的方法,將參數(shù)進(jìn)行封包后,調(diào)用底層的transact()方法

    • transact()方法會(huì)回調(diào)onTransact()方法,進(jìn)行參數(shù)的解封

    • 在onTransact()方法中調(diào)用服務(wù)端對(duì)應(yīng)的方法,并將結(jié)果返回


    7 Handler面試題


    1、Handler是什么

    Handler通過發(fā)送和處理Message和Runnable對(duì)象來關(guān)聯(lián)相對(duì)應(yīng)線程的MessageQueue


    2、Handler使用方法

    • post(runnable)

    • sendMessage(message)


    3、Handler工作原理

    • Android進(jìn)階——Android消息機(jī)制之Looper、Handler、MessageQueen

    • http://blog.csdn.net/qq_30379689/article/details/53394061


    4、Handler引起的內(nèi)存泄漏

    • 原因:非靜態(tài)內(nèi)部類持有外部類的匿名引用,導(dǎo)致Activity無法釋放

    • 解決:?

      • Handler內(nèi)部持有外部Activity的弱引用

      • Handler改為靜態(tài)內(nèi)部類

      • Handler.removeCallback()



    8 AsyncTask面試題


    1、AsyncTask是什么

    它本質(zhì)上就是一個(gè)封裝了線程池和Handler的異步框架


    2、AsyncTask使用方法

    • 三個(gè)參數(shù)

      • Params:表示后臺(tái)任務(wù)執(zhí)行時(shí)的參數(shù)類型,該參數(shù)會(huì)傳給AysncTask的doInBackground()方法

      • Progress:表示后臺(tái)任務(wù)的執(zhí)行進(jìn)度的參數(shù)類型,該參數(shù)會(huì)作為onProgressUpdate()方法的參數(shù)

      • Result:表示后臺(tái)任務(wù)的返回結(jié)果的參數(shù)類型,該參數(shù)會(huì)作為onPostExecute()方法的參數(shù)

    • 五個(gè)方法

      • onPreExecute():異步任務(wù)開啟之前回調(diào),在主線程中執(zhí)行

      • doInBackground():執(zhí)行異步任務(wù),在線程池中執(zhí)行

      • onProgressUpdate():當(dāng)doInBackground中調(diào)用publishProgress時(shí)回調(diào),在主線程中執(zhí)行

      • onPostExecute():在異步任務(wù)執(zhí)行之后回調(diào),在主線程中執(zhí)行

      • onCancelled():在異步任務(wù)被取消時(shí)回調(diào)


    3、AsyncTask工作原理

    • Android進(jìn)階——多線程系列之異步任務(wù)AsyncTask的使用與源碼分析

    • http://blog.csdn.net/qq_30379689/article/details/53203556


    4、AsyncTask引起的內(nèi)存泄漏

    • 原因:非靜態(tài)內(nèi)部類持有外部類的匿名引用,導(dǎo)致Activity無法釋放

    • 解決:?

      • AsyncTask內(nèi)部持有外部Activity的弱引用

      • AsyncTask改為靜態(tài)內(nèi)部類

      • AsyncTask.cancel()


    5、AsyncTask生命周期

    在Activity銷毀之前,取消AsyncTask的運(yùn)行,以此來保證程序的穩(wěn)定


    6、AsyncTask結(jié)果丟失

    由于屏幕旋轉(zhuǎn)、Activity在內(nèi)存緊張時(shí)被回收等情況下,Activity會(huì)被重新創(chuàng)建,此時(shí),舊的AsyncTask持有舊的Activity引用,這個(gè)時(shí)候會(huì)導(dǎo)致AsyncTask的onPostExecute()對(duì)UI更新無效


    7、AsyncTask并行or串行

    • AsyncTask在Android 2.3之前默認(rèn)采用并行執(zhí)行任務(wù),AsyncTask在Android 2.3之后默認(rèn)采用串行執(zhí)行任務(wù)

    • 如果需要在Android 2.3之后采用并行執(zhí)行任務(wù),可以調(diào)用AsyncTask的executeOnExecutor()



    9 HandlerThread面試題


    1、HandlerThread產(chǎn)生背景

    當(dāng)系統(tǒng)有多個(gè)耗時(shí)任務(wù)需要執(zhí)行時(shí),每個(gè)任務(wù)都會(huì)開啟一個(gè)新線程去執(zhí)行耗時(shí)任務(wù),這樣會(huì)導(dǎo)致系統(tǒng)多次創(chuàng)建和銷毀線程,從而影響性能。為了解決這一問題,Google提供了HandlerThread,HandlerThread是在線程中創(chuàng)建一個(gè)Looper循環(huán)器,讓Looper輪詢消息隊(duì)列,當(dāng)有耗時(shí)任務(wù)進(jìn)入隊(duì)列時(shí),則不需要開啟新線程,在原有的線程中執(zhí)行耗時(shí)任務(wù)即可,否則線程阻塞


    2、HanlderThread的特點(diǎn)、

    • HandlerThread本質(zhì)上是一個(gè)線程,繼承自Thread

    • HandlerThread有自己的Looper對(duì)象,可以進(jìn)行Looper循環(huán),可以創(chuàng)建Handler

    • HandlerThread可以在Handler的handlerMessage中執(zhí)行異步方法

    • HandlerThread優(yōu)點(diǎn)是異步不會(huì)堵塞,減少對(duì)性能的消耗

    • HandlerThread缺點(diǎn)是不能同時(shí)繼續(xù)進(jìn)行多任務(wù)處理,需要等待進(jìn)行處理,處理效率較低

    • HandlerThread與線程池不同,HandlerThread是一個(gè)串行隊(duì)列,背后只有一個(gè)線程。



    10? IntentService面試題


    1、IntentService是什么

    IntentService是繼承自Service并處理異步請(qǐng)求的一個(gè)類,其內(nèi)部采用HandlerThread和Handler實(shí)現(xiàn)的,在IntentService內(nèi)有一個(gè)工作線程來處理耗時(shí)操作,其優(yōu)先級(jí)比普通Service高。當(dāng)任務(wù)完成后,IntentService會(huì)自動(dòng)停止,而不需要手動(dòng)調(diào)用stopSelf()。另外,可以多次啟動(dòng)IntentService,每個(gè)耗時(shí)操作都會(huì)以工作隊(duì)列的方式在IntentService中onHandlerIntent()回調(diào)方法中執(zhí)行,并且每次只會(huì)執(zhí)行一個(gè)工作線程


    2、IntentService使用方法

    • 創(chuàng)建Service繼承自IntentService

    • 覆寫構(gòu)造方法和onHandlerIntent()方法

    • 在onHandlerIntent()中執(zhí)行耗時(shí)操作


    11 視圖工作機(jī)制面試題


    • Android進(jìn)階——Android視圖工作機(jī)制之measure、layout、draw

    • http://blog.csdn.net/qq_30379689/article/details/54588736


    • Android事件分發(fā)機(jī)制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent

    • http://blog.csdn.net/qq_30379689/article/details/53967177


    12 ListView面試題


    1、ListView是什么

    ListView是能將一個(gè)數(shù)據(jù)集合以動(dòng)態(tài)滾動(dòng)的方式展示到用戶界面上的View


    2、ListView的RecycleBin機(jī)制



    3、ListView的優(yōu)化

    • 重用convertView

    • 使用ViewHolder

    • 圖片三級(jí)緩存

    • 監(jiān)聽滑動(dòng)事件

    • 少用透明View

    • 開啟硬件加速



    13 Android項(xiàng)目構(gòu)建面試題


    1、android構(gòu)建流程


    2、jenkins持續(xù)集成構(gòu)建

    • 這里可參考蒲公英文檔

    • http://www.pgyer.com/doc/view/jenkins


    3、Git常用命令

    • git init:倉庫的初始化

    • git status:查看當(dāng)前倉庫的狀態(tài)

    • git diff:查看倉庫與上次修改的內(nèi)容

    • git add:將文件放進(jìn)暫存區(qū)

    • git commit:提交代碼

    • git clone:克隆代碼

    • git bransh:查看當(dāng)前分支

    • git checkout:切換當(dāng)前分支


    4、git工作流

    • fork/clone(主流)?

      • fork:將別人的倉庫代碼fork到自己的倉庫上

      • clone:克隆下自己倉庫的代碼

      • update、commit:修改代碼并提交到自己的倉庫

      • push:提交到自己的倉庫

      • pull request:請(qǐng)求添加到別人的倉庫

    • clone


    5、proguard是什么

    ProGuard工具是用于壓縮、優(yōu)化和混淆我們的代碼,其主作用是移除或混淆代碼中無用類、字段、方法和屬性


    6、proguard技術(shù)功能

    • 壓縮

    • 優(yōu)化

    • 混淆

    • 預(yù)檢測


    7、proguard工作原理

    將無用的字段或方法存入到EntryPoint中,將非EntryPoint的字段和方法進(jìn)行替換


    8、為什么要混淆

    由于Java是一門跨平臺(tái)的解釋性語言,其源代碼被編譯成class字節(jié)碼來適應(yīng)其他平臺(tái),而class文件包含了Java源代碼信息,很容易被反編譯



    14 ANR面試題


    1、什么是ANR

    Application Not Responding,頁面無響應(yīng)的對(duì)話框


    2、發(fā)生ANR的條件

    應(yīng)用程序的響應(yīng)性是由ActivityManager和WindowManager系統(tǒng)服務(wù)監(jiān)視的,當(dāng)ANR發(fā)生條件滿足時(shí),就會(huì)彈出ANR的對(duì)話框

    • Activity超過5秒無響應(yīng)

    • BroadcastReceiver超過10秒無響應(yīng)

    • Service超過20秒無響應(yīng)


    3、造成ANR的主要原因

    主線程被IO操作阻塞

    • Activity的所有生命周期回調(diào)都是執(zhí)行在主線程的

    • Service默認(rèn)執(zhí)行在主線程中

    • BoardcastReceiver的回調(diào)onReceive()執(zhí)行在主線程中

    • AsyncTask的回調(diào)除了doInBackground,其他都是在主線程中

    • 沒有使用子線程Looper的Handler的handlerMessage,post(Runnable)都是執(zhí)行在主線程中


    4、如何解決ANR

    • 使用AsyncTask處理耗時(shí)IO操作

    • 使用Thread或HandlerThread提供優(yōu)先級(jí)

    • 使用Handler處理工作線程的耗時(shí)操作

    • Activity的onCreate和onResume回調(diào)盡量避免耗時(shí)操作



    15 OOM面試題


    1、什么是OOM

    OOM指Out of memory(內(nèi)存溢出),當(dāng)前占用內(nèi)存加上我們申請(qǐng)的內(nèi)存資源超過了Dalvik虛擬機(jī)的最大內(nèi)存限制就會(huì)拋出Out of memory異常


    2、OOM相關(guān)概念

    • 內(nèi)存溢出:指程序在申請(qǐng)內(nèi)存時(shí),沒有足夠的空間供其使用

    • 內(nèi)存泄漏:指程序分配出去的內(nèi)存不再使用,無法進(jìn)行回收

    • 內(nèi)存抖動(dòng):指程序短時(shí)間內(nèi)大量創(chuàng)建對(duì)象,然后回收的現(xiàn)象


    3、解決OOM

    Bitmap相關(guān)

    • 圖片壓縮

    • 加載縮略圖

    • 在滾動(dòng)時(shí)不加載圖片

    • 回收Bitmap

    • 使用inBitmap屬性

    • 捕獲異常

    其他相關(guān)

    • listview重用convertView、使用lru

    • 避免onDraw方法執(zhí)行對(duì)象的創(chuàng)建

    • 謹(jǐn)慎使用多進(jìn)程



    16 Bitmap面試題


    1、recycle

    • 在安卓3.0以前Bitmap是存放在堆中的,我們只要回收堆內(nèi)存即可

    • 在安卓3.0以后Bitmap是存放在內(nèi)存中的,我們需要回收native層和Java層的內(nèi)存

    • 官方建議我們3.0以后使用recycle方法進(jìn)行回收,該方法也可以不主動(dòng)調(diào)用,因?yàn)槔厥掌鲿?huì)自動(dòng)收集不可用的Bitmap對(duì)象進(jìn)行回收

    • recycle方法會(huì)判斷Bitmap在不可用的情況下,將發(fā)送指令到垃圾回收器,讓其回收native層和Java層的內(nèi)存,則Bitmap進(jìn)入dead狀態(tài)

    • recycle方法是不可逆的,如果再次調(diào)用getPixels()等方法,則獲取不到想要的結(jié)果


    2、LruCache原理

    LruCache是個(gè)泛型類,內(nèi)部采用LinkedHashMap來實(shí)現(xiàn)緩存機(jī)制,它提供get方法和put方法來獲取緩存和添加緩存,其最重要的方法trimToSize是用來移除最少使用的緩存和使用最久的緩存,并添加最新的緩存到隊(duì)列中


    3、計(jì)算inSampleSize



    4、縮略圖



    5、保存Bitmap



    6、保存到SD卡



    7、三級(jí)緩存

    • 網(wǎng)絡(luò)緩存

    • 本地緩存

    • 內(nèi)存緩存


    17 UI卡頓面試題


    1、UI卡頓原理

    View的繪制幀數(shù)保持60fps是最佳,這要求每幀的繪制時(shí)間不超過16ms(1000/60),如果安卓不能在16ms內(nèi)完成界面的渲染,那么就會(huì)出現(xiàn)卡頓現(xiàn)象


    2、UI卡頓的原因分析

    • 在UI線程中做輕微的耗時(shí)操作,導(dǎo)致UI線程卡頓

    • 布局Layout過于復(fù)雜,無法在16ms內(nèi)完成渲染

    • 同一時(shí)間動(dòng)畫執(zhí)行的次數(shù)過多,導(dǎo)致CPU和GPU負(fù)載過重

    • overDraw,導(dǎo)致像素在同一幀的時(shí)間內(nèi)被繪制多次,使CPU和GPU負(fù)載過重

    • View頻繁的觸發(fā)measure、layout,導(dǎo)致measure、layout累計(jì)耗時(shí)過多和整個(gè)View頻繁的重新渲染

    • 頻繁的觸發(fā)GC操作導(dǎo)致線程暫停,會(huì)使得安卓系統(tǒng)在16ms內(nèi)無法完成繪制

    • 冗余資源及邏輯等導(dǎo)致加載和執(zhí)行緩慢

    • ANR


    3、UI卡頓的優(yōu)化

    • 布局優(yōu)化?

      • 使用include、ViewStub、merge

      • 不要出現(xiàn)過于嵌套和冗余的布局

      • 使用自定義View取代復(fù)雜的View

    • ListView優(yōu)化?

      • 復(fù)用convertView

      • 滑動(dòng)不加載

    • 背景和圖片優(yōu)化?

      • 縮略圖

      • 圖片壓縮

    • 避免ANR?

      • 不要在UI線程中做耗時(shí)操作


    18 內(nèi)存泄漏面試題


    1、Java內(nèi)存泄漏引起的主要原因

    長生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄漏


    2、Java內(nèi)存分配策略

    • 靜態(tài)存儲(chǔ)區(qū):又稱方法區(qū),主要存儲(chǔ)全局變量和靜態(tài)變量,在整個(gè)程序運(yùn)行期間都存在

    • 棧區(qū):方法體的局部變量會(huì)在棧區(qū)創(chuàng)建空間,并在方法執(zhí)行結(jié)束后會(huì)自動(dòng)釋放變量的空間和內(nèi)存

    • 堆區(qū):保存動(dòng)態(tài)產(chǎn)生的數(shù)據(jù),如:new出來的對(duì)象和數(shù)組,在不使用的時(shí)候由Java回收器自動(dòng)回收


    3、Android解決內(nèi)存泄漏的例子

    • 單例造成的內(nèi)存泄漏:在單例中,使用context.getApplicationContext()作為單例的context

    • 匿名內(nèi)部類造成的內(nèi)存泄漏:由于非靜態(tài)內(nèi)部類持有匿名外部類的引用,必須將內(nèi)部類設(shè)置為static

    • Handler造成的內(nèi)存泄漏:使用static的Handler內(nèi)部類,同時(shí)在實(shí)現(xiàn)內(nèi)部類中持有Context的弱引用

    • 避免使用static變量:由于static變量會(huì)跟Activity生命周期一致,當(dāng)Activity退出后臺(tái)被后臺(tái)回收時(shí),static變量是不安全,所以也要管理好static變量的生命周期

    • 資源未關(guān)閉造成的內(nèi)存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完后要關(guān)閉

    • AsyncTask造成的內(nèi)存泄漏:由于非靜態(tài)內(nèi)部類持有匿名內(nèi)部類的引用而造成內(nèi)存泄漏,可以通過AsyncTask內(nèi)部持有外部Activity的弱引用同時(shí)改為靜態(tài)內(nèi)部類或在onDestroy()中執(zhí)行AsyncTask.cancel()進(jìn)行修復(fù)



    19 內(nèi)存管理面試題


    1、Android內(nèi)存管理機(jī)制

    • 分配機(jī)制

    • 管理機(jī)制


    2、內(nèi)存管理機(jī)制的特點(diǎn)

    • 更少的占用內(nèi)存

    • 在合適的時(shí)候,合理的釋放系統(tǒng)資源

    • 在系統(tǒng)內(nèi)存緊張的時(shí)候,能釋放掉大部分不重要的資源

    • 能合理的在特殊生命周期中,保存或還原重要數(shù)據(jù)


    3、內(nèi)存優(yōu)化方法

    • Service完成任務(wù)后應(yīng)停止它,或用IntentService(因?yàn)榭梢宰詣?dòng)停止服務(wù))代替Service

    • 在UI不可見的時(shí)候,釋放其UI資源

    • 在系統(tǒng)內(nèi)存緊張的時(shí)候,盡可能多的釋放非重要資源

    • 避免濫用Bitmap導(dǎo)致內(nèi)存浪費(fèi)

    • 避免使用依賴注入框架

    • 使用針對(duì)內(nèi)存優(yōu)化過的數(shù)據(jù)容器

    • 使用ZIP對(duì)齊的APK

    • 使用多進(jìn)程


    20 冷啟動(dòng)和熱啟動(dòng)面試題


    1、什么是冷啟動(dòng)和熱啟動(dòng)

    • 冷啟動(dòng):在啟動(dòng)應(yīng)用前,系統(tǒng)中沒有該應(yīng)用的任何進(jìn)程信息

    • 熱啟動(dòng):在啟動(dòng)應(yīng)用時(shí),在已有的進(jìn)程上啟動(dòng)應(yīng)用(用戶使用返回鍵退出應(yīng)用,然后馬上又重新啟動(dòng)應(yīng)用)


    2、冷啟動(dòng)和熱啟動(dòng)的區(qū)別

    • 冷啟動(dòng):創(chuàng)建Application后再創(chuàng)建和初始化MainActivity

    • 熱啟動(dòng):創(chuàng)建和初始化MainActivity即可


    3、冷啟動(dòng)時(shí)間的計(jì)算

    這個(gè)時(shí)間值從應(yīng)用啟動(dòng)(創(chuàng)建進(jìn)程)開始計(jì)算,到完成視圖的第一次繪制為止


    4、冷啟動(dòng)流程

    • Zygote進(jìn)程中fork創(chuàng)建出一個(gè)新的進(jìn)程

    • 創(chuàng)建和初始化Application類、創(chuàng)建MainActivity

    • inflate布局、當(dāng)onCreate/onStart/onResume方法都走完

    • contentView的measure/layout/draw顯示在界面上

    總結(jié):Application構(gòu)造方法->attachBaseContext()->onCreate()->Activity構(gòu)造方法->onCreate()->配置主題中背景等屬性->onStart()->onResume()->測量布局繪制顯示在界面上


    5、冷啟動(dòng)優(yōu)化

    • 減少第一個(gè)界面onCreate()方法的工作量

    • 不要讓Application參與業(yè)務(wù)的操作

    • 不要在Application進(jìn)行耗時(shí)操作

    • 不要以靜態(tài)變量的方式在Application中保存數(shù)據(jù)

    • 減少布局的復(fù)雜性和深度

    • 不要在mainThread中加載資源

    • 通過懶加載方式初始化第三方SDK



    21 其他優(yōu)化面試題


    1、Android不用靜態(tài)變量存儲(chǔ)數(shù)據(jù)

    • 靜態(tài)變量等數(shù)據(jù)由于進(jìn)程已經(jīng)被殺死而被初始化

    • 使用其他數(shù)據(jù)傳輸方式:文件/sp/contentProvider


    2、SharePreference安全問題

    • 不能跨進(jìn)程同步

    • 文件不宜過大


    3、內(nèi)存對(duì)象序列化

    • Serializeble:是java的序列化方式,Serializeble在序列化的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)對(duì)象,從而引起頻繁的GC

    • Parcelable:是Android的序列化方式,且性能比Serializeble高,Parcelable不能使用在要將數(shù)據(jù)存儲(chǔ)在硬盤上的情況


    4、避免在UI線程中做繁重的操作


    22 架構(gòu)模式面試題


    • Android基礎(chǔ)——框架模式MVC在安卓中的實(shí)踐

    • http://blog.csdn.net/qq_30379689/article/details/52909656

    • Android基礎(chǔ)——框架模式MVP在安卓中的實(shí)踐

    • http://blog.csdn.net/qq_30379689/article/details/52910567

    • Android基礎(chǔ)——框架模式MVVM之DataBinding的實(shí)踐

    • http://blog.csdn.net/qq_30379689/article/details/53037430



    23 插件化面試題


    1、插件化解決的問題

    • 動(dòng)態(tài)加載APK(反射、類加載器)

    • 資源加載(反射、AssetManager、獨(dú)立資源、分段資源)

    • 代碼加載(反射獲取生命周期)


    2、類加載器(Java中字節(jié)碼添加到虛擬機(jī)中)

    • DexClassLoader:能夠加載未安裝的jar/apk/dex,主要用于動(dòng)態(tài)加載和代碼熱更新

    • PathClassLoader:只能加載系統(tǒng)中已經(jīng)安裝過的apk



    24 熱更新面試題


    1、熱更新主要流程

    • 線上檢查到Crash

    • 拉出Bugfix分支修復(fù)Crash問題

    • jenkins構(gòu)建和補(bǔ)丁生成

    • app通過推送或主動(dòng)拉取補(bǔ)丁文件

    • 將Bugfix代碼合到master上


    2、熱更新主流框架

    • Dexposed

    • AndFix

    • Nuwa

    • Tinker


    3、熱更新的原理

    • 在ClassLoader創(chuàng)建一個(gè)dexElements數(shù)組

    • 將修復(fù)好的dex文件存放在dexElements數(shù)組的最前面

    • ClassLoader會(huì)遍歷dexElements數(shù)組,找到最前面的dex文件優(yōu)先加載



    25 進(jìn)程保活面試題


    1、進(jìn)程的優(yōu)先級(jí)

    • 空進(jìn)程

    • 后臺(tái)進(jìn)程

    • 服務(wù)進(jìn)程

    • 可見進(jìn)程

    • 前臺(tái)進(jìn)程


    2、Android進(jìn)程回收策略

    • Low memory Killer(定時(shí)執(zhí)行):通過一些比較復(fù)雜的評(píng)分機(jī)制,對(duì)進(jìn)程進(jìn)行打分,然后將分?jǐn)?shù)高的進(jìn)程判定為bad進(jìn)程,殺死并釋放內(nèi)存

    • OOM_ODJ:判別進(jìn)程的優(yōu)先級(jí)


    3、Android?;罘桨?/span>

    • 利用系統(tǒng)廣播拉活

    • 利用系統(tǒng)Service機(jī)制拉活

    • 利用Native進(jìn)程拉活

    • 利用JobScheduler機(jī)制拉活

    • 利用賬號(hào)同步機(jī)制拉活


    26 Lint面試題


    1、什么是Android Lint

    Android Lint是一個(gè)靜態(tài)代碼分析工具,它能夠?qū)δ愕腁ndroid項(xiàng)目中潛在的Bug、可優(yōu)化的代碼、安全性、性能、可用性、可訪問性、國際化等進(jìn)行檢查


    2、Lint工作流程


    3、配置Lint

    • 創(chuàng)建Lint.xml到根目錄下,自定義Lint安全等級(jí)等

    • 在Java文件中可以使用@suppressLint(“NewApi”)來忽視Lint的報(bào)錯(cuò)

    • 在xml文件中可以使用tool:ignore(“UnusedResources”)來忽視Lint的報(bào)錯(cuò)

    • 自定義Lint檢查,可以創(chuàng)建類,繼承Detector和實(shí)現(xiàn)JavaPsiScanner


    27 Kotlin面試題



    1、什么是Kotlin

    • Kotlin是一種基于JVM的編程語言

    • 對(duì)Java的一種拓展,比Java更簡潔

    • Kotlin支持函數(shù)式編程

    • Kotlin類和Java類可以相互調(diào)用


    2、Kotlin環(huán)境搭建

    • 直接在Plugin中下載Kotlin插件即可

    • 系統(tǒng)會(huì)自動(dòng)配置到Kotlin環(huán)境


    如果你有想學(xué)習(xí)的文章直接留言,我會(huì)整理征稿。如果你有好的文章想和大家分享歡迎投稿,直接向我投遞文章鏈接即可。


    歡迎長按下圖->識(shí)別圖中二維碼或者掃一掃關(guān)注我的公眾號(hào):

    最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
    平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
    • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
      沈念sama閱讀 230,578評(píng)論 6 544
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 99,701評(píng)論 3 429
    • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
      開封第一講書人閱讀 178,691評(píng)論 0 383
    • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
      開封第一講書人閱讀 63,974評(píng)論 1 318
    • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
      茶點(diǎn)故事閱讀 72,694評(píng)論 6 413
    • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
      開封第一講書人閱讀 56,026評(píng)論 1 329
    • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
      沈念sama閱讀 44,015評(píng)論 3 450
    • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
      開封第一講書人閱讀 43,193評(píng)論 0 290
    • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
      沈念sama閱讀 49,719評(píng)論 1 336
    • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點(diǎn)故事閱讀 41,442評(píng)論 3 360
    • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
      茶點(diǎn)故事閱讀 43,668評(píng)論 1 374
    • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
      沈念sama閱讀 39,151評(píng)論 5 365
    • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
      茶點(diǎn)故事閱讀 44,846評(píng)論 3 351
    • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
      開封第一講書人閱讀 35,255評(píng)論 0 28
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
      開封第一講書人閱讀 36,592評(píng)論 1 295
    • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
      沈念sama閱讀 52,394評(píng)論 3 400
    • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
      茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

    推薦閱讀更多精彩內(nèi)容

    • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
      passiontim閱讀 172,775評(píng)論 25 708
    • 分享一篇Android知識(shí)點(diǎn)總結(jié)文章 面試復(fù)習(xí)——Android工程師之Android面試大綱 后續(xù)我會(huì)在這個(gè)的基...
      夷陵小祖閱讀 1,271評(píng)論 0 24
    • Activity是什么 Activity是四大組件之一,它提供一個(gè)界面讓用戶點(diǎn)擊和各種滑動(dòng)操作 Activity棧...
      叫我吹神閱讀 2,661評(píng)論 0 4
    • 所有知識(shí)點(diǎn)已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)? 在 Jav...
      侯蛋蛋_閱讀 2,482評(píng)論 1 4
    • 首先,思考一下以下代碼有什么區(qū)別: 看一下這兩段代碼的運(yùn)行結(jié)果,會(huì)不會(huì)有所感悟呢? 看了這兩段代碼。你會(huì)覺得,同樣...
      QinRenMin閱讀 216評(píng)論 0 0