Android面試題整理_第1頁(yè)
Android面試題整理_第2頁(yè)
Android面試題整理_第3頁(yè)
Android面試題整理_第4頁(yè)
Android面試題整理_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Android常用面試簡(jiǎn)答題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)畫方法,通過(guò)順序的播放排列好的圖片來(lái)實(shí)現(xiàn),類似電影。2、 請(qǐng)簡(jiǎn)述Handler的機(jī)制原理參考答案:andriod 提供了 Handler 和 Looper 來(lái)滿足線程間的通信。Handler 先進(jìn)先出原則。Looper類用來(lái)管理特定線程內(nèi)對(duì)象之間的消息交換(Message Exchange)。 1)Lo

2、oper: 一個(gè)線程可以產(chǎn)生一個(gè) Looper 對(duì)象,由它來(lái)管理此線程里的 Message Queue(消息隊(duì)列)。 2)Handler: 你可以構(gòu)造 Handler 對(duì)象來(lái)與 Looper 溝通,以便 push 新消息到 Message Queue 里;或者接收 Looper從 Message Queue 取出)所送來(lái)的消息。 3) Message Queue(消息隊(duì)列):用來(lái)存放線程放入的消息。 4)線程:UI thread 通常就是 main thread,而 Android 啟動(dòng)程序時(shí)會(huì)替它建立一個(gè)Message Queue。3、 說(shuō)說(shuō)mvc模式的原理,它在android中的運(yùn)用參考答

3、案: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

4、) 視圖層( 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 中寫代碼,要通過(guò) activity 交割 mode

5、l 業(yè)務(wù)邏輯層處理, 這樣做的另外一個(gè)原因是 android 中的 acitivity 的響應(yīng)時(shí)間是 5s ,如果耗時(shí)的操作放在這里,程序就很容易被回收掉。3) 模型層( model ): 對(duì)數(shù)據(jù)庫(kù)的操作、對(duì)網(wǎng)絡(luò)等的操作都應(yīng)該在 model 里面處理,當(dāng)然對(duì)業(yè)務(wù)計(jì)算等操作也是必須放在的該層的。4、通過(guò)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ù)也很常見(jiàn)的

6、。 5、在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í),說(shuō)白了就是系統(tǒng)在內(nèi)存不足或者其他異常情況下把你的Activity銷毀時(shí),將調(diào)用這個(gè)方法。需要注意的是它是系統(tǒng)調(diào)用的,并且你的Activity是被動(dòng)得

7、被銷毀。你可以在銷毀的時(shí)候保存一下數(shù)據(jù)。然后在onCreate方法中拿出來(lái)。那什么情況下能觸發(fā)這兩個(gè)方法呢?1)、當(dāng)用戶按下HOME鍵時(shí)。這是顯而易見(jiàn)的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會(huì)被銷毀,故系統(tǒng)會(huì)調(diào)用onSaveInstanceState,讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則2)、長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)。3)、按下電源按鍵(關(guān)閉屏幕顯示)時(shí)。4)、從activity A中啟動(dòng)一個(gè)新的activity時(shí)。5)、屏幕方向切換時(shí),例如從豎屏切換到橫屏?xí)r。在屏幕切換之前,系統(tǒng)會(huì)銷毀activity

8、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)用的,onRestoreInstanceS

9、tate被調(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ù)還原。6、請(qǐng)談?wù)凙ctivity的生命周期?參考答案:在系統(tǒng)中的A

10、ctivity被一個(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),但是依然可見(jiàn)(一個(gè)新的非全屏的Activity 或者一個(gè)透明的Activity 被放置在棧頂),叫做暫停狀態(tài)(Paused)。一個(gè)暫停狀態(tài)的Activity依然保持活力(保持所有的狀態(tài),成員信息,和窗口管理器保持

11、連接),但是在系統(tǒng)內(nèi)存極端低下的時(shí)候?qū)⒈粴⒌簟?)如果一個(gè)Activity被另外的Activity完全覆蓋掉,叫做停止?fàn)顟B(tài)(Stopped)。它依然保持所有狀態(tài)和成員信息,但是它不再可見(jiàn),所以它的窗口被隱藏,當(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í),它必須重新開(kāi)始和重置前面的狀態(tài)。Activity提供了7個(gè)生命周期方法:o

12、nCreate(),onStart(),onResume(),onPause(),onStop(),onDestory(),onRestart()。在這七個(gè)生命周期方法中有三個(gè)關(guān)鍵的循環(huán)。其實(shí)官方給的那張圖畫得很明白,但估計(jì)很少人能有耐心去揣摩。那就換種方式展現(xiàn)??磮D吧:1)以下該圖呈現(xiàn)了一個(gè)Activity完整的生命周期,從onCreate(Bundle)開(kāi)始到onDestroy()結(jié)束。Activity在onCreate()設(shè)置所有的“全局”狀態(tài),在 onDestory()釋放所有的資源。首先我們運(yùn)行程序,這是打開(kāi)MainActivity依次調(diào)用onCreate->onStart-&

13、gt;onResume,這時(shí)MainActivity在棧頂,與我們交互的Activity都在棧頂。然后我按下返回鍵,則會(huì)依次調(diào)用onPause->onStop->onDestory。這屬于一個(gè)完整的生命周期。7、談?wù)勀銓?duì)BroadCastRceiver的理解?參考答案:廣播接收者,android四大組件之一,也是唯一一個(gè)能動(dòng)態(tài)注冊(cè)的組件。1)廣播接收者是一個(gè)專注于接收廣播通知信息,并做出對(duì)應(yīng)處理的組件。很多廣播是源自于系統(tǒng)比如,通知時(shí)區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語(yǔ)言選項(xiàng)。應(yīng)用程序也可以進(jìn)行廣播比如說(shuō),通知其它應(yīng)用程序一些數(shù)據(jù)下載完成并處于可用狀態(tài)。2)應(yīng)用程序可

14、以擁有任意數(shù)量的廣播接收者以對(duì)所有它感興趣的通知信息予以響應(yīng)。所有的接收器均繼承自BroadcastReceiver基類。3)廣播接收者沒(méi)有用戶界面。然而,它們可以啟動(dòng)一個(gè)activity來(lái)響應(yīng)它們收到的信息,或者用NotificationManager來(lái)通知用戶。通知可以用很多種方式來(lái)吸引用戶的注意力閃動(dòng)背燈、震動(dòng)、播放聲音等等。一般來(lái)說(shuō)是在狀態(tài)欄上放一個(gè)持久的圖標(biāo),用戶可以打開(kāi)它并獲取消息。8、 廣播分幾種?他們有什么區(qū)別?參考答案:廣播被分為兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以

15、在同一時(shí)刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點(diǎn)是:接收者不能將處理結(jié)果傳遞給下一個(gè)接收者,并且無(wú)法終止廣播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的傳播一旦終止

16、,后面的接收者就無(wú)法接收到廣播。另外,有序廣播的接收者可以將數(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(),如果廣播被前面的接收者終止,后面的接收者就再也無(wú)法獲取到廣播。對(duì)于有序廣播,前面的接收者

17、可以將數(shù)據(jù)通過(guò)setResultExtras(Bundle)方法存放進(jìn)結(jié)果對(duì)象,然后傳給下一個(gè)接收者,下一個(gè)接收者通過(guò)代碼:Bundle bundle = getResultExtras(true)可以獲取上一個(gè)接收者存入在結(jié)果對(duì)象中的數(shù)據(jù)。9、 廣播的生命周期?參考答案:廣播的生命周期是非常短的,當(dāng)發(fā)送之后intent會(huì)到AndroidManifest.xml文件中找是不是有匹配的action,如果有就會(huì)調(diào)用Receiver ,然后獲得Receiver 對(duì)象,再執(zhí)行onReceive方法,這時(shí)候Receiver對(duì)象就沒(méi)有用了,當(dāng)我們?cè)俅吸c(diǎn)擊按鈕的時(shí)候就會(huì)重新獲得對(duì)象,這就是Broadcast

18、Receiver的生命周期.在BroadcastReceiver里不能做一些比較耗時(shí)的操作,否側(cè)會(huì)彈出ANR(Application No Response)的對(duì)話框.如果需要完成一項(xiàng)比較耗時(shí)的工作,應(yīng)該通過(guò)發(fā)送Intent給Service,由Service來(lái)完成.這里不能使用子線程來(lái)解決,因?yàn)锽roadcastReceiver的生命周期很短,子線程可能還沒(méi)有結(jié)束,BroadcastReceiver就先結(jié)束了.BroadcastReceiver一旦結(jié)束,此時(shí)BroadcastReceiver的所在進(jìn)程很容易在系統(tǒng)需要內(nèi)存時(shí)被優(yōu)先殺死,因?yàn)樗鼘儆诳者M(jìn)程(沒(méi)有任何活動(dòng)組件的進(jìn)程).如果它的宿主進(jìn)程

19、被殺死,那么正在工作的子線程也會(huì)被殺死.所以采用子線程來(lái)解決是不可靠的.9、 兩種注冊(cè)BroadcastReceiver的方法?參考答案:使用在manifest中注冊(cè)的方法注冊(cè)BroadcastReceiver,即使你的應(yīng)用程序沒(méi)有啟動(dòng),或者已經(jīng)被關(guān)閉,這個(gè)BroadcastReceiver依然會(huì)繼續(xù)運(yùn)行,這樣的運(yùn)行機(jī)制可能會(huì)給軟件的用戶造成困擾。所以作為程序的開(kāi)發(fā)者,我們希望能夠有一種靈活的機(jī)制完成BroadcastReceiver的綁定和解除綁定操作。Android當(dāng)然也考慮到了這些問(wèn)題,所以在Context這個(gè)類當(dāng)中提供了如下兩個(gè)函數(shù)可以在代碼中注冊(cè):i. registerReceive

20、r(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了

21、。兩種注冊(cè)BroadcastReceiver的方法1.在應(yīng)用程序的代碼中進(jìn)行注冊(cè)注冊(cè)BroadcastReceiverregisterReceiver(receiver,filter);取消注冊(cè)BroadcastReceiverunregisterReceiver(receiver);2.在AndroidManifest.xml當(dāng)中進(jìn)行注冊(cè)<receiver android:name="SMSReceiver"><intent-filter><action android:name="vider.Telephon

22、y.SMS_RECEIVED" /></intent-filter></receiver>兩種注冊(cè)BroadcastReceiver方法的比較:現(xiàn)在我們了解了兩種注冊(cè)BroadcastReceiver的方法之后,需要考慮一下這兩種方法適用的場(chǎng)合:i. 第一種注冊(cè)的方法可以保證在應(yīng)用程序安裝之后,BroadcastReceiver始終處于活動(dòng)狀態(tài),通常用于監(jiān)聽(tīng)系統(tǒng)狀態(tài)的改變,比如說(shuō)手機(jī)的電量,wifi網(wǎng)卡的狀態(tài)(當(dāng)然,監(jiān)視這些東西也是取決于軟件的需求)。對(duì)于這樣的BroadcastReceiver,通常是在產(chǎn)生某個(gè)特定的系統(tǒng)事件之后,進(jìn)行相應(yīng)的操作,比如說(shuō)

23、wifi網(wǎng)卡打開(kāi)時(shí),給用戶一個(gè)提示;ii. 第二種注冊(cè)方法相對(duì)第一種要靈活的多,這樣注冊(cè)的BroadcastReceiver通常用于更新UI的狀態(tài)。一般來(lái)說(shuō),都是在一個(gè)Activity啟動(dòng)的時(shí)候使用這樣的方法注冊(cè)BroadcastReceiver,一旦接收到廣播的事件,就可以在onReceive方法當(dāng)中更新當(dāng)前的這個(gè)Activity當(dāng)中的控件。但是需要注意的是如果這個(gè)Activity不可見(jiàn)了,就應(yīng)該調(diào)用unregisterReceiver方法來(lái)解除注冊(cè)10、android 中線程與線程,進(jìn)程與進(jìn)程之間如何通信參考答案:1 、一個(gè) Android 程序開(kāi)始運(yùn)行時(shí),會(huì)單獨(dú)啟動(dòng)一個(gè) Process

24、。默認(rèn)情況下,所有這個(gè)程序中的 Activity 或者 Service 都會(huì)跑在這個(gè) Process 。默認(rèn)情況下,一個(gè) Android 程序也只有一個(gè) Process ,但一個(gè) Process 下卻可以有許多個(gè) Thread。2 、一個(gè) Android 程序開(kāi)始運(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)

25、該越短越好。而對(duì)于比較費(fèi)時(shí)的工作,應(yīng)該設(shè)法交給子線程去做,以避免阻塞主線程(主線程被阻塞,會(huì)導(dǎo)致程序假死 現(xiàn)象)。3 、 Android 單線程模型: Android UI 操作并不是線程安全的并且這些操作必須在 UI 線程中執(zhí)行。如果在子線程中直接修改 UI ,會(huì)導(dǎo)致異常。11、View如何進(jìn)行刷新?參考答案:在一個(gè)開(kāi)啟的線程中調(diào)用handler對(duì)象的sendMessage方法發(fā)送信息,在UI線程中調(diào)用handler對(duì)象的回調(diào)方法handleMessage進(jìn)行處理,在回調(diào)方法中執(zhí)行invalidate或者postInvalidate.12、ANR是什么?哪些情況下會(huì)發(fā)生?開(kāi)發(fā)時(shí)如何避免ANR

26、?參考答案:ANR(Application Not Responding):應(yīng)用程序無(wú)應(yīng)答。默認(rèn)情況下,在android中Activity的最長(zhǎng)阻塞時(shí)間是5秒,BroadcastReceiver的最長(zhǎng)執(zhí)行時(shí)間則是10秒。為了避免出現(xiàn)ANR,可以在做比較耗時(shí)操作時(shí),盡量使用子線程或Service。13、請(qǐng)描述SAX、DOM、PULL解析xml的原理,以及各自優(yōu)缺點(diǎn)。參考答案:這里首先明白什么是SAX是一個(gè)用于處理XML事件驅(qū)動(dòng)的“推”模型,優(yōu)點(diǎn)是一種解析速度快并且占用內(nèi)存少的xml解析器,它需要哪些數(shù)據(jù)再加載和解析哪些內(nèi)容。缺點(diǎn)是它不會(huì)記錄標(biāo)簽的關(guān)系,而要讓你的應(yīng)用程序自己處理,這樣就增加了你程

27、序的負(fù)擔(dān)。DOM是一種文檔對(duì)象模型,DOM可以以一種獨(dú)立于平臺(tái)和語(yǔ)言的方式訪問(wèn)和修改一個(gè)文檔的內(nèi)容和結(jié)構(gòu)。Dom技術(shù)使得用戶頁(yè)面可以動(dòng)態(tài)地變化,如 可以動(dòng)態(tài)地顯示或隱藏一個(gè)元素,改變它們的屬性,增加一個(gè)元素等,Dom技術(shù)使得頁(yè)面的交互性大大地增強(qiáng)。缺點(diǎn)是DOM解析XML文件時(shí),會(huì)將XML文件 的所有內(nèi)容以文檔樹(shù)方式存放在內(nèi)存中。Pull解析和Sax解析很相似,Pull解析和Sax解析不一樣的地方是pull讀取xml文件后觸發(fā)相應(yīng)的事件調(diào)用方法返回的是數(shù)字還有pull可以在程序中控制想解析到哪里就可以停止解析14、請(qǐng)解釋什么是AIDL?參考答案:AIDL:Android Interface De

28、finition Language,即Android接口描述語(yǔ)言。 Android系統(tǒng)中的進(jìn)程之間不能共享內(nèi)存,因此,需要提供一些機(jī)制在不同進(jìn)程之間進(jìn)行數(shù)據(jù)通信。 為了使其他的應(yīng)用程序也可以訪問(wèn)本應(yīng)用程序提供的服務(wù),Android系統(tǒng)采用了遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC)方式來(lái)實(shí)現(xiàn)。與很多其他的基于RPC的解決方案一樣,Android使用一種接口定義語(yǔ)言(Interface Definition Language,IDL)來(lái)公開(kāi)服務(wù)的接口。我們知道4個(gè)Android應(yīng)用程序組件中的3個(gè)(Activity、Broadcast和Content Provider)都

29、可以進(jìn)行跨進(jìn)程訪問(wèn),另外一個(gè)Android應(yīng)用程序組件Service同樣可以。因此,可以將這種可以跨進(jìn)程訪問(wèn)的服務(wù)稱為AIDL(Android Interface Definition Language)服務(wù)。15、DIP、DPI分別是什么?參考答案:dip(device independent pixels)設(shè)備獨(dú)立像素, 與設(shè)備屏幕有關(guān)。dpi:屏幕像素密度。android最早是沒(méi)有考慮到這么多屏幕分辨率的。最早的機(jī)器是g1,他的分辨率是480*320。但是,由于android是開(kāi)放的平臺(tái),各種各樣分辨率的設(shè)備都可以運(yùn)行。為了兼容這些平臺(tái),android從1.6開(kāi)始,加入了設(shè)備獨(dú)立像素,d

30、ip或者dp。標(biāo)準(zhǔn)屏幕480*320上,px與dip是1比1的。分辨率高的,比如800*480,就要按比例兌換成480*320。開(kāi)發(fā)者在開(kāi)發(fā)的時(shí)候,ui設(shè)計(jì)時(shí)最好用dp,系統(tǒng)會(huì)自動(dòng)按比例計(jì)算為px,從而適配視圖。dpi是屏幕像素密度。就是1英寸上像素點(diǎn)的個(gè)數(shù)。對(duì)于屏幕來(lái)說(shuō),dpi越大,屏幕的精細(xì)度越高,屏幕看起來(lái)就越清楚。比如iphone4的視網(wǎng)膜級(jí)的屏幕肯定比iphone 3gs的屏幕像素密度高的多。 對(duì)于開(kāi)發(fā)者來(lái)說(shuō),這個(gè)不是很重要。16、請(qǐng)介紹下Android中常用的五種布局。參考答案:答:在Android中,共有五種布局方式,分別是:FrameLayout(框架布局),LinearLay

31、out (線性布局),AbsoluteLayout(絕對(duì)布局),RelativeLayout(相對(duì)布局),TableLayout(表格布局)。(1)FrameLayout 框架布局,放入其中的所有元素都被放置在最左上的區(qū)域,而且無(wú)法為這些元素指定一個(gè)確切的位置,下一個(gè)子元素會(huì)重疊覆蓋上一個(gè)子元素,適合瀏覽單張圖片。(2)LinearLayout 線性布局,是應(yīng)用程序中最常用的布局方式,主要提供控件水平或者垂直排列的模型,每個(gè)子組件都是以垂直或水平的方式來(lái)定位(默認(rèn)是垂直)。 (3)AbsoluteLayout 絕對(duì)定位布局,采用坐標(biāo)軸的方式定位組件,左上角是(0,0)點(diǎn),往右x軸遞增,往下Y軸

32、遞增,組件定位屬性為android:layout_x 和 android:layout_y來(lái)確定坐標(biāo)。 (4)RelativeLayout 相對(duì)布局,根據(jù)另外一個(gè)組件或是頂層父組件來(lái)確定下一個(gè)組件的位置。和CSS里面的類似。 (5)TableLayout 表格布局,類似Html里的Table.使用TableRow來(lái)布局,其中TableRow代表一行,TableRow的每一個(gè)視圖組件代表一個(gè)單元格。 T# N4 B9 I) 17、請(qǐng)介紹下Android的數(shù)據(jù)存儲(chǔ)方式。參考答案:答:Android提供了5種方式存儲(chǔ)數(shù)據(jù):(1)使用SharedPreferences存儲(chǔ)數(shù)據(jù);它是Android提供的

33、用來(lái)存儲(chǔ)一些簡(jiǎn)單配置信息的一種機(jī)制,采用了XML格式將數(shù)據(jù)存儲(chǔ)到設(shè)備中。只能在同一個(gè)包內(nèi)使用,不能在不同的包之間使用。(2)文件存儲(chǔ)數(shù)據(jù);文件存儲(chǔ)方式是一種較常用的方法,在Android中讀取/寫入文件的方法,與Java中實(shí)現(xiàn)I/O的程序是完全一樣的,提供了openFileInput()和openFileOutput()方法來(lái)讀取設(shè)備上的文件。 (3)SQLite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù);SQLite是Android所帶的一個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù),它支持SQL語(yǔ)句,它是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)。(4)使用ContentProvider存儲(chǔ)數(shù)據(jù);主要用于應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換,從而能夠讓其他的應(yīng)用保存

34、或讀取此Content Provider的各種數(shù)據(jù)類型。(5)網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù);通過(guò)網(wǎng)絡(luò)上提供給我們的存儲(chǔ)空間來(lái)上傳(存儲(chǔ))和下載(獲取)我們存儲(chǔ)在網(wǎng)絡(luò)空間中的數(shù)據(jù)信息。! G# Q) 5 t5 d% U" Q18、請(qǐng)說(shuō)明隱式、顯式Intent的區(qū)別?參考答案:顯式Intent直接用組件的名稱定義目標(biāo)組件,這種方式很直接。但是由于開(kāi)發(fā)人員往往并不清楚別的應(yīng)用程序的組件名稱,因此,顯式Intent更多用于在應(yīng)用程序內(nèi)部傳遞消息。比如在某應(yīng)用程序內(nèi),一個(gè)Activity啟動(dòng)一個(gè)Service。隱式Intent恰恰相反,它不會(huì)用組件名稱定義需要激活的目標(biāo)組件,它更廣泛地用于在不同應(yīng)用程序之間傳

35、遞消息。在顯式Intent消息中,決定目標(biāo)組件的唯一要素就是組件名稱,因此,如果你的Intent中已經(jīng)明確定義了目標(biāo)組件的名稱,那么你就完全不用再定義其他Intent內(nèi)容。而對(duì)于隱式Intent則不同,由于沒(méi)有明確的目標(biāo)組件名稱,所以必須由Android系統(tǒng)幫助應(yīng)用程序?qū)ふ遗cIntent請(qǐng)求意圖最匹配的組件。19、請(qǐng)說(shuō)明getWritableDatabase()和getReadableDatabase()的區(qū)別?參考答案:getReadableDatabase()并不是以只讀方式打開(kāi)數(shù)據(jù)庫(kù),而是先執(zhí)getWritableDatabase(),失敗的情況下才調(diào)用。getWritableDatab

36、ase()和getReadableDatabase()方法都可以獲取一個(gè)用于操作數(shù)據(jù)庫(kù)的SQLiteDatabase實(shí)例。但getWritableDatabase() 方法以讀寫方式打開(kāi)數(shù)據(jù)庫(kù),一旦數(shù)據(jù)庫(kù)的磁盤空間滿了,數(shù)據(jù)庫(kù)就只能讀而不能寫,倘若使用getWritableDatabase()打開(kāi)數(shù)據(jù)庫(kù)就會(huì)出錯(cuò)。getReadableDatabase()方法先以讀寫方式打開(kāi)數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)的磁盤空間滿了,就會(huì)打開(kāi)失敗,當(dāng)打開(kāi)失敗后會(huì)繼續(xù)嘗試以只讀方式打開(kāi)數(shù)據(jù)庫(kù)。20、 請(qǐng)描述下Activity的生命周期。參考答案:activity的生命周期方法有:onCreate()、onStart()、o

37、nReStart()、onResume()、onPause()、onStop()、onDestory()。activity主要生命周期的方法說(shuō)明:onCreate(Bundle savedInstanceState):創(chuàng)建activity時(shí)調(diào)用。設(shè)置在該方法中,還以Bundle的形式提供對(duì)以前儲(chǔ)存的任何狀態(tài)的訪問(wèn)!onStart():activity變?yōu)樵谄聊簧蠈?duì)用戶可見(jiàn)時(shí)調(diào)用。onResume():activity開(kāi)始與用戶交互時(shí)調(diào)用(無(wú)論是啟動(dòng)還是重新啟動(dòng)一個(gè)活動(dòng),該方法總是被調(diào)用的)。onPause():activity被暫?;蚴栈豤pu和其他資源時(shí)調(diào)用,該方法用于保存活動(dòng)狀態(tài)的,也是保

38、護(hù)現(xiàn)場(chǎng),壓棧吧!onStop():activity被停止并轉(zhuǎn)為不可見(jiàn)階段及后續(xù)的生命周期事件時(shí)調(diào)用。onRestart():重新啟動(dòng)activity時(shí)調(diào)用。該活動(dòng)仍在棧中,而不是啟動(dòng)新的活動(dòng)。onDestroy():activity被完全從系統(tǒng)內(nèi)存中移除時(shí)調(diào)用,該方法被調(diào)用21、如何將一個(gè)Activity設(shè)置成窗口的樣式。參考答案:只需要設(shè)置 一下Activity的主題就可以了,在AndroidManifest.xml 中定義 Activity的地方加上android :theme="android:style/Theme.Dialog"這就使你的應(yīng)用程序變成對(duì)話框的形式彈

39、出來(lái)了?;蛘遖ndroid:theme="android:style/Theme.Translucent"。就變成半透明的。22、Android中Activity, Intent, Content Provider, Service各有什么區(qū)別?參考答案:答:Activity:活動(dòng),是最基本的android應(yīng)用程序組件。一個(gè)活動(dòng)就是一個(gè)單獨(dú)的屏幕,每一個(gè)活動(dòng)都被實(shí)現(xiàn)為一個(gè)獨(dú)立的類,并且從活動(dòng)基類繼承而來(lái)。Intent:意圖,描述應(yīng)用想干什么。最重要的部分是動(dòng)作和動(dòng)作對(duì)應(yīng)的數(shù)據(jù)。Content Provider:內(nèi)容提供器,android應(yīng)用程序能夠?qū)⑺鼈兊臄?shù)據(jù)保存到文件、S

40、QLite數(shù)據(jù)庫(kù)中,甚至是任何有效的設(shè)備中。當(dāng)你想將你的應(yīng)用數(shù)據(jù)和其他應(yīng)用共享時(shí),內(nèi)容提供器就可以發(fā)揮作用了。Service:服務(wù),具有一段較長(zhǎng)生命周期且沒(méi)有用戶界面的程序。23、你如何評(píng)價(jià)Android系統(tǒng)優(yōu)缺點(diǎn)?參考答案:優(yōu)勢(shì):一、開(kāi)放性 三、豐富的硬件選擇 五、無(wú)縫結(jié)合的Google應(yīng)用支持缺點(diǎn): 一、安全和隱私二,開(kāi)發(fā)商自定義,不夠統(tǒng)一 四、同類機(jī)型用戶減少24、返回鍵與Home鍵區(qū)別?參考答案:返回鍵默認(rèn)行為是finish處于前臺(tái)的Activity的即Activity的狀態(tài)為Destroy狀態(tài)為止,再次啟動(dòng)該Activity是從onCreate開(kāi)始的(不會(huì)調(diào)用onSaveInstan

41、ceState方法)。Home鍵默認(rèn)是stop前臺(tái)的Activity即狀態(tài)為onStop為止而不是Destroy,若再次啟動(dòng)它,會(huì)調(diào)用onSaveInstanceState方法,保持上次Activity的狀態(tài)則是從OnRestart開(kāi)始的->onStart()->onResume()。25、如果后臺(tái)的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?參考答案:在”暫停 onPause” 狀態(tài)將數(shù)據(jù)保存。26、請(qǐng)介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的?參考答案:一個(gè)程序可以通過(guò)實(shí)現(xiàn)一個(gè)Content provider的抽象接口將自己的數(shù)據(jù)完全

42、暴露出去,而且Content providers是以類似數(shù)據(jù)庫(kù)中表的方式將數(shù)據(jù)暴露。Content providers存儲(chǔ)和檢索數(shù)據(jù),通過(guò)它可以讓所有的應(yīng)用程序訪問(wèn)到,這也是應(yīng)用程序之間唯一共享數(shù)據(jù)的方法。要想使應(yīng)用程序的數(shù)據(jù)公開(kāi)化,可通過(guò)2種方法:創(chuàng)建一個(gè)屬于你自己的Content provider或者將你的數(shù)據(jù)添加到一個(gè)已經(jīng)存在的Content provider中,前提是有相同數(shù)據(jù)類型并且有寫入Content provider的權(quán)限。如何通過(guò)一套標(biāo)準(zhǔn)及統(tǒng)一的接口獲取其他應(yīng)用程序暴露的數(shù)據(jù)?Android提供了ContentResolver,外界的程序可以通過(guò)ContentResolver接

43、口訪問(wèn)ContentProvider提供的數(shù)據(jù)。27、什么情況會(huì)導(dǎo)致Force Close ?如何避免?能否捕獲導(dǎo)致其的異常?參考答案:程序出現(xiàn)異常,比如NullPointerException。避免:編寫程序時(shí)邏輯連貫,思維縝密。能捕獲異常,在logcat中能看到異常信息,定位錯(cuò)誤并修改錯(cuò)誤28、請(qǐng)簡(jiǎn)述Android應(yīng)用程序結(jié)構(gòu)是哪些?參考答案:Android應(yīng)用程序結(jié)構(gòu)是:Linux Kernel(Linux內(nèi)核)、Libraries(系統(tǒng)運(yùn)行庫(kù)或者是c/c+核心庫(kù))、Application Framework(開(kāi)發(fā)框架包)、Applications(核心應(yīng)用程序)29、橫豎屏切換時(shí)候activity的生命周期?參考答案:1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次 2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次 3、設(shè)置Activity的android:configChanges="ori

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論