大家好,這一期呢,我們來(lái)說(shuō)一下,安卓的面試問題。
第1道題, ?什么是安卓?
安卓是一款開源的手機(jī)操作系統(tǒng)。它的內(nèi)核是基于Linux的。
第2道題,什么是谷歌安卓SDK?
谷歌安卓SDK是一系列的工具集, 用來(lái)做安卓應(yīng)用程序開發(fā)的。
其中也包含了圖形界面工具,可以模擬安卓設(shè)備的運(yùn)行, 也包含了相關(guān)的工具來(lái)測(cè)試和調(diào)試你的代碼。
第3道題,什么是安卓的架構(gòu)?
安卓的架構(gòu)包含4個(gè)主要部件Linux內(nèi)核,程序庫(kù),安卓框架和安卓應(yīng)用。
第4道題,描述一下安卓框架。
安卓框架是安卓架構(gòu)中的重要一環(huán),是程序員用于編寫安卓應(yīng)用的基礎(chǔ),包含所有的類和方法,程序庫(kù)等等。
第5道題,什么是AAPT?
AAPT是Android資產(chǎn)打包工具的縮寫。這些工具允許程序員處理壓縮兼容的文件,這其中包括創(chuàng)建, 解壓還有查看里面的內(nèi)容。
第6道題, 在Android生態(tài)中,模擬器有什么好處?
模擬器允許程序員在里面運(yùn)行自己早期開發(fā)的代碼。這樣你就不需要在實(shí)際的設(shè)備上去運(yùn)行還沒有成型的程序。第一可以節(jié)省成本,第二防止設(shè)備被有些程序損壞。
第7道題,什么是activity creator?
Activity creator是在安卓集成環(huán)境中用來(lái)創(chuàng)建安卓工程的工具,它是由一些腳本構(gòu)成的。
第8道題,描述一下activities。
Activity可以呈現(xiàn)給用戶一個(gè)界面,用戶可以輸入數(shù)據(jù),并且可以顯示數(shù)據(jù)計(jì)算后的結(jié)果,當(dāng)然activity也可以是隱藏性的。
第9道題,什么是intents?
Intent在安卓環(huán)境中可以向用戶發(fā)出通知,同時(shí)用戶也可以向intent做出自己的反饋。
第10道題,activities和services有什么區(qū)別?
Activities是可以隨時(shí)被關(guān)閉的, 常見的情況就是用戶不需要這個(gè)界面了,就直接可以把這個(gè)界面關(guān)掉。
而services就不一樣,它是用來(lái)在程序的后臺(tái)運(yùn)行的。不管有沒有activities的運(yùn)行, services都可以獨(dú)立的在后臺(tái)運(yùn)行。
第11道題, 一個(gè)安卓工程在文件結(jié)構(gòu)上哪些項(xiàng)目是比較重要的?
Android的manifest xml。
build的xml。
bin文件夾。
src文件夾。
res文件夾。
assets文件夾。
第12道題,以xml為基礎(chǔ)的布局有什么重要性?
Xml布局提供了統(tǒng)一的,標(biāo)準(zhǔn)性的uI設(shè)計(jì)格式。通常的ui可以使用xml布局來(lái)定義,當(dāng)然也可以直接在其他代碼中定義。
第13道題,什么是容器?
容器就是為了容納多個(gè)子部件在里面,它可以包含子容器,它可以包含一個(gè)標(biāo)簽,一個(gè)成員變量,一個(gè)按鈕等等。
第14道題,什么是orientation?
Orientation是指屏幕的布局,是橫向布局還是縱向布局。
第15道題,安卓在移動(dòng)市場(chǎng)中的重要性有哪些?
目前的移動(dòng)市場(chǎng)中,安卓的市場(chǎng)份額是最大的, 超過了百分之80。
第16道題,安卓的不好的地方有哪些?
安卓第1個(gè)不好的地方就是廠商太多,版本太多,這樣會(huì)導(dǎo)致一個(gè)兼容性的問題。
安卓第2個(gè)不好的地方是給程序員帶來(lái)了很多的麻煩, 程序員不得不處理不同的版本的兼容,也需要處理不同的屏幕大小的兼容。
第17道題,什么是adb?
Adb是Android debug bridge的縮寫。它允許你通過命令行的方式跟安卓手機(jī)進(jìn)行交互。它的交互接口是通過以虛擬器的一個(gè)端口來(lái)進(jìn)行的。
第18道題,Activity4個(gè)比較重要的階段。
active, paused, stopped destroyed.
第19道題, 什么是anr?
Anr是application not responding的縮寫。當(dāng)一個(gè)界面,很長(zhǎng)時(shí)間沒有給用戶反饋的時(shí)候,anr就會(huì)被觸發(fā)。
第20道題, 說(shuō)一下應(yīng)用開發(fā)中權(quán)限設(shè)置的重要性。
權(quán)限主要是為了保護(hù)數(shù)據(jù)和代碼, 有了這些權(quán)限的設(shè)定,程序員在開發(fā)程序的時(shí)候,可以指定哪些權(quán)限用戶需要允許才能使用程序?qū)?yīng)的功能。
第21道題,intent filter的功能是什么?
Intent filter可以指定信息的類別,每個(gè)組件在收到這種信息的時(shí)候,可以根據(jù)自身的信息類別定義來(lái)決定是否進(jìn)行響應(yīng)。
第22道題,列舉出三個(gè)activity的關(guān)鍵狀態(tài)對(duì)應(yīng)。
整個(gè)周期, oncreate, ondestroy.
可見周期, onstart,onstop.
前臺(tái)周期, onresume,onpause.
第23道題,什么時(shí)候onstop方法會(huì)被調(diào)用?
當(dāng)activity的界面不被用戶看到的時(shí)候。
第24道題, 如何避免anr?
主線程及ui線程要盡可能的少做事情, 以便確保反映時(shí)間。使用后臺(tái)線程來(lái)處理比較耗時(shí)的任務(wù)。
第25道題,dalvik在安卓開發(fā)中有什么作用?
Dalvik就是安卓平臺(tái)的虛擬機(jī)。在Android平臺(tái)上,通過更好的內(nèi)存管理, 你可以運(yùn)行多個(gè)dalvik虛擬機(jī)。
第26道題,Android manifest xml是干什么的?
這個(gè)文件對(duì)于每個(gè)安卓應(yīng)用工程都是必須的。它在應(yīng)用的根目錄下,它包含著整個(gè)程序運(yùn)行的信息,安卓系統(tǒng)必須在程序運(yùn)行之前知道這些信息。
第27道題, 列舉一下通過Aidl創(chuàng)建一個(gè)綁定服務(wù)的步驟。
第1步是創(chuàng)建一個(gè)Aidl文件, 用來(lái)定義程序接口。
第2步是實(shí)現(xiàn)這些接口, 這其中包括擴(kuò)展,抽象的stub類,同時(shí)要實(shí)現(xiàn)它的方法。
第3步是暴露這些接口, 以便客戶端可以調(diào)用這些接口。
第28道題, 什么時(shí)候anr會(huì)出現(xiàn)?
當(dāng)用戶輸入在5秒鐘內(nèi)沒有反應(yīng)的時(shí)候,Anr會(huì)出現(xiàn)。
當(dāng)一個(gè)broadcast receiver在10秒鐘之內(nèi)還沒有做完的時(shí)候,anr也會(huì)出現(xiàn)。
第29題,什么是aidl?
它是Android interface definition language的縮寫。它定義了客戶端與一個(gè)服務(wù)之間進(jìn)行通訊的接口。這種通信可以是進(jìn)程內(nèi)的,也可以是跨進(jìn)程的。因?yàn)橐粋€(gè)進(jìn)程無(wú)法訪問另一個(gè)進(jìn)程的內(nèi)存空間,所以通過這種接口,我們可以實(shí)現(xiàn)兩個(gè)進(jìn)程之間的通信。
第30題,Aidl支持哪些數(shù)據(jù)類型?
string
charSequence
List
Map
int, long, char, boolean
第31題,什么是fragment?
Fragment是activity的一部分。在一個(gè)activity中,你可以包含多個(gè)fragment。Fragment最大好處是可重用的。
第32題,什么是可見的activity?
可見的activity是指它在一個(gè)對(duì)話框框的后面,用戶可以看到它,但它并不在最前臺(tái)。
第33題, 刪掉一個(gè)前端的activity的最好時(shí)機(jī)是什么?
當(dāng)一個(gè)前端的activity占有太多的內(nèi)存的時(shí)候,最好的時(shí)機(jī)把它殺掉。
第34題,在安卓應(yīng)用架構(gòu)中最核心的組件有哪些?
Services, intent, resource externalization,notifications, content providers.
第35道題, 什么是sticky intent?
通過sendstickybroadcast方法,廣播而來(lái)的就是一個(gè)sticky intent, 會(huì)在廣播完了以后依然存在。
第36道題, 通常的bitmap跟nine patch image有什么區(qū)別?
通常來(lái)說(shuō)nine patch image允許中間區(qū)域向兩個(gè)坐標(biāo)方向放大縮小, 邊界上允許向一個(gè)坐標(biāo)方向放大縮小, 4個(gè)角上不允許放大縮小。
第37道題,安卓中activity的加載模式有哪些?
Standard, Single Top, Single task, Single instance.
第38道題, 當(dāng)屏幕旋轉(zhuǎn)以后,activity會(huì)發(fā)生什么?
當(dāng)屏幕旋轉(zhuǎn)以后,當(dāng)前的activity會(huì)被殺掉,然后會(huì)調(diào)用on restart方法,其他的跟啟動(dòng)一個(gè)activity的流程是一樣的。
第39道題,如何防止在屏幕旋轉(zhuǎn)以后數(shù)據(jù)被重置和重新加載?
最基本的方法是用view models和on save instance state來(lái)做。View models它是不會(huì)在activity重啟的過程中發(fā)生改變的。是獨(dú)立于activity的。on save instance state用來(lái)收集比較少量的用戶界面數(shù)據(jù)。
第40道題, 有哪些方法在啟動(dòng)一個(gè)新activity的時(shí)候可以消除activity的后退棧狀態(tài)?
第1種方法是使用flag activity clear Top.
第2種方法是使用flag activity clear task和flag activity new task.
第41道題,F(xiàn)lag activity clear task 和 flag activity clear top的區(qū)別是什么?
Flag activity clear task會(huì)清空所有的activities.它必須跟flag activity new task結(jié)合才能啟動(dòng)一個(gè)新的activity。
Flag activity clear Top會(huì)保留老activity中的一個(gè), 清空其他所有的. 如果沒有老activity,那么它就會(huì)啟動(dòng)一個(gè)新的。
第42道題, Content provider是干什么用的?
Content provider用來(lái)從一個(gè)應(yīng)用中向另一個(gè)應(yīng)用提供數(shù)據(jù)。
如果你想使用content provide的數(shù)據(jù),那么你必須使用content resolver對(duì)象作為客戶端。
第43道題, 如何訪問content provider中的數(shù)據(jù)?
首先要確定你的安卓應(yīng)用有讀取的權(quán)限,然后使用get content resolver來(lái)獲取content resolver對(duì)象,然后在這個(gè)對(duì)象上使用query方法。Query方法會(huì)返回一個(gè)cursor對(duì)象, 使用cursor對(duì)象你可以訪問每一列每一行的數(shù)據(jù)。
第44道題, 談一下services。
Services是用來(lái)執(zhí)行一些比較耗時(shí)的任務(wù)。
有三種services。
一種是前臺(tái)service。比如說(shuō)你可以用來(lái)播放音樂。但是必須要給用戶發(fā)送一個(gè)提示。
一種是后臺(tái)service。從API26以后,推薦使用work manager來(lái)管理后臺(tái)service。
一種是bound service。使用bind service可以創(chuàng)建bound service,提供了客戶端服務(wù)器端進(jìn)行交互的通信模式。
第45道題, Service和intent service的區(qū)別。
Service是安卓中所有service的基礎(chǔ)類。
Intent service是service的擴(kuò)展類。它運(yùn)行在worker線程里面,客戶端通過start service來(lái)發(fā)送請(qǐng)求, 當(dāng)沒有請(qǐng)求的時(shí)候,會(huì)終止自己。
第46道題, async task和線程的區(qū)別。
線程是為了執(zhí)行一段比較耗時(shí)的操作,不能夠用來(lái)更新界面上的改變。
async task主要是來(lái)做比較快速的操作, 同時(shí)可以更新界面。
第47道題, Handler是用來(lái)干什么的?
handler可以用來(lái)管理線程, 進(jìn)行線程間的通信。它獨(dú)立于activity之外運(yùn)行。如果你需要在后周期性的執(zhí)行操作, handler是一個(gè)非常好的方案。
第48道題, 什么是job scheduling?
job scheduling是一種讓開發(fā)者只集中到工作本身不需要關(guān)心資源是如何分配的,這樣系統(tǒng)就會(huì)幫你處理類似內(nèi)存,電源和網(wǎng)絡(luò)連接方面的調(diào)度。
第49道題, async task和activity的生命周期有什么關(guān)聯(lián)?
兩者沒有關(guān)聯(lián)。
第50道題, On trim memory 方法是用來(lái)干什么的?
當(dāng)安卓系統(tǒng)決定要對(duì)內(nèi)存進(jìn)行調(diào)整的時(shí)候,這個(gè)方法會(huì)被調(diào)用。
當(dāng)你實(shí)現(xiàn)component call backs 2 interface的時(shí)候, 如果你的程序被系統(tǒng)殺掉,這個(gè)方法就會(huì)被調(diào)用。
第51道題, aidl和messenger queue的區(qū)別?
aidl主要是用于進(jìn)程間的通信。
Messenger queue主要是用于進(jìn)程內(nèi)的通信。
第52道題, Thread pool和獨(dú)立的多個(gè)thread有什么區(qū)別?
線程的創(chuàng)建和銷毀都是會(huì)消耗很多時(shí)間和資源的。如果你會(huì)頻繁的創(chuàng)建線程的話,那最好的方法就是使用thread pool。
第53道題, 如何從后臺(tái)的服務(wù)中更新前端的activity ui?
可以使用broadcast receiver.
第54道題, 什么是pending intent?
如果你希望一個(gè)操作,在未來(lái)的某個(gè)時(shí)間被觸發(fā),那么你就應(yīng)該創(chuàng)建pending intent。
第55道題, 說(shuō)一下fragment的生命周期。
On attach, on create, on create view, on activity created, on start, on resume, on pause, on stop, on destroy view, on destroy.
第56道題, 什么時(shí)候你應(yīng)該用fragment而不是activity?
第1種情況是如果你的ui組件會(huì)被多個(gè)activity使用。
第2種情況是你的activity中會(huì)有多個(gè)試圖,它們會(huì)像tab 那樣顯示。
第3種情況是你的activity重啟以后你的數(shù)據(jù)依然會(huì)保留在某個(gè)地方。
第57道題,解釋一下adding和replacing fragment的區(qū)別。
Replacing會(huì)去掉已經(jīng)存在的fragment,然后加上一個(gè)新的, 如果你按back 按鈕的話, 這個(gè)方法會(huì)調(diào)用on create view。
Adding不會(huì)去掉存在的fragment, 只會(huì)加上一個(gè)新的fragment, 如果你按back按鈕的話,它不會(huì)調(diào)用on create view。
第58道題? 為什么推薦用缺省構(gòu)造函數(shù)來(lái)創(chuàng)建fragment?
原因是數(shù)據(jù)通過bundle傳送,可以保證你不會(huì)丟失數(shù)據(jù)。
第59道題, 在你使用replacing添加一個(gè)fragment的時(shí)候,如何保證用戶按回退按鈕可以返回到上一個(gè)fragment?
在調(diào)用commit之前,首先調(diào)用add to back stack。
第60道題, 什么是retained fragment?
通過調(diào)用set retain instance,true來(lái)告訴系統(tǒng),保留這個(gè)fragment.
第61道題, fragment pager adapter和fragment state pager adapter的區(qū)別是什么?
Fragment pager adapter的每一頁(yè)會(huì)保存在內(nèi)存里面。在翻頁(yè)的時(shí)候試圖會(huì)被重新創(chuàng)建,但是fragment不會(huì)被重新創(chuàng)建。
使用這個(gè)adapter會(huì)消耗大量的內(nèi)存。使用detach方法來(lái)退掉這個(gè)fragment,而不是用remove。
Fragment state pager adapter 的每一頁(yè)在不可見的時(shí)候都會(huì)被釋放掉,只保存狀態(tài). 這樣做適合處理大數(shù)據(jù)的顯示。尤其是對(duì)于非常多的fragement頁(yè)的時(shí)候,這種方法是首選。
第62道題,什么是loaders?
Loaders是在API11以后添加進(jìn)來(lái)的用于加載來(lái)自數(shù)據(jù)源的數(shù)據(jù)的機(jī)制。會(huì)保留和緩存查詢到的結(jié)果,并且能夠防止重復(fù)查詢。
第63道題, Dialog和dialog fragment的區(qū)別?
Dialog是獨(dú)立于activity之外的試圖界面。
Dialog fragment是依附于activity的。它包含一個(gè)dialog對(duì)象。
第64道題, Margin和padding的區(qū)別。
Margin是在容器外面,padding是在容器里面。
第65道題, 如何支持多屏幕尺寸?
使用靈活的布局。
使用可伸縮的nine patch bitmaps.
避免hard coded布局大小。
在資源布局中使用尺寸修飾符定義不同的布局。
第65道題, 什么是bitmap pooling?
就是用一個(gè)pool來(lái)管理多個(gè)bitmap對(duì)象。在使用的時(shí)候去pool里找,如果不存在就創(chuàng)建,如果存在了的話直接拿來(lái)用。
第66道題, 安卓中的權(quán)限保護(hù)等級(jí)是指什么?
正常等級(jí)。
危險(xiǎn)等級(jí)。
簽名等級(jí)。
簽名或者系統(tǒng)等級(jí)。
第67道題, Shared preferences中commit和applied區(qū)別是什么?
Commit是同步的。
Apply是異步的。
第68道題, Recycler review是如何工作的?
recycler view 用來(lái)顯示非常長(zhǎng)的列表。
它使用on bind view方法來(lái)替換視圖中的數(shù)據(jù)。
從而提高了速度,節(jié)省了內(nèi)存。
第69道題, Recycler review跟listview的區(qū)別是什么?
Recycle review使用view holder的模式。而這在listview中不是必須的。
Recycler ?view可以支持縱向和橫向的列表, 這個(gè)可以通過layout manager來(lái)實(shí)現(xiàn)。而list view只是豎向的列表。
動(dòng)畫效果方面recycler view更好。
第70道題, Mvc和mvp和mvvm的區(qū)別是什么。
Mvc也就是model,view, controller架構(gòu). 這種模式的最大問題是view跟controller, 耦合性非常強(qiáng)。這樣第一會(huì)導(dǎo)致單元測(cè)試比較麻煩。View的一點(diǎn)改動(dòng)會(huì)導(dǎo)致controller方面也必須做改動(dòng)。
Mvp就是model view presenter架構(gòu)。這種架構(gòu)通過一個(gè)試圖接口,使得單元測(cè)試非常容易。
Mvvm就是model view viewmodel架構(gòu). model部分負(fù)責(zé)數(shù)據(jù)和數(shù)據(jù)處理,商業(yè)邏輯方面。viewmodel部分負(fù)責(zé)獲取model的數(shù)據(jù),并且經(jīng)過計(jì)算給view使用??梢蕴峁﹙iew和model之間通過事件的方式傳遞消息。
第71道題, 什么是軟件開發(fā)中的solid原則。
S就是single responsibility principle.
O就是open closed principle.
L就是liskov substitution principle.
I就是interface segregation principle.
D就是dependency inversion principle.
上面只是我個(gè)人對(duì)這個(gè)話題的一點(diǎn)心得體會(huì),分享給大家,希望與大家討論,共同提高,歡迎拍磚。
?