成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

21道Android高級面試題,面試官都被搞愣了

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

成都創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè),網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。10多年品質(zhì),值得信賴!

21道Android高級面試題,面試官都被搞愣了

為此我吧這些知識整理成了一個983的PDF,從基礎(chǔ)到進階。含有BATJ.字節(jié)跳動面試專題,算法專題,高端技術(shù)專題,混合開發(fā)專題,java面試專題,Android,Java小知識,到性能優(yōu)化.線程.View.OpenCV.NDK等應(yīng)有盡有。還有輔之相關(guān)的視頻+學(xué)習(xí)筆記

(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:×××)

2019Android高級面試題總結(jié)

1.說下你所知道的設(shè)計模式與使用場景

1).建造者模式:

將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

使用場景比如最常見的AlertDialog,拿我們開發(fā)過程中舉例,比如Camera開發(fā)過程中,可能需要設(shè)置一個初始化的相機配置,設(shè)置攝像頭方向,閃光燈開閉,成像質(zhì)量等等,這種場景下就可以使用建造者模式

2).裝飾者模式:

動態(tài)的給一個對象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活。裝飾者模式可以在不改變原有類結(jié)構(gòu)的情況下曾強類的功能,比如Java中的BufferedInputStream 包裝FileInputStream,舉個開發(fā)中的例子,比如在我們現(xiàn)有網(wǎng)絡(luò)框架上需要增加新的功能,那么再包裝一層即可,裝飾者模式解決了繼承存在的一些問題,比如多層繼承代碼的臃腫,使代碼邏輯更清晰

3).觀察者模式
4).代理模式:
5).門面模式:
6).單例模式:
7).生產(chǎn)者消費者模式:

2.java語言的特點與OOP思想

這個通過對比來描述,比如面向?qū)ο蠛兔嫦蜻^程的對比,針對這兩種思想的對比,還可以舉個開發(fā)中的例子,比如播放器的實現(xiàn),面向過程的實現(xiàn)方式就是將播放視頻的這個功能分解成多個過程,比如,加載視頻地址獲取視頻信息,初始化解碼器,選擇合適的解碼器進行解碼,讀取解碼后的幀進行視頻格式轉(zhuǎn)換和音頻重采樣,然后讀取幀進行播放,這是一個完整的過程,這個過程中不涉及類的概念,而面向?qū)ο笞畲蟮奶攸c就是類,封裝繼承和多態(tài)是核心,同樣的以播放器為例,一面向?qū)ο蟮姆绞絹韺崿F(xiàn),將會針對每一個功能封裝出一個對象,吧如說Muxer,獲取視頻信息,Decoder,解碼,格式轉(zhuǎn)換器,視頻播放器,音頻播放器等,每一個功能對應(yīng)一個對象,由這個對象來完成對應(yīng)的功能,并且遵循單一職責(zé)原則,一個對象只做它相關(guān)的事情

3.說下java中的線程創(chuàng)建方式,線程池的工作原理。

java中有三種創(chuàng)建線程的方式,或者說四種

  • 繼承Thread類實現(xiàn)多線程
  • 實現(xiàn)Runnable接口
  • 實現(xiàn)Callable接口
  • 通過線程池

線程池的工作原理:線程池可以減少創(chuàng)建和銷毀線程的次數(shù),從而減少系統(tǒng)資源的消耗,當一個任務(wù)提交到線程池時

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

4.說下handler原理

HandlerMessage,looperMessageQueue構(gòu)成了安卓的消息機制,handler創(chuàng)建后可以通過sendMessage將消息加入消息隊列,然后looper不斷的將消息從MessageQueue中取出來,回調(diào)到HanderhandleMessage方法,從而實現(xiàn)線程的通信。

從兩種情況來說,第一在UI線程創(chuàng)建Handler,此時我們不需要手動開啟looper,因為在應(yīng)用啟動時,在ActivityThread的main方法中就創(chuàng)建了一個當前主線程的looper,并開啟了消息隊列,消息隊列是一個無限循環(huán),為什么無限循環(huán)不會ANR?因為可以說,應(yīng)用的整個生命周期就是運行在這個消息循環(huán)中的,安卓是由事件驅(qū)動的,Looper.loop不斷的接收處理事件,每一個點擊觸摸或者Activity每一個生命周期都是在Looper.loop的控制之下的,looper.loop一旦結(jié)束,應(yīng)用程序的生命周期也就結(jié)束了。我們可以想想什么情況下會發(fā)生ANR,第一,事件沒有得到處理,第二,事件正在處理,但是沒有及時完成,而對事件進行處理的就是looper,所以只能說事件的處理如果阻塞會導(dǎo)致ANR,而不能說looper的無限循環(huán)會ANR

另一種情況就是在子線程創(chuàng)建Handler,此時由于這個線程中沒有默認開啟的消息隊列,所以我們需要手動調(diào)用looper.prepare(),并通過looper.loop開啟消息
主線程Looper從消息隊列讀取消息,當讀完所有消息時,主線程阻塞。子線程往消息隊列發(fā)送消息,并且往管道文件寫數(shù)據(jù),主線程即被喚醒,從管道文件讀取數(shù)據(jù),主線程被喚醒只是為了讀取消息,當消息讀取完畢,再次睡眠。因此loop的循環(huán)并不會對CPU性能有過多的消耗。

5.內(nèi)存泄漏的場景和解決辦法

1).非靜態(tài)內(nèi)部類的靜態(tài)實例

非靜態(tài)內(nèi)部類會持有外部類的引用,如果非靜態(tài)內(nèi)部類的實例是靜態(tài)的,就會長期的維持著外部類的引用,組織被系統(tǒng)回收,解決辦法是使用靜態(tài)內(nèi)部類

2).多線程相關(guān)的匿名內(nèi)部類和非靜態(tài)內(nèi)部類

匿名內(nèi)部類同樣會持有外部類的引用,如果在線程中執(zhí)行耗時操作就有可能發(fā)生內(nèi)存泄漏,導(dǎo)致外部類無法被回收,直到耗時任務(wù)結(jié)束,解決辦法是在頁面退出時結(jié)束線程中的任務(wù)

3).Handler內(nèi)存泄漏

Handler導(dǎo)致的內(nèi)存泄漏也可以被歸納為非靜態(tài)內(nèi)部類導(dǎo)致的,Handler內(nèi)部message是被存儲在MessageQueue中的,有些message不能馬上被處理,存在的時間會很長,導(dǎo)致handler無法被回收,如果handler是非靜態(tài)的,就會導(dǎo)致它的外部類無法被回收,解決辦法是1.使用靜態(tài)handler,外部類引用使用弱引用處理2.在退出頁面時移除消息隊列中的消息

4).Context導(dǎo)致內(nèi)存泄漏

根據(jù)場景確定使用Activity的Context還是Application的Context,因為二者生命周期不同,對于不必須使用Activity的Context的場景(Dialog),一律采用Application的Context,單例模式是最常見的發(fā)生此泄漏的場景,比如傳入一個Activity的Context被靜態(tài)類引用,導(dǎo)致無法回收

5).靜態(tài)View導(dǎo)致泄漏

使用靜態(tài)View可以避免每次啟動Activity都去讀取并渲染View,但是靜態(tài)View會持有Activity的引用,導(dǎo)致無法回收,解決辦法是在Activity銷毀的時候?qū)㈧o態(tài)View設(shè)置為null(View一旦被加載到界面中將會持有一個Context對象的引用,在這個例子中,這個context對象是我們的Activity,聲明一個靜態(tài)變量引用這個View,也就引用了activity)

6).WebView導(dǎo)致的內(nèi)存泄漏

WebView只要使用一次,內(nèi)存就不會被釋放,所以WebView都存在內(nèi)存泄漏的問題,通常的解決辦法是為WebView單開一個進程,使用AIDL進行通信,根據(jù)業(yè)務(wù)需求在合適的時機釋放掉

7).資源對象未關(guān)閉導(dǎo)致

如Cursor,F(xiàn)ile等,內(nèi)部往往都使用了緩沖,會造成內(nèi)存泄漏,一定要確保關(guān)閉它并將引用置為null

8).集合中的對象未清理

集合用于保存對象,如果集合越來越大,不進行合理的清理,尤其是入股集合是靜態(tài)的

9).Bitmap導(dǎo)致內(nèi)存泄漏

bitmap是比較占內(nèi)存的,所以一定要在不使用的時候及時進行清理,避免靜態(tài)變量持有大的bitmap對象

10).監(jiān)聽器未關(guān)閉

很多需要registerunregister的系統(tǒng)服務(wù)要在合適的時候進行unregister,手動添加的listener也需要及時移除

6.如何避免OOM?

1).使用更加輕量的數(shù)據(jù)結(jié)構(gòu):
如使用ArrayMap/SparseArray替代HashMap,HashMap更耗內(nèi)存,因為它需要額外的實例對象來記錄Mapping操作,SparseArray更加高效,因為它避免了Key Value的自動裝箱,和裝箱后的解箱操作

2.便面枚舉的使用,可以用靜態(tài)常量或者注解@IntDef替代

3.Bitmap優(yōu)化:

  • 尺寸壓縮:通過InSampleSize設(shè)置合適的縮放
  • 顏色質(zhì)量:設(shè)置合適的format,ARGB_6666/RBG_545/ARGB_4444/ALPHA_6,存在很大差異
  • inBitmap:使用inBitmap屬性可以告知Bitmap解碼器去嘗試使用已經(jīng)存在的內(nèi)存區(qū)域,新解碼的Bitmap會嘗試去使用之前那張Bitmap在Heap中所占據(jù)的pixel data內(nèi)存區(qū)域,而不是去問內(nèi)存重新申請一塊區(qū)域來存放Bitmap。利用這種特性,即使是上千張的圖片,也只會僅僅只需要占用屏幕所能夠顯示的圖片數(shù)量的內(nèi)存大小,但復(fù)用存在一些限制,具體體現(xiàn)在:在Android 4.4之前只能重用相同大小的Bitmap的內(nèi)存,而Android 4.4及以后版本則只要后來的Bitmap比之前的小即可。使用inBitmap參數(shù)前,每創(chuàng)建一個Bitmap對象都會分配一塊內(nèi)存供其使用,而使用了inBitmap參數(shù)后,多個Bitmap可以復(fù)用一塊內(nèi)存,這樣可以提高性能

4.StringBuilder替代String:
在有些時候,代碼中會需要使用到大量的字符串拼接的操作,這種時候有必要考慮使用StringBuilder來替代頻繁的“+”

5.避免在類似onDraw這樣的方法中創(chuàng)建對象,因為它會迅速占用大量內(nèi)存,引起頻繁的GC甚至內(nèi)存抖動

6.減少內(nèi)存泄漏也是一種避免OOM的方法

7.說下Activity的啟動模式,生命周期,兩個Activity跳轉(zhuǎn)的生命周期,如果一個Activity跳轉(zhuǎn)另一個Activity再按下Home鍵在回到Activity的生命周期是什么樣的

啟動模式

Standard模式:Activity可以有多個實例,每次啟動Activity,無論任務(wù)棧中是否已經(jīng)有這個Activity的實例,系統(tǒng)都會創(chuàng)建一個新的Activity實例

SingleTop模式:當一個singleTop模式的Activity已經(jīng)位于任務(wù)棧的棧頂,再去啟動它時,不會再創(chuàng)建新的實例,如果不位于棧頂,就會創(chuàng)建新的實例
SingleTask模式:如果Activity已經(jīng)位于棧頂,系統(tǒng)不會創(chuàng)建新的Activity實例,和singleTop模式一樣。但Activity已經(jīng)存在但不位于棧頂時,系統(tǒng)就會把該Activity移到棧頂,并把它上面的activity出棧
SingleInstance模式:singleInstance模式也是單例的,但和singleTask不同,singleTask只是任務(wù)棧內(nèi)單例,系統(tǒng)里是可以有多個singleTaskActivity實例的,而singleInstance Activity在整個系統(tǒng)里只有一個實例,啟動一singleInstanceActivity時,系統(tǒng)會創(chuàng)建一個新的任務(wù)棧,并且這個任務(wù)棧只有他一個Activity生命周期

onCreate onStart onResume onPause onStop onDestroy

兩個Activity跳轉(zhuǎn)的生命周期

1.啟動A
onCreate - onStart - onResume

2.在A中啟動B
ActivityA onPause
ActivityB onCreate
ActivityB onStart
ActivityB onResume
ActivityA onStop

3.從B中返回A(按物理硬件返回鍵)
ActivityB onPause
ActivityA onRestart
ActivityA onStart
ActivityA onResume
ActivityB onStop
ActivityB onDestroy

4.繼續(xù)返回
ActivityA onPause
ActivityA onStop
ActivityA onDestroy

8.onRestart的調(diào)用場景

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

9.是否了SurfaceView,它是什么?他的繼承方式是什么?他與View的區(qū)別(從源碼角度,如加載,繪制等)。

SurfaceView中采用了雙緩沖機制,保證了UI界面的流暢性,同時SurfaceView不在主線程中繪制,而是另開辟一個線程去繪制,所以它不妨礙UI線程;

SurfaceView繼承于View,他和View主要有以下三點區(qū)別:

  • View底層沒有雙緩沖機制,SurfaceView有;
  • view主要適用于主動更新,而SurfaceView適用與被動的更新,如頻繁的刷新
  • view會在主線程中去更新UI,而SurfaceView則在子線程中刷新;SurfaceView的內(nèi)容不在應(yīng)用窗口上,所以不能使用變換(平移、縮放、旋轉(zhuǎn)等)。也難以放在ListView或者ScrollView中,不能使用UI控件的一些特性比如View.setAlpha()

View:顯示視圖,內(nèi)置畫布,提供圖形繪制函數(shù)、觸屏事件、按鍵事件函數(shù)等;必須在UI主線程內(nèi)更新畫面,速度較慢。

SurfaceView:基于view視圖進行拓展的視圖類,更適合2Dgame的開發(fā);是view的子類,類似使用雙緩機制,在新的線程中更新畫面所以刷新界面速度比view快,Camera預(yù)覽界面使用SurfaceView。

GLSurfaceView:基于SurfaceView視圖再次進行拓展的視圖類,專用于3Dgame開發(fā)的視圖;是SurfaceView的子類,openGL專用。

10.如何實現(xiàn)進程?;?/h4>

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

11.說下冷啟動與熱啟動是什么,區(qū)別,如何優(yōu)化,使用場景等。

app冷啟動: 當應(yīng)用啟動時,后臺沒有該應(yīng)用的進程,這時系統(tǒng)會重新創(chuàng)建一個新的進程分配給該應(yīng)用, 這個啟動方式就叫做冷啟動(后臺不存在該應(yīng)用進程)。冷啟動因為系統(tǒng)會重新創(chuàng)建一個新的進程分配給它,所以會先創(chuàng)建和初始化Application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上。

app熱啟動: 當應(yīng)用已經(jīng)被打開, 但是被按下返回鍵、Home鍵等按鍵時回到桌面或者是其他程序的時候,再重新打開該app時, 這個方式叫做熱啟動(后臺已經(jīng)存在該應(yīng)用進程)。熱啟動因為會從已有的進程中來啟動,所以熱啟動就不會走Application這步了,而是直接走MainActivity(包括一系列的測量、布局、繪制),所以熱啟動的過程只需要創(chuàng)建和初始化一個MainActivity就行了,而不必創(chuàng)建和初始化Application

冷啟動的流程
當點擊app的啟動圖標時,安卓系統(tǒng)會從Zygote進程中fork創(chuàng)建出一個新的進程分配給該應(yīng)用,之后會依次創(chuàng)建和初始化Application類、創(chuàng)建MainActivity類、加載主題樣式Theme中的windowBackground等屬性設(shè)置給MainActivity以及配置Activity層級上的一些屬性、再inflate布局、當onCreate/onStart/onResume方法都走完了后最后才進行contentViewmeasure/layout/draw顯示在界面上冷啟動的生命周期簡要流程:
Application構(gòu)造方法 –> attachBaseContext()–>onCreate –>Activity構(gòu)造方法 –> onCreate() –> 配置主體中的背景等操作 –>onStart() –> onResume() –> 測量、布局、繪制顯示

冷啟動的優(yōu)化主要是視覺上的優(yōu)化,解決白屏問題,提高用戶體驗,所以通過上面冷啟動的過程。能做的優(yōu)化如下:

1、減少onCreate()方法的工作量
2、不要讓Application參與業(yè)務(wù)的操作
3、不要在Application進行耗時操作
4、不要以靜態(tài)變量的方式在Application保存數(shù)據(jù)
5、減少布局的復(fù)雜度和層級
6、減少主線程耗時

12.三級緩存原理

當Android端需要獲得數(shù)據(jù)時比如獲取網(wǎng)絡(luò)中的圖片,首先從內(nèi)存中查找(按鍵查找),內(nèi)存中沒有的再從磁盤文件或sqlite中去查找,若磁盤中也沒有才通過網(wǎng)絡(luò)獲取

13.LruCache底層實現(xiàn)原理:

LruCacheLru算法的實現(xiàn)就是通過LinkedHashMap來實現(xiàn)的。LinkedHashMap繼承于HashMap,它使用了一個雙向鏈表來存儲Map中的Entry順序關(guān)系,
對于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,還做些調(diào)整Entry順序鏈表的工作。
LruCache中將LinkedHashMap的順序設(shè)置為LRU順序來實現(xiàn)LRU緩存,每次調(diào)用get(也就是從內(nèi)存緩存中取圖片),則將該對象移到鏈表的尾端。
調(diào)用put插入新的對象也是存儲在鏈表尾端,這樣當內(nèi)存緩存達到設(shè)定的最大值時,將鏈表頭部的對象(近期最少用到的)移除。

14.說下你對Collection這個類的理解。
15.JVM老年代和新生代的比例
16.jvm,jre以及jdk三者之間的關(guān)系?JDK(Java Development Kit)是針對Java開發(fā)員的產(chǎn)品,是整個Java的核心,包括了Java運行環(huán)境JRE、Java工具和Java基礎(chǔ)類庫。
17.談?wù)勀銓?JNIEnv 和 JavaVM 理解?
18.Serializable與Parcable的區(qū)別?
19.為什么冷啟動會有白屏黑屏問題?
20.Android中的線程有那些,原理與各自特點
21.ANR的原因

21道Android高級面試題,面試官都被搞愣了

所有的答案,請查看完整的PDF版
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:×××)

21道Android高級面試題,面試官都被搞愣了

標題名稱:21道Android高級面試題,面試官都被搞愣了
URL地址:http://jinyejixie.com/article40/gpeiho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、外貿(mào)網(wǎng)站建設(shè)、App開發(fā)網(wǎng)站設(shè)計公司、定制網(wǎng)站、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)
南澳县| 五常市| 陵川县| 梁平县| 兴义市| 阿鲁科尔沁旗| 巍山| 新沂市| 四平市| 滨州市| 东海县| 和田县| 边坝县| 广宁县| 常熟市| 象州县| 泰顺县| 麻栗坡县| 兴海县| 桂林市| 石柱| 遂川县| 武定县| 双鸭山市| 金沙县| 兴和县| 德保县| 静宁县| 扎鲁特旗| 沂水县| 阳朔县| 涪陵区| 大埔区| 富平县| 扎囊县| 白银市| 玛纳斯县| 苏尼特右旗| 舟山市| 桓仁| 聂拉木县|