2016年最新android面試題
1.如何避免ANR?
答:ANR:Application Not Responding,五秒在Android中,活動(dòng)管理器和窗口管理器這兩個(gè)系統(tǒng)服務(wù)負(fù)責(zé)監(jiān)視應(yīng)用程序的響應(yīng)。當(dāng)出現(xiàn)下列情況時(shí),Android就會(huì)顯示ANR對(duì)話框了: 對(duì)輸入事件(如按鍵、觸摸屏事件)的響應(yīng)超過(guò)5秒 意向接受器(intentReceiver)超過(guò)10秒鐘仍未執(zhí)行完畢
Android應(yīng)用程序完全運(yùn)行在一個(gè)獨(dú)立的線程中(例如main)。這就意味著,任何在主線程中運(yùn)行的,需要消耗大量時(shí)間的操作都會(huì)引發(fā)ANR。因?yàn)榇藭r(shí),你的應(yīng)用程序已經(jīng)沒(méi)有機(jī)會(huì)去響應(yīng)輸入事件和意向廣播(Intent broadcast)。 因此,任何運(yùn)行在主線程中的方法,都要盡可能的只做少量的工作。特別是活動(dòng)生命周期中的重要方法如onCreate()和 onResume()等更應(yīng)如此。潛在的比較耗時(shí)的操作,如訪問(wèn)網(wǎng)絡(luò)和數(shù)據(jù)庫(kù);或者是開(kāi)銷很大的計(jì)算,比如改變位圖的大小,需要在一個(gè)單獨(dú)的子線程中完成(或者是使用異步請(qǐng)求,如數(shù)據(jù)庫(kù)操作)。但這并不意味著你的主線程需要進(jìn)入阻塞狀態(tài)已等待子線程結(jié)束 -- 也不需要調(diào)用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程為子線程提供一個(gè)句柄(Handler),讓子線程在即將結(jié)束的時(shí)候調(diào)用它(xing:可以參看Snake的例子,這種方法與以前我們所接觸的有所不同)。使用這種方法涉及你的應(yīng)用程序,能夠保證你的程序?qū)斎氡3至己玫捻憫?yīng),從而避免因?yàn)檩斎胧录^(guò)5秒鐘不被處理而產(chǎn)生的ANR。這種實(shí)踐需要應(yīng)用到所有顯示用戶界面的線程,因?yàn)樗麄兌济媾R著同樣的超時(shí)問(wèn)題。
2. handler機(jī)制的原理
答 :andriod提供了 Handler 和 Looper 來(lái)滿足線程間的通信。Handler 先進(jìn)先出原則。Looper類用來(lái)管理特定線程內(nèi)對(duì)象之間的消息交換(Message Exchange)! 1)Looper: 一個(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. Android引入廣播機(jī)制的用意?
答:a:從MVC的角度考慮(應(yīng)用程序內(nèi)) 其實(shí)回答這個(gè)問(wèn)題的時(shí)候還可以這樣問(wèn),android為什么要有那4大組件,現(xiàn)在的移動(dòng)開(kāi)發(fā)模型基本上也是照搬的web那一套MVC架構(gòu),只不過(guò)是改了點(diǎn)嫁妝而已。android的四大組件本質(zhì)上就是為了實(shí)現(xiàn)移動(dòng)或者說(shuō)嵌入式設(shè)備上的MVC架構(gòu),它們之間有時(shí)候是一種相互依存的關(guān)系,有時(shí)候又是一種補(bǔ)充關(guān)系,引入廣播機(jī)制可以方便幾大組件的信息和數(shù)據(jù)交互。 b:程序間互通消息(例如在自己的應(yīng)用程序內(nèi)監(jiān)聽(tīng)系統(tǒng)來(lái)電) c:效率上(參考UDP的廣播協(xié)議在局域網(wǎng)的方便性) d:設(shè)計(jì)模式上(反轉(zhuǎn)控制的一種應(yīng)用,類似監(jiān)聽(tīng)者模式)
4.什么情況會(huì)導(dǎo)致Force Close ?如何避免?能否捕獲導(dǎo)致其的異常?
答:一般像空指針啊,可以看起logcat,然后對(duì)應(yīng)到程序中 來(lái)解決錯(cuò)誤。
5.如何將一個(gè)Activity設(shè)置成窗口的樣式。
講點(diǎn)輕松的吧,可能有人希望做出來(lái)的應(yīng)用程序是一個(gè)漂浮在手機(jī)主界面的東西,那么很 簡(jiǎn)單你只需要設(shè)置 一下Activity的主題就可以了在AndroidManifest.xml 中定義 Activity的 地方一句話: Xml代碼 1. android :theme="@android:style/Theme.Dialog" 3. android:theme="@android:style/Theme.Dialog" android :theme="@android:style/Theme.Dialog" android:theme="@android:style/Theme.Dialog" 這就使你的應(yīng)用程序變成對(duì)話框的形式彈出來(lái)了,或者 Xml代碼 1. android:theme="@android:style/Theme.Translucent" 3. android:theme="@android:style/Theme.Translucent" 就變成半透明的,[友情提示-.-]類似的這種activity的屬性可以在android.R.styleable 類的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的屬性的介紹都可以參考這個(gè)類android.R.styleable 上面說(shuō)的.是屬性名稱,具體有什么值是在android.R.style中 可以看到,比如這個(gè)"@android:style/Theme.Dialog" 就對(duì)應(yīng)于android.R.style.Theme_Dialog ,('_'換成'.' < --注意:這個(gè)是文章內(nèi)容不是笑臉)就可以用在描述文件 中了,找找類定義和描述文件中的對(duì)應(yīng)關(guān)系就都明白了。
(簡(jiǎn)單來(lái)說(shuō)直接在配置文件引入風(fēng)格。追求效果的應(yīng)用此用法用到挺多);
6、IntentService有何優(yōu)點(diǎn)?
Acitivity的進(jìn)程,當(dāng)處理Intent的時(shí)候,會(huì)產(chǎn)生一個(gè)對(duì)應(yīng)的Service Android的進(jìn)程處理器現(xiàn)在會(huì)盡可能的不kill掉你 非常容易使用
(這回答其實(shí)比較。。。其實(shí)我也不知道干嘛使,因?yàn)榭磶椭臋n就說(shuō)了一個(gè)用來(lái)處理異步請(qǐng)求的service,工作完了自己停止。沒(méi)用過(guò),不做評(píng)價(jià))。
7、 廣播的生命周期?
廣播的生命周期非常端,當(dāng)發(fā)送之后intent會(huì)到AndroidManifest.xml方法中找是不是匹配的action,如果有就調(diào)用Receiver,然后獲得Receiver對(duì)象,再執(zhí)行onReceiver方法,這時(shí)候Receiver對(duì)象就沒(méi)有用了,當(dāng)我們?cè)俅吸c(diǎn)擊按鈕的時(shí)候就會(huì)重新獲得對(duì)象,這就是BroadcastReceiver的生命周期。
在BroadcastReceiver里不能做一些比較耗時(shí)的操作,否則會(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的所在線程很容易在系統(tǒng)需要內(nèi)存時(shí)被優(yōu)先殺死,因?yàn)樗鼘儆诳者M(jìn)程(沒(méi)有任何活動(dòng)組件的進(jìn)程)。如果它的宿主進(jìn)程被殺死,那么正在工作的子線程也會(huì)被殺死,所以采用子線程來(lái)解決是不可靠的。
8、啟動(dòng)service的兩種方法?有什么區(qū)別?
一種是startService(),另一種是bindService()。這兩者的區(qū)別是第一種方式調(diào)用者開(kāi)啟了服務(wù),即會(huì)與服務(wù)失去聯(lián)系,兩者沒(méi)有關(guān)聯(lián)。即使訪問(wèn)者退出了,服務(wù)仍在運(yùn)行。如需解除服務(wù)必須顯式的調(diào)用stopService方法。主要用于調(diào)用者與服務(wù)沒(méi)有交互的情況下,也就是調(diào)用者不需要獲取服務(wù)里的業(yè)務(wù)方法。比如電話錄音。而后者調(diào)用者與服務(wù)綁定在一起的。當(dāng)調(diào)用者退出的時(shí)候,服務(wù)也隨之退出。用于需要與服務(wù)交互。
【2016年最新android面試題】相關(guān)文章:
最新android面試題及答案11-07
android面試題及答案精選11-12
最新特崗教師面試題及答案參考05-28
最新事業(yè)單位面試題及答案05-12
最新招聘社區(qū)工作者面試題及答案02-26
德?tīng)柛C嬖囶}01-11
移動(dòng)面試題04-01