【移動(dòng)應(yīng)用開發(fā)技術(shù)】21道Android高級(jí)面試題面試官都被搞愣了_第1頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】21道Android高級(jí)面試題面試官都被搞愣了_第2頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】21道Android高級(jí)面試題面試官都被搞愣了_第3頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】21道Android高級(jí)面試題面試官都被搞愣了_第4頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】21道Android高級(jí)面試題面試官都被搞愣了_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】21道Android高級(jí)面試題,面試官都被搞愣了

O(∩_∩)O~今天又給大家?guī)砹耍?1到Android高級(jí)面試題,搞懂了這些相信你去面試的時(shí)候一定可以鎮(zhèn)住面試官

O(∩_∩)O~今天又給大家?guī)砹耍?1到Android高級(jí)面試題,搞懂了這些相信你去面試的時(shí)候一定可以鎮(zhèn)住面試官為此我吧這些知識(shí)整理成了一個(gè)983的PDF,從基礎(chǔ)到進(jìn)階。含有BATJ.字節(jié)跳動(dòng)面試專題,算法專題,高端技術(shù)專題,混合開發(fā)專題,java面試專題,Android,Java小知識(shí),到性能優(yōu)化.線程.View.OpenCV.NDK等應(yīng)有盡有。還有輔之相關(guān)的視頻+學(xué)習(xí)筆記(更多完整項(xiàng)目下載。未完待續(xù)。源碼。圖文知識(shí)后續(xù)上傳github。)可以點(diǎn)擊關(guān)于我聯(lián)系我獲取完整PDF(VX:×××)2019Android高級(jí)面試題總結(jié)1.說下你所知道的設(shè)計(jì)模式與使用場(chǎng)景將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。使用場(chǎng)景比如最常見的AlertDialog,拿我們開發(fā)過程中舉例,比如Camera開發(fā)過程中,可能需要設(shè)置一個(gè)初始化的相機(jī)配置,設(shè)置攝像頭方向,閃光燈開閉,成像質(zhì)量等等,這種場(chǎng)景下就可以使用建造者模式動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活。裝飾者模式可以在不改變?cè)蓄惤Y(jié)構(gòu)的情況下曾強(qiáng)類的功能,比如Java中的BufferedInputStream包裝FileInputStream,舉個(gè)開發(fā)中的例子,比如在我們現(xiàn)有網(wǎng)絡(luò)框架上需要增加新的功能,那么再包裝一層即可,裝飾者模式解決了繼承存在的一些問題,比如多層繼承代碼的臃腫,使代碼邏輯更清晰2.java語(yǔ)言的特點(diǎn)與OOP思想這個(gè)通過對(duì)比來描述,比如面向?qū)ο蠛兔嫦蜻^程的對(duì)比,針對(duì)這兩種思想的對(duì)比,還可以舉個(gè)開發(fā)中的例子,比如播放器的實(shí)現(xiàn),面向過程的實(shí)現(xiàn)方式就是將播放視頻的這個(gè)功能分解成多個(gè)過程,比如,加載視頻地址,獲取視頻信息,初始化解碼器,選擇合適的解碼器進(jìn)行解碼,讀取解碼后的幀進(jìn)行視頻格式轉(zhuǎn)換和音頻重采樣,然后讀取幀進(jìn)行播放,這是一個(gè)完整的過程,這個(gè)過程中不涉及類的概念,而面向?qū)ο笞畲蟮奶攸c(diǎn)就是類,封裝繼承和多態(tài)是核心,同樣的以播放器為例,一面向?qū)ο蟮姆绞絹韺?shí)現(xiàn),將會(huì)針對(duì)每一個(gè)功能封裝出一個(gè)對(duì)象,吧如說Muxer,獲取視頻信息,Decoder,解碼,格式轉(zhuǎn)換器,視頻播放器,音頻播放器等,每一個(gè)功能對(duì)應(yīng)一個(gè)對(duì)象,由這個(gè)對(duì)象來完成對(duì)應(yīng)的功能,并且遵循單一職責(zé)原則,一個(gè)對(duì)象只做它相關(guān)的事情3.說下java中的線程創(chuàng)建方式,線程池的工作原理。java中有三種創(chuàng)建線程的方式,或者說四種線程池的工作原理:線程池可以減少創(chuàng)建和銷毀線程的次數(shù),從而減少系統(tǒng)資源的消耗,當(dāng)一個(gè)任務(wù)提交到線程池時(shí)

a.首先判斷核心線程池中的線程是否已經(jīng)滿了,如果沒滿,則創(chuàng)建一個(gè)核心線程執(zhí)行任務(wù),否則進(jìn)入下一步b.判斷工作隊(duì)列是否已滿,沒有滿則加入工作隊(duì)列,否則執(zhí)行下一步c.判斷線程數(shù)是否達(dá)到了最大值,如果不是,則創(chuàng)建非核心線程執(zhí)行任務(wù),否則執(zhí)行飽和策略,默認(rèn)拋出異常

a.首先判斷核心線程池中的線程是否已經(jīng)滿了,如果沒滿,則創(chuàng)建一個(gè)核心線程執(zhí)行任務(wù),否則進(jìn)入下一步b.判斷工作隊(duì)列是否已滿,沒有滿則加入工作隊(duì)列,否則執(zhí)行下一步c.判斷線程數(shù)是否達(dá)到了最大值,如果不是,則創(chuàng)建非核心線程執(zhí)行任務(wù),否則執(zhí)行飽和策略,默認(rèn)拋出異常4.說下handler原理Handler,Message,looper和MessageQueue構(gòu)成了安卓的消息機(jī)制,handler創(chuàng)建后可以通過sendMessage將消息加入消息隊(duì)列,然后looper不斷的將消息從MessageQueue中取出來,回調(diào)到Hander的handleMessage方法,從而實(shí)現(xiàn)線程的通信。從兩種情況來說,第一在UI線程創(chuàng)建Handler,此時(shí)我們不需要手動(dòng)開啟looper,因?yàn)樵趹?yīng)用啟動(dòng)時(shí),在ActivityThread的main方法中就創(chuàng)建了一個(gè)當(dāng)前主線程的looper,并開啟了消息隊(duì)列,消息隊(duì)列是一個(gè)無(wú)限循環(huán),為什么無(wú)限循環(huán)不會(huì)ANR?因?yàn)榭梢哉f,應(yīng)用的整個(gè)生命周期就是運(yùn)行在這個(gè)消息循環(huán)中的,安卓是由事件驅(qū)動(dòng)的,Looper.loop不斷的接收處理事件,每一個(gè)點(diǎn)擊觸摸或者Activity每一個(gè)生命周期都是在Looper.loop的控制之下的,looper.loop一旦結(jié)束,應(yīng)用程序的生命周期也就結(jié)束了。我們可以想想什么情況下會(huì)發(fā)生ANR,第一,事件沒有得到處理,第二,事件正在處理,但是沒有及時(shí)完成,而對(duì)事件進(jìn)行處理的就是looper,所以只能說事件的處理如果阻塞會(huì)導(dǎo)致ANR,而不能說looper的無(wú)限循環(huán)會(huì)ANR另一種情況就是在子線程創(chuàng)建Handler,此時(shí)由于這個(gè)線程中沒有默認(rèn)開啟的消息隊(duì)列,所以我們需要手動(dòng)調(diào)用looper.prepare(),并通過looper.loop開啟消息主線程Looper從消息隊(duì)列讀取消息,當(dāng)讀完所有消息時(shí),主線程阻塞。子線程往消息隊(duì)列發(fā)送消息,并且往管道文件寫數(shù)據(jù),主線程即被喚醒,從管道文件讀取數(shù)據(jù),主線程被喚醒只是為了讀取消息,當(dāng)消息讀取完畢,再次睡眠。因此loop的循環(huán)并不會(huì)對(duì)CPU性能有過多的消耗。5.內(nèi)存泄漏的場(chǎng)景和解決辦法非靜態(tài)內(nèi)部類會(huì)持有外部類的引用,如果非靜態(tài)內(nèi)部類的實(shí)例是靜態(tài)的,就會(huì)長(zhǎng)期的維持著外部類的引用,組織被系統(tǒng)回收,解決辦法是使用靜態(tài)內(nèi)部類匿名內(nèi)部類同樣會(huì)持有外部類的引用,如果在線程中執(zhí)行耗時(shí)操作就有可能發(fā)生內(nèi)存泄漏,導(dǎo)致外部類無(wú)法被回收,直到耗時(shí)任務(wù)結(jié)束,解決辦法是在頁(yè)面退出時(shí)結(jié)束線程中的任務(wù)Handler導(dǎo)致的內(nèi)存泄漏也可以被歸納為非靜態(tài)內(nèi)部類導(dǎo)致的,Handler內(nèi)部message是被存儲(chǔ)在MessageQueue中的,有些message不能馬上被處理,存在的時(shí)間會(huì)很長(zhǎng),導(dǎo)致handler無(wú)法被回收,如果handler是非靜態(tài)的,就會(huì)導(dǎo)致它的外部類無(wú)法被回收,解決辦法是1.使用靜態(tài)handler,外部類引用使用弱引用處理2.在退出頁(yè)面時(shí)移除消息隊(duì)列中的消息根據(jù)場(chǎng)景確定使用Activity的Context還是Application的Context,因?yàn)槎呱芷诓煌?,?duì)于不必須使用Activity的Context的場(chǎng)景(Dialog),一律采用Application的Context,單例模式是最常見的發(fā)生此泄漏的場(chǎng)景,比如傳入一個(gè)Activity的Context被靜態(tài)類引用,導(dǎo)致無(wú)法回收使用靜態(tài)View可以避免每次啟動(dòng)Activity都去讀取并渲染View,但是靜態(tài)View會(huì)持有Activity的引用,導(dǎo)致無(wú)法回收,解決辦法是在Activity銷毀的時(shí)候?qū)㈧o態(tài)View設(shè)置為null(View一旦被加載到界面中將會(huì)持有一個(gè)Context對(duì)象的引用,在這個(gè)例子中,這個(gè)context對(duì)象是我們的Activity,聲明一個(gè)靜態(tài)變量引用這個(gè)View,也就引用了activity)WebView只要使用一次,內(nèi)存就不會(huì)被釋放,所以WebView都存在內(nèi)存泄漏的問題,通常的解決辦法是為WebView單開一個(gè)進(jìn)程,使用AIDL進(jìn)行通信,根據(jù)業(yè)務(wù)需求在合適的時(shí)機(jī)釋放掉如Cursor,F(xiàn)ile等,內(nèi)部往往都使用了緩沖,會(huì)造成內(nèi)存泄漏,一定要確保關(guān)閉它并將引用置為null集合用于保存對(duì)象,如果集合越來越大,不進(jìn)行合理的清理,尤其是入股集合是靜態(tài)的bitmap是比較占內(nèi)存的,所以一定要在不使用的時(shí)候及時(shí)進(jìn)行清理,避免靜態(tài)變量持有大的bitmap對(duì)象很多需要register和unregister的系統(tǒng)服務(wù)要在合適的時(shí)候進(jìn)行unregister,手動(dòng)添加的listener也需要及時(shí)移除6.如何避免OOM?1).使用更加輕量的數(shù)據(jù)結(jié)構(gòu):如使用ArrayMap/SparseArray替代HashMap,HashMap更耗內(nèi)存,因?yàn)樗枰~外的實(shí)例對(duì)象來記錄Mapping操作,SparseArray更加高效,因?yàn)樗苊饬薑eyValue的自動(dòng)裝箱,和裝箱后的解箱操作2.便面枚舉的使用,可以用靜態(tài)常量或者注解@IntDef替代3.Bitmap優(yōu)化:4.StringBuilder替代String:在有些時(shí)候,代碼中會(huì)需要使用到大量的字符串拼接的操作,這種時(shí)候有必要考慮使用StringBuilder來替代頻繁的“+”5.避免在類似onDraw這樣的方法中創(chuàng)建對(duì)象,因?yàn)樗鼤?huì)迅速占用大量?jī)?nèi)存,引起頻繁的GC甚至內(nèi)存抖動(dòng)6.減少內(nèi)存泄漏也是一種避免OOM的方法7.說下Activity的啟動(dòng)模式,生命周期,兩個(gè)Activity跳轉(zhuǎn)的生命周期,如果一個(gè)Activity跳轉(zhuǎn)另一個(gè)Activity再按下Home鍵在回到Activity的生命周期是什么樣的Standard模式:Activity可以有多個(gè)實(shí)例,每次啟動(dòng)Activity,無(wú)論任務(wù)棧中是否已經(jīng)有這個(gè)Activity的實(shí)例,系統(tǒng)都會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例SingleTop模式:當(dāng)一個(gè)singleTop模式的Activity已經(jīng)位于任務(wù)棧的棧頂,再去啟動(dòng)它時(shí),不會(huì)再創(chuàng)建新的實(shí)例,如果不位于棧頂,就會(huì)創(chuàng)建新的實(shí)例SingleTask模式:如果Activity已經(jīng)位于棧頂,系統(tǒng)不會(huì)創(chuàng)建新的Activity實(shí)例,和singleTop模式一樣。但Activity已經(jīng)存在但不位于棧頂時(shí),系統(tǒng)就會(huì)把該Activity移到棧頂,并把它上面的activity出棧SingleInstance模式:singleInstance模式也是單例的,但和singleTask不同,singleTask只是任務(wù)棧內(nèi)單例,系統(tǒng)里是可以有多個(gè)singleTaskActivity實(shí)例的,而singleInstanceActivity在整個(gè)系統(tǒng)里只有一個(gè)實(shí)例,啟動(dòng)一singleInstanceActivity時(shí),系統(tǒng)會(huì)創(chuàng)建一個(gè)新的任務(wù)棧,并且這個(gè)任務(wù)棧只有他一個(gè)Activity生命周期onCreateonStartonResumeonPauseonStoponDestroy1.啟動(dòng)AonCreate-onStart-onResume2.在A中啟動(dòng)BActivityAonPauseActivityBonCreateActivityBonStartActivityBonResumeActivityAonStop3.從B中返回A(按物理硬件返回鍵)ActivityBonPauseActivityAonRestartActivityAonStartActivityAonResumeActivityBonStopActivityBonDestroy4.繼續(xù)返回ActivityAonPauseActivityAonStopActivityAonDestroy8.onRestart的調(diào)用場(chǎng)景

(1)按下home鍵之后,然后切換回來,會(huì)調(diào)用onRestart()。(2)從本Activity跳轉(zhuǎn)到另一個(gè)Activity之后,按back鍵返回原來Activity,會(huì)調(diào)用onRestart();(3)從本Activity切換到其他的應(yīng)用,然后再?gòu)钠渌麘?yīng)用切換回來,會(huì)調(diào)用onRestart();說下Activity的橫豎屏的切換的生命周期,用那個(gè)方法來保存數(shù)據(jù),兩者的區(qū)別。觸發(fā)在什么時(shí)候在那個(gè)方法里可以獲取數(shù)據(jù)等。

(1)按下home鍵之后,然后切換回來,會(huì)調(diào)用onRestart()。(2)從本Activity跳轉(zhuǎn)到另一個(gè)Activity之后,按back鍵返回原來Activity,會(huì)調(diào)用onRestart();(3)從本Activity切換到其他的應(yīng)用,然后再?gòu)钠渌麘?yīng)用切換回來,會(huì)調(diào)用onRestart();說下Activity的橫豎屏的切換的生命周期,用那個(gè)方法來保存數(shù)據(jù),兩者的區(qū)別。觸發(fā)在什么時(shí)候在那個(gè)方法里可以獲取數(shù)據(jù)等。9.是否了SurfaceView,它是什么?他的繼承方式是什么?他與View的區(qū)別(從源碼角度,如加載,繪制等)。SurfaceView中采用了雙緩沖機(jī)制,保證了UI界面的流暢性,同時(shí)SurfaceView不在主線程中繪制,而是另開辟一個(gè)線程去繪制,所以它不妨礙UI線程;SurfaceView繼承于View,他和View主要有以下三點(diǎn)區(qū)別:View:顯示視圖,內(nèi)置畫布,提供圖形繪制函數(shù)、觸屏事件、按鍵事件函數(shù)等;必須在UI主線程內(nèi)更新畫面,速度較慢。SurfaceView:基于view視圖進(jìn)行拓展的視圖類,更適合2Dgame的開發(fā);是view的子類,類似使用雙緩機(jī)制,在新的線程中更新畫面所以刷新界面速度比view快,Camera預(yù)覽界面使用SurfaceView。GLSurfaceView:基于SurfaceView視圖再次進(jìn)行拓展的視圖類,專用于3Dgame開發(fā)的視圖;是SurfaceView的子類,openGL專用。10.如何實(shí)現(xiàn)進(jìn)程?;?/p>

a:Service設(shè)置成START_STICKYkill后會(huì)被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣b:通過startForeground將進(jìn)程設(shè)置為前臺(tái)進(jìn)程,做前臺(tái)服務(wù),優(yōu)先級(jí)和前臺(tái)應(yīng)用一個(gè)級(jí)別,除非在系統(tǒng)內(nèi)存非常缺,否則此進(jìn)程不會(huì)被killc:雙進(jìn)程Service:讓2個(gè)進(jìn)程互相保護(hù)對(duì)方,其中一個(gè)Service被清理后,另外沒被清理的進(jìn)程可以立即重啟進(jìn)程d:用C編寫守護(hù)進(jìn)程(即子進(jìn)程):Android系統(tǒng)中當(dāng)前進(jìn)程(Process)fork出來的子進(jìn)程,被系統(tǒng)認(rèn)為是兩個(gè)不同的進(jìn)程。當(dāng)父進(jìn)程被殺死的時(shí)候,子進(jìn)程仍然可以存活,并不受影響(Android5.0以上的版本不可行)聯(lián)系廠商,加入白名單e.鎖屏狀態(tài)下,開啟一個(gè)一像素Activity

a:Service設(shè)置成START_STICKYkill后會(huì)被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣b:通過startForeground將進(jìn)程設(shè)置為前臺(tái)進(jìn)程,做前臺(tái)服務(wù),優(yōu)先級(jí)和前臺(tái)應(yīng)用一個(gè)級(jí)別,除非在系統(tǒng)內(nèi)存非常缺,否則此進(jìn)程不會(huì)被killc:雙進(jìn)程Service:讓2個(gè)進(jìn)程互相保護(hù)對(duì)方,其中一個(gè)Service被清理后,另外沒被清理的進(jìn)程可以立即重啟進(jìn)程d:用C編寫守護(hù)進(jìn)程(即子進(jìn)程):Android系統(tǒng)中當(dāng)前進(jìn)程(Process)fork出來的子進(jìn)程,被系統(tǒng)認(rèn)為是兩個(gè)不同的進(jìn)程。當(dāng)父進(jìn)程被殺死的時(shí)候,子進(jìn)程仍然可以存活,并不受影響(Android5.0以上的版本不可行)聯(lián)系廠商,加入白名單e.鎖屏狀態(tài)下,開啟一個(gè)一像素Activity11.說下冷啟動(dòng)與熱啟動(dòng)是什么,區(qū)別,如何優(yōu)化,使用場(chǎng)景等。app冷啟動(dòng):當(dāng)應(yīng)用啟動(dòng)時(shí),后臺(tái)沒有該應(yīng)用的進(jìn)程,這時(shí)系統(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給該應(yīng)用,這個(gè)啟動(dòng)方式就叫做冷啟動(dòng)(后臺(tái)不存在該應(yīng)用進(jìn)程)。冷啟動(dòng)因?yàn)橄到y(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給它,所以會(huì)先創(chuàng)建和初始化Application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測(cè)量、布局、繪制),最后顯示在界面上。app熱啟動(dòng):當(dāng)應(yīng)用已經(jīng)被打開,但是被按下返回鍵、Home鍵等按鍵時(shí)回到桌面或者是其他程序的時(shí)候,再重新打開該app時(shí),這個(gè)方式叫做熱啟動(dòng)(后臺(tái)已經(jīng)存在該應(yīng)用進(jìn)程)。熱啟動(dòng)因?yàn)闀?huì)從已有的進(jìn)程中來啟動(dòng),所以熱啟動(dòng)就不會(huì)走Application這步了,而是直接走M(jìn)ainActivity(包括一系列的測(cè)量、布局、繪制),所以熱啟動(dòng)的過程只需要?jiǎng)?chuàng)建和初始化一個(gè)MainActivity就行了,而不必創(chuàng)建和初始化Application冷啟動(dòng)的流程當(dāng)點(diǎn)擊app的啟動(dòng)圖標(biāo)時(shí),安卓系統(tǒng)會(huì)從Zygote進(jìn)程中fork創(chuàng)建出一個(gè)新的進(jìn)程分配給該應(yīng)用,之后會(huì)依次創(chuàng)建和初始化Application類、創(chuàng)建MainActivity類、加載主題樣式Theme中的windowBackground等屬性設(shè)置給MainActivity以及配置Activity層級(jí)上的一些屬性、再inflate布局、當(dāng)onCreate/onStart/onResume方法都走完了后最后才進(jìn)行contentView的measure/layout/draw顯示在界面上冷啟動(dòng)的生命周期簡(jiǎn)要流程:Application構(gòu)造方法–>attachBaseContext()–>onCreate–>Activity構(gòu)造方法–>onCreate()–>配置主體中的背景等操作–>onStart()–>onResume()–>測(cè)量、布局、繪制顯

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論