android常見面試題
android面試中,有哪些常見的面試題呢?你有提前了解過了嗎?以下是小編幫你們整理的android常見面試題,一起來學(xué)習(xí)啦。
android常見面試題篇一
1、 android 中的動(dòng)畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么?
參考答案:
有兩種,一種是 Tween(補(bǔ)間) 動(dòng)畫、還有一種是 Frame(幀) 動(dòng)畫。Tween 動(dòng)畫,這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng)、放大、縮小以及產(chǎn)生透明度的變化;另一種 Frame 動(dòng)畫,傳統(tǒng)的動(dòng)畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影。
2、 請(qǐng)簡(jiǎn)述Handler的機(jī)制原理
參考答案:
andriod 提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進(jìn)先出原則。
Looper類用來管理特定線程內(nèi)對(duì)象之間的消息交換(Message Exchange)。
1)Looper: 一個(gè)線程可以產(chǎn)生一個(gè) Looper 對(duì)象,由它來管理此線程里的 Message Queue(消息隊(duì)列)。
2)Handler: 你可以構(gòu)造 Handler 對(duì)象來與 Looper 溝通,以便 push 新消息到 Message Queue 里;或者接收 Looper從 Message Queue 取出)所送來的消息。
3) Message Queue(消息隊(duì)列):用來存放線程放入的消息。
4)線程:UI thread 通常就是 main thread,而 Android 啟動(dòng)程序時(shí)會(huì)替它建立一個(gè)Message Queue。
3、 說說mvc模式的原理,它在android中的運(yùn)用
參考答案:
MVC 是 Model,View,Controller 的縮寫,從上圖可以看出 MVC 包含三個(gè)部分:
模型( Model )對(duì)象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫在該層。
視圖( View )對(duì)象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個(gè)MVC 架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。
控制器( Control )對(duì)象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新Model 對(duì)象狀態(tài)的部分,控制器更重要的一種導(dǎo)航功能,想用用戶觸發(fā)的相關(guān)事件,交給 Model處理。
Android 鼓勵(lì)弱耦合和組件的重用,在 Android 中 MVC 的具體體現(xiàn)如下
1) 視圖層( view ) :一般采用 xml 文件進(jìn)行界面的描述,使用的時(shí)候可以非常方便的引入,當(dāng)然,如何你對(duì) android 了解的比較的多了話,就一定可 以想到在 android 中也可以使用javascript+html 等的方式
作為 view 層,當(dāng)然這里需要進(jìn)行 java 和 javascript 之間的通 信,幸運(yùn)的是, android 提供了它們之間非常方便的通信實(shí)現(xiàn)。
2) 控制層( controller ): android 的控制層的重任通常落在了眾多的 acitvity 的肩上,這句話也就暗含了不要在 acitivity 中寫代碼,要通過 activity 交割 model 業(yè)務(wù)邏輯層處理, 這樣做的另外一個(gè)原因是 android 中的 acitivity 的響應(yīng)時(shí)間是 5s ,如果耗時(shí)的操作放在這里,程序就很容易被回收掉。
3) 模型層( model ): 對(duì)數(shù)據(jù)庫的操作、對(duì)網(wǎng)絡(luò)等的操作都應(yīng)該在 model 里面處理,當(dāng)然對(duì)業(yè)務(wù)計(jì)算等操作也是必須放在的該層的。
4、通過Intent傳遞一些二進(jìn)制數(shù)據(jù)的方法有哪些?
參考答案:
1). 使用Serializable接口實(shí)現(xiàn)序列化,這是Java常用的方法。
2). 實(shí)現(xiàn)Parcelable接口,這里Android的部分類比如Bitmap類就已經(jīng)實(shí)現(xiàn)了,同時(shí)Parcelable在Android AIDL中交換數(shù)據(jù)也很常見的。
android常見面試題篇二
1、在onCreate方法中Bundle savedInstanceState這個(gè)參數(shù)有什么作用?
參考答案:
在onCreate方法中有saveInstanceState這個(gè)參數(shù),其實(shí)這個(gè)參數(shù)對(duì)應(yīng)兩個(gè)方法。void onSaveInstanceState(Bundle outState);void onRestoreInstanceState(Bundle savedInstanceState)。當(dāng)某個(gè)activity變得“容易”被系統(tǒng)銷毀時(shí),說白了就是系統(tǒng)在內(nèi)存不足或者其他異常情況下把你的Activity銷毀時(shí),將調(diào)用這個(gè)方法。需要注意的是它是系統(tǒng)調(diào)用的,并且你的Activity是被動(dòng)得被銷毀。你可以在銷毀的時(shí)候保存一下數(shù)據(jù)。然后在onCreate方法中拿出來。那什么情況下能觸發(fā)這兩個(gè)方法呢?
1)、當(dāng)用戶按下HOME鍵時(shí)。
這是顯而易見的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會(huì)被銷毀,故系統(tǒng)會(huì)調(diào)用onSaveInstanceState,讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則
2)、長按HOME鍵,選擇運(yùn)行其他的程序時(shí)。
3)、按下電源按鍵(關(guān)閉屏幕顯示)時(shí)。
4)、從activity A中啟動(dòng)一個(gè)新的activity時(shí)。
5)、屏幕方向切換時(shí),例如從豎屏切換到橫屏?xí)r。
在屏幕切換之前,系統(tǒng)會(huì)銷毀activity A,在屏幕切換之后系統(tǒng)又會(huì)自動(dòng)地創(chuàng)建activity A,所以onSaveInstanceState一定會(huì)被執(zhí)行
總而言之,onSaveInstanceState的調(diào)用遵循一個(gè)重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時(shí)銷毀了你的activity,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用,這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對(duì)的被調(diào)用的,onRestoreInstanceState被調(diào)用的前提是,activity A“確實(shí)”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會(huì)被調(diào)用,例如,當(dāng)正在顯示activity A的時(shí)候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會(huì)因?yàn)閮?nèi)存的原因被系統(tǒng)銷毀,故activity A的onRestoreInstanceState方法不會(huì)被執(zhí)行
另外,onRestoreInstanceState的bundle參數(shù)也會(huì)傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原。
2、請(qǐng)談?wù)凙ctivity的生命周期?
參考答案:
在系統(tǒng)中的Activity被一個(gè)Activity棧所管理。當(dāng)一個(gè)新的Activity啟動(dòng)時(shí),將被放置到棧頂,成為運(yùn)行中的Activity,前一個(gè)Activity保留在棧中,不再放到前臺(tái),直到新的Activity退出為止。
Activity有四種本質(zhì)區(qū)別的狀態(tài):
1)在屏幕的前臺(tái)(Activity棧頂),叫做活動(dòng)狀態(tài)或者運(yùn)行狀態(tài)(active or running)
2)如果一個(gè)Activity失去焦點(diǎn),但是依然可見(一個(gè)新的非全屏的Activity 或者一個(gè)透明的Activity 被放置在棧頂),叫做暫停狀態(tài)(Paused)。一個(gè)暫停狀態(tài)的Activity依然保持活力(保持所有的狀態(tài),成員信息,和窗口管理器保持連接),但是在系統(tǒng)內(nèi)存極端低下的時(shí)候?qū)⒈粴⒌簟?/p>
3)如果一個(gè)Activity被另外的Activity完全覆蓋掉,叫做停止?fàn)顟B(tài)(Stopped)。它依然保持所有狀態(tài)和成員信息,但是它不再可見,所以它的窗口被隱藏,當(dāng)系統(tǒng)內(nèi)存需要被用在其他地方的時(shí)候,Stopped的Activity將被殺掉。
4)如果一個(gè)Activity是Paused或者Stopped狀態(tài),系統(tǒng)可以將該Activity從內(nèi)存中刪除,Android系統(tǒng)采用兩種方式進(jìn)行刪除,要么要求該Activity結(jié)束,要么直接殺掉它的進(jìn)程。當(dāng)該Activity再次顯示給用戶時(shí),它必須重新開始和重置前面的狀態(tài)。
3、談?wù)勀銓?duì)BroadCastRceiver的理解?
參考答案:
廣播接收者,android四大組件之一,也是唯一一個(gè)能動(dòng)態(tài)注冊(cè)的組件。
1)廣播接收者是一個(gè)專注于接收廣播通知信息,并做出對(duì)應(yīng)處理的組件。很多廣播是源自于系統(tǒng)──比如,通知時(shí)區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項(xiàng)。應(yīng)用程序也可以進(jìn)行廣播──比如說,通知其它應(yīng)用程序一些數(shù)據(jù)下載完成并處于可用狀態(tài)。
2)應(yīng)用程序可以擁有任意數(shù)量的廣播接收者以對(duì)所有它感興趣的通知信息予以響應(yīng)。所有的接收器均繼承自BroadcastReceiver基類。
3)廣播接收者沒有用戶界面。然而,它們可以啟動(dòng)一個(gè)activity來響應(yīng)它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動(dòng)背燈、震動(dòng)、播放聲音等等。一般來說是在狀態(tài)欄上放一個(gè)持久的圖標(biāo),用戶可以打開它并獲取消息。
4、廣播分幾種?他們有什么區(qū)別?
參考答案:
廣播被分為兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時(shí)刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點(diǎn)是:接收者不能將處理結(jié)果傳遞給下一個(gè)接收者,并且無法終止廣播Intent的傳播。
然而有序廣播是按照接收者聲明的優(yōu)先級(jí)別,被接收者依次接收廣播。如:A的級(jí)別高于B,B的級(jí)別高于C,那么,廣播先傳給A,再傳給B,最后傳給C 。優(yōu)先級(jí)別聲明在 intent-filter 元素的 android:priority 屬性中,數(shù)越大優(yōu)先級(jí)別越高,取值范圍:-1000到1000,優(yōu)先級(jí)別也可以調(diào)用IntentFilter對(duì)象的setPriority()進(jìn)行設(shè)置 。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,后面的接收者就無法接收到廣播。
另外,有序廣播的接收者可以將數(shù)據(jù)傳遞給下一個(gè)接收者,如:A得到廣播后,可以往它的結(jié)果對(duì)象中存入數(shù)據(jù),當(dāng)廣播傳給B時(shí),B可以從A的結(jié)果對(duì)象中得到A存入的數(shù)據(jù)。
Context.sendBroadcast()
發(fā)送的是普通廣播,所有訂閱者都有機(jī)會(huì)獲得并進(jìn)行處理。
Context.sendOrderedBroadcast()
發(fā)送的是有序廣播,系統(tǒng)會(huì)根據(jù)接收者聲明的優(yōu)先級(jí)別按順序逐個(gè)執(zhí)行接收者, 前面的接收者有權(quán)終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對(duì)于有序廣播,前面的接收者可以將數(shù)據(jù)通過setResultExtras(Bundle)方法存放進(jìn)結(jié)果對(duì)象,然后傳給下一個(gè)接收者,下一個(gè)接收者通過代碼:Bundle bundle = getResultExtras(true))可以獲取上一個(gè)接收者存入在結(jié)果對(duì)象中的數(shù)據(jù)。
android常見面試題篇三
1、廣播的生命周期?
參考答案:
廣播的生命周期是非常短的,當(dāng)發(fā)送之后intent會(huì)到AndroidManifest.xml文件中找是不是有匹配的action,如果有就會(huì)調(diào)用Receiver ,然后獲得Receiver 對(duì)象,再執(zhí)行onReceive方法,這時(shí)候Receiver對(duì)象就沒有用了,當(dāng)我們?cè)俅吸c(diǎn)擊按鈕的時(shí)候就會(huì)重新獲得對(duì)象,這就是BroadcastReceiver的生命周期. 在BroadcastReceiver里不能做一些比較耗時(shí)的操作,否側(cè)會(huì)彈出ANR(Application NoResponse)的對(duì)話框.
如果需要完成一項(xiàng)比較耗時(shí)的工作,應(yīng)該通過發(fā)送Intent給Service,由Service來完成.這里不能使用子線程來解決,因?yàn)锽roadcastReceiver的生命周期很短,子線程可能還沒有結(jié)束,BroadcastReceiver就先結(jié)束了.BroadcastReceiver一旦結(jié)束,此時(shí)BroadcastReceiver的所在進(jìn)程很容易在系統(tǒng)需要內(nèi)存時(shí)被優(yōu)先殺死,因?yàn)樗鼘儆诳者M(jìn)程(沒有任何活動(dòng)組件的進(jìn)程).如果它的宿主進(jìn)程被殺死,那么正在工作的子線程也會(huì)被殺死.所以采用子線程來解決是不可靠的.
2、兩種注冊(cè)BroadcastReceiver的方法?
參考答案:
使用在manifest中注冊(cè)的方法注冊(cè)BroadcastReceiver,即使你的應(yīng)用程序沒有啟動(dòng),或者已經(jīng)被關(guān)閉,這個(gè)BroadcastReceiver依然會(huì)繼續(xù)運(yùn)行,這樣的運(yùn)行機(jī)制可能會(huì)給軟件的用戶造成困擾。所以作為程序的開發(fā)者,我們希望能夠有一種靈活的機(jī)制完成BroadcastReceiver的綁定和解除綁定操作。Android當(dāng)然也考慮到了這些問題,所以在Context這個(gè)類當(dāng)中提供了如下兩個(gè)函數(shù)可以在代碼中注冊(cè):
i. registerReceiver(receiver,filter);
這個(gè)函數(shù)的作用就是將一個(gè)BroadcastReceiver注冊(cè)到應(yīng)用程序當(dāng)中,這個(gè)函數(shù)接收兩個(gè)參數(shù),第一個(gè)參數(shù)是需要注冊(cè)的BroadcastReceiver對(duì)象,第二個(gè)是一個(gè)IntentFilter。第一個(gè)參數(shù)是非常容易理解的,第二個(gè)參數(shù)的作用是定義了哪些Intent才能觸發(fā)這個(gè)注冊(cè)的BroadcastReceiver對(duì)象。
ii. unregisterReceiver(receiver);
這個(gè)方法就非常的簡(jiǎn)單了,用于解除BroadcastReceiver的綁定狀態(tài)。一旦解除完成,響應(yīng)的BroadcastReceiver就不會(huì)再接收系統(tǒng)所廣播的Intent了。
兩種注冊(cè)BroadcastReceiver的方法
1.在應(yīng)用程序的代碼中進(jìn)行注冊(cè)
注冊(cè)BroadcastReceiver
registerReceiver(receiver,filter);
取消注冊(cè)BroadcastReceiver
unregisterReceiver(receiver);
2.在AndroidManifest.xml當(dāng)中進(jìn)行注冊(cè)
兩種注冊(cè)BroadcastReceiver方法的比較:
現(xiàn)在我們了解了兩種注冊(cè)BroadcastReceiver的方法之后,需要考慮一下這兩種方法適用的場(chǎng)合:
i. 第一種注冊(cè)的方法可以保證在應(yīng)用程序安裝之后,BroadcastReceiver始終處于活動(dòng)狀態(tài),通常用于監(jiān)聽系統(tǒng)狀態(tài)的改變,比如說手機(jī)的電量,wifi網(wǎng)卡的狀態(tài)(當(dāng)然,監(jiān)視這些東西也是取決于軟件的需求)。對(duì)于這樣的BroadcastReceiver,通常是在產(chǎn)生某個(gè)特定的系統(tǒng)事件之后,進(jìn)行相應(yīng)的操作,比如說wifi網(wǎng)卡打開時(shí),給用戶一個(gè)提示;
ii. 第二種注冊(cè)方法相對(duì)第一種要靈活的多,這樣注冊(cè)的BroadcastReceiver通常用于更新UI的狀態(tài)。一般來說,都是在一個(gè)Activity啟動(dòng)的時(shí)候使用這樣的方法注冊(cè)BroadcastReceiver,一旦接收到廣播的事件,就可以在onReceive方法當(dāng)中更新當(dāng)前的這個(gè)Activity當(dāng)中的控件。但是需要注意的是如果這個(gè)Activity不可見了,就應(yīng)該調(diào)用unregisterReceiver方法來解除注冊(cè)
3、android 中線程與線程,進(jìn)程與進(jìn)程之間如何通信 參考答案:
01 、一個(gè) Android 程序開始運(yùn)行時(shí),會(huì)單獨(dú)啟動(dòng)一個(gè) Process 。
默認(rèn)情況下,所有這個(gè)程序中的 Activity 或者 Service 都會(huì)跑在這個(gè) Process 。
默認(rèn)情況下,一個(gè) Android 程序也只有一個(gè) Process ,但一個(gè) Process 下卻可以有許多個(gè) Thread。
02 、一個(gè) Android 程序開始運(yùn)行時(shí),就有一個(gè)主線程 Main Thread 被創(chuàng)建。該線程主要負(fù)責(zé) UI 界面的顯示、更新和控件交互,所以又叫 UI Thread 。 一個(gè) Android 程序創(chuàng)建之初,一個(gè) Process 呈現(xiàn)的是單線程模型 — 即 Main Thread ,所有的任務(wù)都在一個(gè)線程中運(yùn)行。所以, Main Thread 所調(diào)用的每一個(gè)函數(shù),其耗時(shí)應(yīng)該越短越好。而對(duì)于比較費(fèi)時(shí)的工作,應(yīng)該設(shè)法交給子線程去做,以避免阻塞主線程(主線程被阻塞,會(huì)導(dǎo)致程序假死 現(xiàn)象)。
03 、 Android 單線程模型: Android UI 操作并不是線程安全的并且這些操作必須在 UI 線程中執(zhí)行。如果在子線程中直接修改 UI ,會(huì)導(dǎo)致異常。
看了“android常見面試題”的人還看過:
1.
2.
3.
4.
5.