android最全面试题71道题 详解
Android面試題
1.?下列哪些語(yǔ)句關(guān)于內(nèi)存回收的說明是正確的??(b?)
?A、?程序員必須創(chuàng)建一個(gè)線程來釋放內(nèi)存
??B、?內(nèi)存回收程序負(fù)責(zé)釋放無用內(nèi)存?
??C、?內(nèi)存回收程序允許程序員直接釋放內(nèi)存?
??D、?內(nèi)存回收程序可以在指定的時(shí)間釋放內(nèi)存對(duì)象?
android內(nèi)存回收機(jī)制
我想每個(gè)人第一次用Android的時(shí)候,不可避免的會(huì)去裝?個(gè)任務(wù)管理器,然后對(duì)里面時(shí)刻都停留著一大堆的程序表?示觸目驚心,然后會(huì)在桌面上建立一個(gè)快捷清空內(nèi)存的按?鈕,時(shí)不時(shí)啪的按一下,看著內(nèi)存剩余數(shù)量從30多變成100?多然后很有快感...?其實(shí)吧,Android是Linux的內(nèi)核,每一個(gè)程序都是一個(gè)獨(dú)立?的JAVA虛擬機(jī),就和油湯里的油花一樣互不干擾,這樣充分?保證了萬一某個(gè)程序的JAVA虛擬機(jī)崩潰,系統(tǒng)依舊穩(wěn)定正?常運(yùn)行.?而Android和傳統(tǒng)Linux不一樣的地方又在于,傳統(tǒng)Linux在?進(jìn)程活動(dòng)停止后就結(jié)束了,這就類似于我們用S60和WM一?樣,關(guān)閉程序,內(nèi)存釋放.而Android會(huì)把這些進(jìn)程保留在內(nèi)?存里,干嘛呢?為了保證你再次激活這些進(jìn)程時(shí)候啟動(dòng)的更?快,比如說我們掛在桌面的Widgets,?具體一點(diǎn)我們拿新浪微博舉例吧.我剛看完,退出,突然我想?我發(fā)一條微博吧,?那么這個(gè)時(shí)候我可以直接在桌面Widgets上操作----設(shè)想一?下如果我退出的時(shí)候這個(gè)進(jìn)程就終止了,那么我在桌面上?點(diǎn)擊Widgets的時(shí)候會(huì)不會(huì)卡頓一下甚至沒有響應(yīng)??----這就跟我們把Widgets掛在桌面的行為完全背離了,放?在桌面上就是為了能隨時(shí)觀察到程序運(yùn)行的情況,?以及隨時(shí)可以快速調(diào)用程序.所以Android并沒有在進(jìn)程活?動(dòng)停止就釋放對(duì)應(yīng)的內(nèi)存.那么也許你還是會(huì)有疑問,那么?內(nèi)存夠不夠用呢??
512的內(nèi)存被我用的只剩56M是不是很恐怖?其實(shí)系統(tǒng)一?點(diǎn)也不卡的,蛋定蛋定?是的,我理解,因?yàn)榇蠹疫@么多年Windows都用習(xí)慣?了,Windows內(nèi)存不足的時(shí)候機(jī)器卡的會(huì)讓你想砸掉機(jī)箱,?而且調(diào)用虛擬內(nèi)存的時(shí)候硬盤喀喀喀想的讓你肉疼.?你肯定也會(huì)怕你的手機(jī)明明512M內(nèi)存結(jié)果就剩下30來M?把你卡到崩潰.事實(shí)上呢,Android會(huì)在系統(tǒng)需要更多內(nèi)存?的時(shí)候,去釋放掉那些占用內(nèi)存的進(jìn)程----這個(gè)活動(dòng)是智能的.最早大家認(rèn)為是有個(gè)排序,比如最近使?用過哪些程序(LRU機(jī)制,Last?Recently?Used),然?后結(jié)束最早的進(jìn)程.不過并非如此,否則就變成我們上小學(xué)?時(shí)候那樣,個(gè)子高的塊頭大的男生跟班長(zhǎng)下去拔草扛新書,?女生們留在班里繡花吧...?這樣很明顯不公平而且沒準(zhǔn)會(huì)結(jié)束掉那些我們并不想結(jié)束?掉的進(jìn)程----譬如說這會(huì)兒我想切回到剛才后臺(tái)的網(wǎng)頁(yè)繼?續(xù)瀏覽結(jié)果悲愴的發(fā)現(xiàn)它被系統(tǒng)給我強(qiáng)制關(guān)閉了...
Android把進(jìn)程分成了一些優(yōu)先級(jí),比如?前臺(tái)進(jìn)程(Foreground),比如我們正在看書,那么看書?的程序就是前臺(tái)進(jìn)程,這些進(jìn)程是不會(huì)被系統(tǒng)優(yōu)先結(jié)束的.?當(dāng)我把它切到后臺(tái)的時(shí)候,它就變成后臺(tái)進(jìn)程了.?還有可見進(jìn)程(Visible),這個(gè)怎么說呢,譬如輸入法程?序,你平時(shí)是看不見它的,但是在你打開輸入界面的時(shí)候,它?會(huì)很快的彈出來,而不是讓你等啊等啊等,看不到的原因是?透明度的機(jī)制,咱就不要鉆牛角尖討論為啥我看不見了...?還有桌面的Widgets,比如我們的桌面時(shí)鐘,這個(gè)東西就是?可見的,如果它被系統(tǒng)終止了會(huì)有什么樣的結(jié)果?這個(gè)?Widgets依然會(huì)顯示在桌面上,但是時(shí)針不走了...?主要服務(wù),比如說,電話的撥號(hào)功能,你也不想正急著打?電話呢結(jié)果人家給你卡半天吧,尤其像我這樣聯(lián)系人上?2000的,載入一遍真的很慢啊...所以這些主要服務(wù)平時(shí)也?不會(huì)被系統(tǒng)自動(dòng)結(jié)束,除非你非要關(guān)它,關(guān)了也會(huì)自己重新?加載的.這也是你完全釋放內(nèi)存以后過一會(huì)就看著內(nèi)存可?用值又慢慢降低的原因.
次要服務(wù)(secondary?server),諸如谷歌企業(yè)套?件,Gmail,聯(lián)系人,看著這些程序出現(xiàn)在任務(wù)管理器里可能?你會(huì)非常的莫名其妙,丫的這都哪跟哪啊我沒開啊...其實(shí)?它們和一些系統(tǒng)功能也是息息相關(guān)的,比如Gmail的郵件推?送,我們時(shí)常需要用到它們,所以系統(tǒng)也太會(huì)去終止它們.甚?至于HTC機(jī)器上著名的HTC?Sense,這個(gè)也是次要服務(wù),但?是其實(shí)它承接著整個(gè)系統(tǒng)界面的運(yùn)行,所以,如果你強(qiáng)行關(guān)?閉所有進(jìn)程的時(shí)候,你的屏幕會(huì)變成一片白...然后慢慢等?HTC?Sense加載.
后臺(tái)進(jìn)程(hidden),就是我們通常意義上理解的啟動(dòng)后?被切換到后臺(tái)的進(jìn)程,比如如瀏覽器和閱讀器.后臺(tái)進(jìn)程的?管理策略有多種,但是一般來講,系統(tǒng)都會(huì)視內(nèi)存情況,盡可?能多的保留后臺(tái)程序,這樣會(huì)影響到你啟動(dòng)別的程序的運(yùn)?行速度----我想這個(gè)很好理解,因?yàn)閮?nèi)存確實(shí)不夠了,而且你?還沒讓系統(tǒng)自動(dòng)釋放內(nèi)存.但好處是,你再次切換到這些已?啟動(dòng)的程序時(shí)幾乎是無縫的,速度絕對(duì)比你從0開始啟動(dòng)它?要快得多.所以,這種后臺(tái)進(jìn)程在內(nèi)存極度不夠的時(shí)候,肯定?會(huì)被系統(tǒng)選擇性的干掉的.?內(nèi)容供應(yīng)節(jié)點(diǎn)(content?provider),沒有程序?qū)嶓w,僅提?供內(nèi)容供別的程序去用的,比如日歷供應(yīng)節(jié)點(diǎn),郵件供應(yīng)節(jié)?點(diǎn)等.在系統(tǒng)自動(dòng)終止進(jìn)程時(shí),這類程序享有優(yōu)先的被干掉?權(quán)...?空進(jìn)程(empty),?沒有任何東西在內(nèi)運(yùn)行的進(jìn)程,有些程序在退出后,依然會(huì)?在進(jìn)程中駐留一個(gè)空進(jìn)程,這個(gè)進(jìn)程里沒有任何數(shù)據(jù)在運(yùn)?行,作用往往是提高該程序下次的啟動(dòng)速度或者記錄程序?的一些歷史信息.這部分進(jìn)程無疑是系統(tǒng)最先終止的.
說了這么多,其實(shí)還是要結(jié)合實(shí)際的程序來看一下的,比如?Android這個(gè)很有名的自動(dòng)內(nèi)存調(diào)配的軟件,Auto?Memory?Manager,它的設(shè)置和幫助界面就如上面所說的,?它自動(dòng)提供了多種默認(rèn)配置,例如極速模式,這個(gè)模式下,會(huì)?幫助你在設(shè)定好的臨界值區(qū)間上,結(jié)束空進(jìn)程以及內(nèi)容供?應(yīng)節(jié)點(diǎn)等等低優(yōu)先級(jí)保留權(quán)的進(jìn)程,來給你騰出更多的內(nèi)?存,加速新運(yùn)行程序打開的速度,但是它也說明了這種模式?的弊端,就是一些可能你不想被關(guān)閉的進(jìn)程會(huì)被過早的關(guān)?閉,比如說,鬧鐘----在G2?G3還很火爆的2009年,很多用戶?在買完手機(jī)后給我抱怨,哎呀這個(gè)機(jī)器鬧鐘怎么老不響?啊...上班老遲到...其實(shí)這就是因?yàn)槭謩?dòng)結(jié)束進(jìn)程的時(shí)候結(jié)?果把鬧鐘也給干掉了.系統(tǒng)的時(shí)間是會(huì)一直走的,這屬于主?要服務(wù),而鬧鐘呢,只是主要服務(wù)的一個(gè)附屬品,所以被結(jié)束?后,是不會(huì)自動(dòng)被啟動(dòng)的,既然沒有啟動(dòng)自然就不會(huì)響了.與?此類似的例子就是里程碑不充電的BUG,這是因?yàn)镸oto的?機(jī)器里有個(gè)USB的進(jìn)程,如果你把它結(jié)束后,理論上會(huì)重新?啟動(dòng)的但是也會(huì)不啟動(dòng),后面這種情況出現(xiàn)的結(jié)果就是你?插充電器沒反應(yīng),插數(shù)據(jù)線連電腦沒反應(yīng)...重啟手機(jī)就好?了.?當(dāng)然我知道大家的潔癖很多,有的人就是見不得內(nèi)存值太?小...好吧如果你不想一些被系統(tǒng)認(rèn)為不太重要而你又很需?要的進(jìn)程被你自己親手扼殺的話,那么我推薦你使用高級(jí)?任務(wù)管理器這個(gè)程序,你可以把一些進(jìn)程自動(dòng)隱藏起來,也?就是說當(dāng)你揮起狼牙棒橫掃一堆進(jìn)程的時(shí)候,你設(shè)置好的?幾個(gè)進(jìn)程是不會(huì)受任何影響的,比如桌面Launcher,比如鬧?鐘,比如USB,等等等等.但話說回來,我是不建議大家去手動(dòng)?管理Android的內(nèi)存,也許你會(huì)不習(xí)慣----我也沒啥好勸告?的,總之,不要把你的智能機(jī)想的那么笨就行了.?剛才全殺掉進(jìn)程后,過了一會(huì),我的DEFY又變成剩余60M內(nèi)?存,還是沒啥鴨梨啊...如果你感興趣可以做個(gè)試驗(yàn),內(nèi)?存很少的時(shí)候,你打開一個(gè)大游戲,然后退出,你會(huì)發(fā)現(xiàn)...
http://reedhistudy.diandian.com/post/2011-09-15/5045645?
2.?下面異常是屬于Runtime?Exception?的是(abcd)(多選)
??????A、ArithmeticException?
??????B、IllegalArgumentException?
??????C、NullPointerException?
??????D、BufferUnderflowException?
??A、ArithmeticException?????
???當(dāng)出現(xiàn)異常的運(yùn)算條件時(shí),拋出此異常。例如,一個(gè)整數(shù)“除以零”時(shí),拋出此類的一個(gè)實(shí)例。
??????B、IllegalArgumentException?
??拋出的異常表明向方法傳遞了一個(gè)不合法或不正確的參數(shù)。
??????C、NullPointerException?
??????D、BufferUnderflowException?(不明白,沒碰到過)
編碼問題導(dǎo)致java_BufferUnderflowException異常
公共類BufferUnderflowException的
延伸的RuntimeException
未經(jīng)檢查的異常時(shí),拋出一個(gè)相對(duì)get操作達(dá)到源緩沖區(qū)的限制。
?
3.??Math.round(11.5)等于多少().?Math.round(-11.5)等于多少(c).?
A、11?,-11???B、11?,-12???C、12?,-11???D、12?,-12
四舍五入?四和五是指正的4,5
-11.5?這么看?-11.5?=?-12?+0.5???,0.5按四舍五入為1?,-12+1?=?-11,所以Math.round(-11.5)==-11
???????????-0.5?=?-1?+?0.5???0.5按四舍五入為1?,-1+1?=?0,所以Math.round(-0.5)==0
????????????11.5?四舍五入?顯然?Math.round(11.5)==12
round方法返回與參數(shù)最接近的長(zhǎng)整數(shù),參數(shù)加0.5后求其floor(小于等于該數(shù)的最大整數(shù))
4.?下列程序段的輸出結(jié)果是:(b)
?????void?complicatedexpression_r(){
?????int?x=20,?y=30;
?????boolean?b;
?????b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;
?????System.out.println(b);
?????}
?????A、true??B、false??C、1??D、011.activity
? ? ? ? &&(與)的優(yōu)先級(jí)比||(或)高
5.?對(duì)一些資源以及狀態(tài)的操作保存,最好是保存在生命周期的哪個(gè)函數(shù)中進(jìn)行(d)
???A、onPause()??B、onCreate()???C、?onResume()???D、onStart()
Activity詳解(生命周期、以各種方式啟動(dòng)Activity、狀態(tài)保存,完全退出等)
http://blog.csdn.net/tangcheng_ok/article/details/6755194
6.?Intent傳遞數(shù)據(jù)時(shí),下列的數(shù)據(jù)類型哪些可以被傳遞(abcd)(多選)
???????A、Serializable??B、charsequence??C、Parcelable??D、Bundle
android 數(shù)據(jù)傳遞詳解(Serialization、Parcelable、Parcel、Intent、Bundle)
http://jojol-zhou.iteye.com/blog/1401905
Android中Intent傳遞對(duì)象的兩種方法(Serializable,Parcelable)
http://blog.csdn.net/xyz_lmn/article/details/5908355
7.?android?中下列屬于Intent的作用的是(c)
??A、實(shí)現(xiàn)應(yīng)用程序間的數(shù)據(jù)共享
??B、是一段長(zhǎng)的生命周期,沒有用戶界面的程序,可以保持應(yīng)用在后臺(tái)運(yùn)行,而不會(huì)因?yàn)榍袚Q頁(yè)面而消失
??C、可以實(shí)現(xiàn)界面間的切換,可以包含動(dòng)作和動(dòng)作數(shù)據(jù),連接四大組件的紐帶
??D、處理一個(gè)應(yīng)用程序整體性的工作
8.?下列屬于SAX解析xml文件的優(yōu)點(diǎn)的是(b)
??????A、將整個(gè)文檔樹在內(nèi)存中,便于操作,支持刪除,修改,重新排列等多種功能(dom解析優(yōu)點(diǎn))
??????B、不用事先調(diào)入整個(gè)文檔,占用資源少(sax解析優(yōu)點(diǎn))
??????C、整個(gè)文檔調(diào)入內(nèi)存,浪費(fèi)時(shí)間和空間(dom解析缺點(diǎn))
??????D、不是長(zhǎng)久駐留在內(nèi)存,數(shù)據(jù)不是持久的,事件過后,若沒有保存數(shù)據(jù),數(shù)據(jù)就會(huì)(sax解析缺點(diǎn))
??消失
不需要像dom解析那樣在內(nèi)存中建立一個(gè)dom對(duì)象,占用內(nèi)存,sax解析是逐行解析的,每次讀入內(nèi)存的只是一行xml,所以速度快,效率高點(diǎn)。不過sax一般是處理固定格式的xml。
9.??下面的對(duì)自定style的方式正確的是(a)
????A、?<resources>
<style?name="myStyle">
<item?name="android:layout_width">fill_parent</item>
</style>
?</resources>
?????B、?<style?name="myStyle">
<item?name="android:layout_width">fill_parent</item>(沒有<resources>)
???</style>
?????C、?<resources>
<item?name="android:layout_width">fill_parent</item>(沒有</style>)
??</resources>
?????D、?<resources>
<style?name="android:layout_width">fill_parent</style>(</style>應(yīng)為</item>)
??</resources>
10.???在android中使用Menu時(shí)可能需要重寫的方法有(ac)。(多選)
??????A、onCreateOptionsMenu()?
??B、onCreateMenu()
??C、onOptionsItemSelected()
??D、onItemSelected()
?//當(dāng)客戶點(diǎn)擊MENU按鈕的時(shí)候,調(diào)用該方法
? ? @Override
public boolean onCreateOptionsMenu(Menu menu) {
? ??menu.add(0, 1, 1, R.string.exit);
? ??menu.add(0,2,2,R.string.about);
return super.onCreateOptionsMenu(menu);
}
? ? //當(dāng)客戶點(diǎn)擊菜單當(dāng)中的某一個(gè)選項(xiàng)時(shí),會(huì)調(diào)用該方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == 1){
finish();
}
return super.onOptionsItemSelected(item);
}
11.??在SQL?Server?Management?Studio?中運(yùn)行下列T-SQL語(yǔ)句,其輸出值(c)。
?SELECT?@@IDENTITY??
?????A、可能為0.1
?????B、可能為3
?????C、?不可能為-100
?????D、肯定為0
<span style="color: rgb(16, 9, 163);">@@identity是表示的是最近一次向具有identity屬性(即</span><span style="color: rgb(255, 0, 0);">自增列</span><span style="color: rgb(16, 9, 163);">)的表插入數(shù)據(jù)時(shí)對(duì)應(yīng)的自增列的值,是系統(tǒng)定義的全局變量。一般系統(tǒng)定義的全局變量都是以@@開頭,用戶自定義變量以@開頭。比如有個(gè)表A,它的自增列是id,當(dāng)向A表插入一行數(shù)據(jù)后,如果插入數(shù)據(jù)后自增列的值自動(dòng)增加至101,則通過select @@identity得到的值就是101。使用@@identity的前提是在進(jìn)行insert操作后,執(zhí)行select @@identity的時(shí)候連接沒有關(guān)閉,否則得到的將是NULL值。</span>
12.?在SQL?Server?2005中運(yùn)行如下T-SQL語(yǔ)句,假定SALES表中有多行數(shù)據(jù),執(zhí)行查詢之?后的結(jié)果是(d)。
?BEGIN?TRANSACTION?A
??Update?SALES?Set?qty=30?WHERE?qty<30
?BEGIN?TRANSACTION?B
Update?SALES?Set?qty=40?WHERE?qty<40
Update?SALES?Set?qty=50?WHERE?qty<50
Update?SALES?Set?qty=60?WHERE?qty<60
?COMMITTRANSACTION?B
?COMMIT?TRANSACTION?A
?A、SALES表中qty列最小值大于等于30
?B、SALES表中qty列最小值大于等于40
?C、SALES表中qty列的數(shù)據(jù)全部為50
?D、SALES表中qty列最小值大于等于60
Update?SALES?Set?qty=60?WHERE?qty<60(關(guān)鍵在最后一句,執(zhí)行完數(shù)據(jù)就都是大于等于60了)
13.??在android中使用SQLiteOpenHelper這個(gè)輔助類時(shí),可以生成一個(gè)數(shù)據(jù)庫(kù),并可以對(duì)數(shù)據(jù)庫(kù)版本進(jìn)行管理的方法可以是(ab)
?????A、getWriteableDatabase()
?B、getReadableDatabase()
?C、getDatabase()
?D、getAbleDatabase()
14.?android?關(guān)于service生命周期的onCreate()和onStart()說法正確的是(ad)(多選題)
?????A、當(dāng)?shù)谝淮螁?dòng)的時(shí)候先后調(diào)用onCreate()和onStart()方法
?????B、當(dāng)?shù)谝淮螁?dòng)的時(shí)候只會(huì)調(diào)用onCreate()方法
?????C、如果service已經(jīng)啟動(dòng),將先后調(diào)用onCreate()和onStart()方法
?D、如果service已經(jīng)啟動(dòng),只會(huì)執(zhí)行onStart()方法,不在執(zhí)行onCreate()方法
15.?下面是屬于GLSurFaceView特性的是(abc)(多選)
?A、管理一個(gè)surface,這個(gè)surface就是一塊特殊的內(nèi)存,能直接排版到android的視圖
????view上。
?B、管理一個(gè)EGL?display,它能讓opengl把內(nèi)容渲染到上述的surface上。
?C、讓渲染器在獨(dú)立的線程里運(yùn)作,和UI線程分離。
?D、可以直接從內(nèi)存或者DMA等硬件接口取得圖像數(shù)據(jù)
android.opengl.GLSurfaceView概述
http://blog.csdn.net/xqhrs232/article/details/6195824
?GLSurfaceView是一個(gè)視圖,繼承至SurfaceView,它內(nèi)嵌的surface專門負(fù)責(zé)OpenGL渲染。
GLSurfaceView提供了下列特性: 1> 管理一個(gè)surface,這個(gè)surface就是一塊特殊的內(nèi)存,能直接排版到android的視圖view上。 2> 管理一個(gè)EGL display,它能讓opengl把內(nèi)容渲染到上述的surface上。 3> 用戶自定義渲染器(render)。 4> 讓渲染器在獨(dú)立的線程里運(yùn)作,和UI線程分離。 5> 支持按需渲染(on-demand)和連續(xù)渲染(continuous)。 6> 一些可選工具,如調(diào)試。
16.?下面在AndroidManifest.xml文件中注冊(cè)BroadcastReceiver方式正確的(a)
???A、<receiver?android:name="NewBroad">
<intent-filter>
<action??
???????????????????android:name="android.provider.action.NewBroad"/>
????????????????<action>
</intent-filter>
</receiver>
?????B、<receiver?android:name="NewBroad">
<intent-filter>
???????????????????android:name="android.provider.action.NewBroad"/>
</intent-filter>
</receiver>
?????C、<receiver?android:name="NewBroad">
<action??
??????????????????android:name="android.provider.action.NewBroad"/>
?????????????<action>
</receiver>
?????D、<intent-filter>
?????????<receiver?android:name="NewBroad">
?<action>?
???????????????????android:name="android.provider.action.NewBroad"/>
??????????????<action>
</receiver>
</intent-filter>
17.?關(guān)于ContenValues類說法正確的是(a)
??????A、他和Hashtable比較類似,也是負(fù)責(zé)存儲(chǔ)一些名值對(duì),但是他存儲(chǔ)的名值對(duì)當(dāng)中的
?????????名是String類型,而值都是基本類型
??????B、他和Hashtable比較類似,也是負(fù)責(zé)存儲(chǔ)一些名值對(duì),但是他存儲(chǔ)的名值對(duì)當(dāng)中的
?????????名是任意類型,而值都是基本類型
??????C、他和Hashtable比較類似,也是負(fù)責(zé)存儲(chǔ)一些名值對(duì),但是他存儲(chǔ)的名值對(duì)當(dāng)中的
?????????名,可以為空,而值都是String類型??????
??????D、他和Hashtable比較類似,也是負(fù)責(zé)存儲(chǔ)一些名值對(duì),但是他存儲(chǔ)的名值對(duì)當(dāng)中
?????????的名是String類型,而值也是String類型
18.?我們都知道Hanlder是線程與Activity通信的橋梁,如果線程處理不當(dāng),你的機(jī)器就會(huì)變得越慢,那么線程銷毀的方法是(a)
???????A、onDestroy()?
???????B、onClear()
???????C、onFinish()?
???????D、onStop()
19.?下面退出Activity錯(cuò)誤的方法是(c)
???????A、finish()
????B、拋異常強(qiáng)制退出
???????C、System.exit() ?System.exit(0)?0是正常退出?
其他數(shù)字是表示不正常退出
???????D、onStop()
20.?下面屬于android的動(dòng)畫分類的有(ab)(多項(xiàng))
???????A、Tween??B、Frame?C、Draw?D、Animation?
Android動(dòng)畫模式
Animation主要有兩種動(dòng)畫模式:
一種是tweened animation(漸變動(dòng)畫)?
| XML中 | JavaCode |
| alpha | AlphaAnimation |
| scale | ScaleAnimation |
一種是frame by frame(畫面轉(zhuǎn)換動(dòng)畫)?
| XML中 | JavaCode |
| translate | TranslateAnimation |
| rotate | RotateAnimation |
21.?下面關(guān)于Android?dvm的進(jìn)程和Linux的進(jìn)程,應(yīng)用程序的進(jìn)程說法正確的是(d)
????????A、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,不一定擁有一個(gè)獨(dú)立?的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM都是在Linux?中的一個(gè)進(jìn)程,所以說可以認(rèn)為是同一個(gè)概念.
????????B、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,不一定擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM不一定都是在Linux?中的一個(gè)進(jìn)程,所以說不是一個(gè)概念.
????????C、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM不一定都是在Linux?中的一個(gè)進(jìn)程,所以說不是一個(gè)概念.
????????D、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的?Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM都是在Linux?中的一個(gè)進(jìn)程,所以說可以認(rèn)為是同一個(gè)概念.
22.???Android項(xiàng)目工程下面的assets目錄的作用是什么b
A、放置應(yīng)用到的圖片資源。
B、主要放置多媒體等數(shù)據(jù)文件
C、放置字符串,顏色,數(shù)組等常量數(shù)據(jù)
D、放置一些與UI相應(yīng)的布局文件,都是xml文件
23.??關(guān)于res/raw目錄說法正確的是(a)
A、?這里的文件是原封不動(dòng)的存儲(chǔ)到設(shè)備上不會(huì)轉(zhuǎn)換為二進(jìn)制的格式
B、?這里的文件是原封不動(dòng)的存儲(chǔ)到設(shè)備上會(huì)轉(zhuǎn)換為二進(jìn)制的格式
C、?這里的文件最終以二進(jìn)制的格式存儲(chǔ)到指定的包中
D、?這里的文件最終不會(huì)以二進(jìn)制的格式存儲(chǔ)到指定的包中
24.??下列對(duì)android?NDK的理解正確的是(abcd?)
A、?NDK是一系列工具的集合
B、?NDK?提供了一份穩(wěn)定、功能有限的?API?頭文件聲明。
C、?使?“Java+C”?的開發(fā)方式終于轉(zhuǎn)正,成為官方支持的開發(fā)方式
D、?NDK?將是?Android?平臺(tái)支持?C?開發(fā)的開端
Windows平臺(tái)下如何使用Android NDK
http://yuchen.blog.51cto.com/2739238/623472/
二.填空題
25.??android中常用的四個(gè)布局是LinearLayout(線性布局)、FrameLayout(單幀布局)、RelativeLayout(相對(duì)布局)和TableLayout(表格布局)
26.??android?的四大組件是activity,service,broadcast和Content Provider。
27.??java.io包中的objectinputstream和objectoutputstream類主要用于對(duì)對(duì)象(Object)的讀寫。
28.??android?中service的實(shí)現(xiàn)方法是:startservice和bindservice。
Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy?我們有兩種方式啟動(dòng)一個(gè)Service,他們對(duì)Service生命周期的影響是不一樣的。
1 通過startService?
Service會(huì)經(jīng)歷 onCreate --> onStart?
stopService的時(shí)候直接onDestroy?
如果是 調(diào)用者 直接退出而沒有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行。?
下次調(diào)用者再起來仍然可以stopService。
2 通過bindService?
Service只會(huì)運(yùn)行onCreate, 這個(gè)時(shí)候 調(diào)用者和Service綁定在一起?
調(diào)用者退出了,Srevice就會(huì)調(diào)用onUnbind-->onDestroyed?
所謂綁定在一起就共存亡了。?
1. Started Service中使用StartService()方法來進(jìn)行方法的調(diào)用,調(diào)用者和服務(wù)之間沒有聯(lián)系,即使調(diào)用者退出了,服務(wù)依然在進(jìn)行【onCreate()-? >onStartCommand()->startService()->onDestroy()】,注意其中沒有onStart(),主要是被onStartCommand()方法給取代了,onStart方法不推薦使用了。
2. BindService中使用bindService()方法來綁定服務(wù),調(diào)用者和綁定者綁在一起,調(diào)用者一旦退出服務(wù)也就終止了【onCreate()->onBind()->onUnbind()->onDestroy()】。
29.??activity一般會(huì)重載7個(gè)方法用來維護(hù)其生命周期,除了onCreate(),onStart(),onDestory()??外還有onrestart,onresume,onpause,onstop。
30.??android的數(shù)據(jù)存儲(chǔ)的方式sharedpreference,文件,SQlite,contentprovider,網(wǎng)絡(luò)。
?1. 使用SharedPreferences存儲(chǔ)數(shù)據(jù);? 2. 文件存儲(chǔ)數(shù)據(jù);
? 3. SQLite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù);
? 4. 使用ContentProvider存儲(chǔ)數(shù)據(jù);
? 5. 網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù);
31.?當(dāng)啟動(dòng)一個(gè)Activity并且新的Activity執(zhí)行完后需要返回到啟動(dòng)它的Activity來執(zhí)行?的回調(diào)函數(shù)是
startActivityForResult
startActivityForResult(Intent,requestCode)//啟動(dòng)一個(gè)activity包含參數(shù)請(qǐng)求碼和具體的intent數(shù)據(jù),其中請(qǐng)求碼可以用來識(shí)別子活動(dòng)。
32.?請(qǐng)使用命令行的方式創(chuàng)建一個(gè)名字為myAvd,sdk版本為2.2,sd卡是在d盤的根目錄下,名字為scard.img,?并指定屏幕大小HVGA.________________android create acd -n myAvd -t 8 -s HVDA – C d:\card.img____________________。
33.???程序運(yùn)行的結(jié)果是:_____good?and?gbc__________。
????public?class?Example{?
String?str=new?String("good");?
char[]ch={'a','b','c'};?
public?static?void?main(String?args[]){?
Example?ex=new?Example();?
ex.change(ex.str,ex.ch);?
System.out.print(ex.str+"?and?");?
Sytem.out.print(ex.ch);?
}?
public?void?change(String?str,char?ch[]){?
str="test?ok";?
ch[0]='g';?
}?
}?
34.??在android中,請(qǐng)簡(jiǎn)述jni的調(diào)用過程。(8分)
1)安裝和下載Cygwin,下載?Android?NDK
??2)在ndk項(xiàng)目中JNI接口的設(shè)計(jì)
??3)使用C/C++實(shí)現(xiàn)本地方法
??4)JNI生成動(dòng)態(tài)鏈接庫(kù).so文件
??5)將動(dòng)態(tài)鏈接庫(kù)復(fù)制到java工程,在java工程中調(diào)用,運(yùn)行java工程即可
35.?簡(jiǎn)述Android應(yīng)用程序結(jié)構(gòu)是哪些?(7分)
Android應(yīng)用程序結(jié)構(gòu)是:
??Linux?Kernel(Linux內(nèi)核)、Libraries(系統(tǒng)運(yùn)行庫(kù)或者是c/c++核心庫(kù))、Application??
??Framework(開發(fā)框架包)、Applications(核心應(yīng)用程序)
36.?請(qǐng)繼承SQLiteOpenHelper實(shí)現(xiàn):(10分)
???1).創(chuàng)建一個(gè)版本為1的“diaryOpenHelper.db”的數(shù)據(jù)庫(kù),
???2).同時(shí)創(chuàng)建一個(gè)?“diary”?表(包含一個(gè)_id主鍵并自增長(zhǎng),topic字符型100
???????長(zhǎng)度,?content字符型1000長(zhǎng)度)
????3).在數(shù)據(jù)庫(kù)版本變化時(shí)請(qǐng)刪除diary表,并重新創(chuàng)建出diary表。
public?class?DBHelper??extends?SQLiteOpenHelper?{
public?final?static?String?DATABASENAME?=?"diaryOpenHelper.db";
public?final?static?int?DATABASEVERSION?=?1;
//創(chuàng)建數(shù)據(jù)庫(kù)
public?DBHelper(Context?context,String?name,CursorFactory?factory,int?version)
{
super(context,?name,?factory,?version);
}
//創(chuàng)建表等機(jī)構(gòu)性文件
public?void?onCreate(SQLiteDatabase?db)
{
String?sql?="create?table?diary"+
"("+
"_id?integer?primary?key?autoincrement,"+
"topic?varchar(100),"+
"content?varchar(1000)"+
")";
db.execSQL(sql);
}
//若數(shù)據(jù)庫(kù)版本有更新,則調(diào)用此方法
public?void?onUpgrade(SQLiteDatabase?db,int?oldVersion,int?newVersion)
{
String?sql?=?"drop?table?if?exists?diary";
db.execSQL(sql);
this.onCreate(db);
}
}
37.?頁(yè)面上現(xiàn)有ProgressBar控件progressBar,請(qǐng)用書寫線程以10秒的的時(shí)間完成其進(jìn)度顯示工作。(10分)
答案
public?class?ProgressBarStu?extends?Activity?{
private?ProgressBar?progressBar?=?null;
protected?void?onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
//從這到下是關(guān)鍵
progressBar?=?(ProgressBar)findViewById(R.id.progressBar);
Thread?thread?=?new?Thread(new?Runnable()?{
@Override
public?void?run()?{
int?progressBarMax?=?progressBar.getMax();
try?{
while(progressBarMax!=progressBar.getProgress())
{
int?stepProgress?=?progressBarMax/10;
int?currentprogress?=?progressBar.getProgress();
progressBar.setProgress(currentprogress+stepProgress);
Thread.sleep(1000);
}
}?catch?(InterruptedException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
}
});
thread.start();
//關(guān)鍵結(jié)束
}
}
38.????請(qǐng)描述下Activity的生命周期。
??????必調(diào)用的三個(gè)方法:onCreate()?-->?onStart()?-->?onResume(),用AAA表示
(1)父Activity啟動(dòng)子Activity,子Actvity退出,父Activity調(diào)用順序如下
AAA?-->?onFreeze()?-->?onPause()?-->?onStop()?-->?onRestart()?-->?onStart(),onResume()?…
(2)用戶點(diǎn)擊Home,Actvity調(diào)用順序如下
AAA?-->?onFreeze()?-->?onPause()?-->?onStop()?--?Maybe?-->?onDestroy()?–?Maybe
(3)調(diào)用finish(),?Activity調(diào)用順序如下
AAA?-->?onPause()?-->?onStop()?-->?onDestroy()
(4)在Activity上顯示dialog,?Activity調(diào)用順序如下
AAA
(5)在父Activity上顯示透明的或非全屏的activity,Activity調(diào)用順序如下
AAA?-->?onFreeze()?-->?onPause()
(6)設(shè)備進(jìn)入睡眠狀態(tài),Activity調(diào)用順序如下
AAA?-->?onFreeze()?-->?onPause()
39.???如果后臺(tái)的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?
??????onSaveInstanceState()
??????當(dāng)你的程序中某一個(gè)Activity?A在運(yùn)行時(shí),主動(dòng)或被動(dòng)地運(yùn)行另一個(gè)新的Activity?B,這個(gè)時(shí)候A會(huì)執(zhí)行onSaveInstanceState()。B完成以后又會(huì)來找A,這個(gè)時(shí)候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調(diào)用onCreate()方法,不同于直接啟動(dòng)的是這回onCreate()里是帶上了參數(shù)savedInstanceState;而沒被收回的就直接執(zhí)行onResume(),跳過onCreate()了。?
40.????如何將一個(gè)Activity設(shè)置成窗口的樣式。
??????在AndroidManifest.xml?中定義Activity的地方一句話android:theme="@android:style/Theme.Dialog"或android:theme="@android:style/Theme.Translucent"就變成半透明的
41.?如何退出Activity?如何安全退出已調(diào)用多個(gè)Activity的Application?
對(duì)于單一Activity的應(yīng)用來說,退出很簡(jiǎn)單,直接finish()即可。
當(dāng)然,也可以用killProcess()和System.exit()這樣的方法。
但是,對(duì)于多Activity的應(yīng)用來說,在打開多個(gè)Activity后,如果想在最后打開的Activity直接退出,上邊的方法都是沒有用的,因?yàn)樯线叺姆椒ǘ际墙Y(jié)束一個(gè)Activity而已。
當(dāng)然,網(wǎng)上也有人說可以。
就好像有人問,在應(yīng)用里如何捕獲Home鍵,有人就會(huì)說用keyCode比較KEYCODE_HOME即可,而事實(shí)上如果不修改framework,根本不可能做到這一點(diǎn)一樣。
所以,最好還是自己親自試一下。
那么,有沒有辦法直接退出整個(gè)應(yīng)用呢?
在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接結(jié)束整個(gè)應(yīng)用。在使用時(shí)需要權(quán)限android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。
可是,在2.2,這個(gè)方法失效了。
在2.2添加了一個(gè)新的方法,killBackgroundProcesses(),需要權(quán)限?android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是,它和2.2的restartPackage一樣,根本起不到應(yīng)有的效果。
另外還有一個(gè)方法,就是系統(tǒng)自帶的應(yīng)用程序管理里,強(qiáng)制結(jié)束程序的方法,forceStopPackage()。
它需要權(quán)限android.permission.FORCE_STOP_PACKAGES。
并且需要添加android:sharedUserId="android.uid.system"屬性
同樣可惜的是,該方法是非公開的,他只能運(yùn)行在系統(tǒng)進(jìn)程,第三方程序無法調(diào)用。
因?yàn)樾枰?span style="font-family:'Times New Roman'">Android.mk中添加LOCAL_CERTIFICATE?:=?platform。
而Android.mk是用于在Android源碼下編譯程序用的。
從以上可以看出,在2.2,沒有辦法直接結(jié)束一個(gè)應(yīng)用,而只能用自己的辦法間接辦到。
現(xiàn)提供幾個(gè)方法,供參考:
1、拋異常強(qiáng)制退出:
該方法通過拋異常,使程序Force?Close。
驗(yàn)證可以,但是,需要解決的問題是,如何使程序結(jié)束掉,而不彈出Force?Close的窗口。
2、記錄打開的Activity:
每打開一個(gè)Activity,就記錄下來。在需要退出時(shí),關(guān)閉每一個(gè)Activity即可。
3、發(fā)送特定廣播:
在需要結(jié)束應(yīng)用時(shí),發(fā)送一個(gè)特定的廣播,每個(gè)Activity收到廣播后,關(guān)閉即可。
4、遞歸退出
在打開新的Activity時(shí)使用startActivityForResult,然后自己加標(biāo)志,在onActivityResult中處理,遞歸關(guān)閉。
除了第一個(gè),都是想辦法把每一個(gè)Activity都結(jié)束掉,間接達(dá)到目的。
但是這樣做同樣不完美。
你會(huì)發(fā)現(xiàn),如果自己的應(yīng)用程序?qū)γ恳粋€(gè)Activity都設(shè)置了nosensor,在兩個(gè)Activity結(jié)束的間隙,sensor可能有效了。
但至少,我們的目的達(dá)到了,而且沒有影響用戶使用。
為了編程方便,最好定義一個(gè)Activity基類,處理這些共通問題。?
42.?請(qǐng)介紹下Android中常用的五種布局。
FrameLayout(框架布局),LinearLayout?(線性布局),AbsoluteLayout(絕對(duì)布局),RelativeLayout(相對(duì)布局),TableLayout(表格布局)
43.?請(qǐng)介紹下Android的數(shù)據(jù)存儲(chǔ)方式。
一.SharedPreferences方式
二.文件存儲(chǔ)方式
三.SQLite數(shù)據(jù)庫(kù)方式
四.內(nèi)容提供器(Content?provider)方式
五.?網(wǎng)絡(luò)存儲(chǔ)方式
44.??請(qǐng)介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的。
創(chuàng)建一個(gè)屬于你自己的Content?provider或者將你的數(shù)據(jù)添加到一個(gè)已經(jīng)存在的Content?provider中,前提是有相同數(shù)據(jù)類型并且有寫入Content?provider的權(quán)限。
45.?如何啟用Service,如何停用Service。
Android中的service類似于windows中的service,service一般沒有用戶操作界面,它運(yùn)行于系統(tǒng)中不容易被用戶發(fā)覺,
可以使用它開發(fā)如監(jiān)控之類的程序。
一。步驟
第一步:繼承Service類
public?class?SMSService?extends?Service?{?}
第二步:在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里對(duì)服務(wù)進(jìn)行配置:
<service?android:name=".DemoService"?/>
二。Context.startService()和Context.bindService
服務(wù)不能自己運(yùn)行,需要通過調(diào)用Context.startService()或Context.bindService()方法啟動(dòng)服務(wù)。這兩個(gè)方法都可
以啟動(dòng)Service,但是它們的使用場(chǎng)合有所不同。
1.使用startService()方法啟用服務(wù),調(diào)用者與服務(wù)之間沒有關(guān)連,即使調(diào)用者退出了,服務(wù)仍然運(yùn)行。
使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止。
2.采用Context.startService()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會(huì)先調(diào)用服務(wù)的onCreate()方法,
接著調(diào)用onStart()方法。如果調(diào)用startService()方法前服務(wù)已經(jīng)被創(chuàng)建,多次調(diào)用startService()方法并
不會(huì)導(dǎo)致多次創(chuàng)建服務(wù),但會(huì)導(dǎo)致多次調(diào)用onStart()方法。
采用startService()方法啟動(dòng)的服務(wù),只能調(diào)用Context.stopService()方法結(jié)束服務(wù),服務(wù)結(jié)束時(shí)會(huì)調(diào)用
onDestroy()方法。?
?
3.采用Context.bindService()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會(huì)先調(diào)用服務(wù)的onCreate()方法,
接著調(diào)用onBind()方法。這個(gè)時(shí)候調(diào)用者和服務(wù)綁定在一起,調(diào)用者退出了,系統(tǒng)就會(huì)先調(diào)用服務(wù)的onUnbind()方法,
。接著調(diào)用onDestroy()方法。如果調(diào)用bindService()方法前服務(wù)已經(jīng)被綁定,多次調(diào)用bindService()方法并不會(huì)
導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說onCreate()和onBind()方法并不會(huì)被多次調(diào)用)。如果調(diào)用者希望與正在綁定的服務(wù)
解除綁定,可以調(diào)用unbindService()方法,調(diào)用該方法也會(huì)導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法。
三。Service的生命周期
1.Service常用生命周期回調(diào)方法如下:
onCreate()?該方法在服務(wù)被創(chuàng)建時(shí)調(diào)用,該方法只會(huì)被調(diào)用一次,無論調(diào)用多少次startService()或bindService()方法,
服務(wù)也只被創(chuàng)建一次。?onDestroy()該方法在服務(wù)被終止時(shí)調(diào)用。?
?
2.?Context.startService()啟動(dòng)Service有關(guān)的生命周期方法
onStart()?只有采用Context.startService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在服務(wù)開始運(yùn)行時(shí)被調(diào)用。
多次調(diào)用startService()方法盡管不會(huì)多次創(chuàng)建服務(wù),但onStart()?方法會(huì)被多次調(diào)用。
3.?Context.bindService()啟動(dòng)Service有關(guān)的生命周期方法
onBind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在調(diào)用者與服務(wù)綁定時(shí)被調(diào)用,
當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定,多次調(diào)用Context.bindService()方法并不會(huì)導(dǎo)致該方法被多次調(diào)用。
onUnbind()只有采用Context.bindService()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在調(diào)用者與服務(wù)解除綁定時(shí)被調(diào)用。
備注:
1.?采用startService()啟動(dòng)服務(wù)
?????Intent?intent?=?new?Intent(DemoActivity.this,?DemoService.class);
?????startService(intent);
2.Context.bindService()啟動(dòng)
????Intent?intent?=?new?Intent(DemoActivity.this,?DemoService.class);
????bindService(intent,?conn,?Context.BIND_AUTO_CREATE);
???//unbindService(conn);//解除綁定
46.?注冊(cè)廣播有幾種方式,這些方式有何優(yōu)缺點(diǎn)?請(qǐng)談?wù)?span style="font-family:'Times New Roman'">Android引入廣播機(jī)制的用意。
??Android廣播機(jī)制(兩種注冊(cè)方法)?
在android下,要想接受廣播信息,那么這個(gè)廣播接收器就得我們自己來實(shí)現(xiàn)了,我們可以繼承BroadcastReceiver,就可以有一個(gè)廣播接受器了。有個(gè)接受器還不夠,我們還得重寫BroadcastReceiver里面的onReceiver方法,當(dāng)來廣播的時(shí)候我們要干什么,這就要我們自己來實(shí)現(xiàn),不過我們可以搞一個(gè)信息防火墻。具體的代碼:
public?class?SmsBroadCastReceiver?extends?BroadcastReceiver????
{???
??
????@Override??
????public?void?onReceive(Context?context,?Intent?intent)???
????{???
????????Bundle?bundle?=?intent.getExtras();???
????????Object[]?object?=?(Object[])bundle.get("pdus");???
????????SmsMessage?sms[]=new?SmsMessage[object.length];???
????????for(int?i=0;i<object.length;i++)???
????????{???
????????????sms[0]?=?SmsMessage.createFromPdu((byte[])object[i]);???
????????????Toast.makeText(context,?"來自"+sms[i].getDisplayOriginatingAddress()+"?的消息是:"+sms[i].getDisplayMessageBody(),?Toast.LENGTH_SHORT).show();???
????????}???
????????//終止廣播,在這里我們可以稍微處理,根據(jù)用戶輸入的號(hào)碼可以實(shí)現(xiàn)短信防火墻。???
????????abortBroadcast();???
????}???
???????
}??
??當(dāng)實(shí)現(xiàn)了廣播接收器,還要設(shè)置廣播接收器接收廣播信息的類型,這里是信息:android.provider.Telephony.SMS_RECEIVED?
??我們就可以把廣播接收器注冊(cè)到系統(tǒng)里面,可以讓系統(tǒng)知道我們有個(gè)廣播接收器。這里有兩種,一種是代碼動(dòng)態(tài)注冊(cè):
//生成廣播處理???
smsBroadCastReceiver?=?new?SmsBroadCastReceiver();???
//實(shí)例化過濾器并設(shè)置要過濾的廣播???
IntentFilter?intentFilter?=?new?IntentFilter("android.provider.Telephony.SMS_RECEIVED");?
//注冊(cè)廣播???
BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,?intentFilter);??
一種是在AndroidManifest.xml中配置廣播
<?xml?version="1.0"?encoding="utf-8"?>??
<manifest?xmlns:android="http://schemas.android.com/apk/res/android"??
??????package="spl.broadCastReceiver"??
??????android:versionCode="1"??
??????android:versionName="1.0">??
????<application?android:icon="@drawable/icon"?android:label="@string/app_name">??
????????<activity?android:name=".BroadCastReceiverActivity"??
??????????????????android:label="@string/app_name">??
????????????<intent-filter>??
????????????????<action?android:name="android.intent.action.MAIN"?/>??
????????????????<category?android:name="android.intent.category.LAUNCHER"?/>??
????????????</intent-filter>??
????????</activity>??
???????????
????????<!--廣播注冊(cè)-->??
????????<receiver?android:name=".SmsBroadCastReceiver">??
????????????<intent-filter?android:priority="20">??
????????????????<action?android:name="android.provider.Telephony.SMS_RECEIVED"/>??
????????????</intent-filter>??
????????</receiver>??
???????????
????</application>??
???????
????<uses-sdk?android:minSdkVersion="7"?/>??
???????
????<!--?權(quán)限申請(qǐng)?-->??
????<uses-permission?android:name="android.permission.RECEIVE_SMS"></uses-permission>??
???????
</manifest>???
??兩種注冊(cè)類型的區(qū)別是:
?????1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。
?????2)第二種是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行。
47.?請(qǐng)解釋下在單線程模型中Message、Handler、Message?Queue、Looper之間的關(guān)系。
Handler簡(jiǎn)介:
一個(gè)Handler允許你發(fā)送和處理Message和Runable對(duì)象,這些對(duì)象和一個(gè)線程的MessageQueue相關(guān)聯(lián)。每一個(gè)線程實(shí)例和一個(gè)單獨(dú)的線程以及該線程的MessageQueue相關(guān)聯(lián)。當(dāng)你創(chuàng)建一個(gè)新的Handler時(shí),它就和創(chuàng)建它的線程綁定在一起了。這里,線程我們也可以理解為線程的MessageQueue。從這一點(diǎn)上來看,Handler把Message和Runable對(duì)象傳遞給MessageQueue,而且在這些對(duì)象離開MessageQueue時(shí),Handler負(fù)責(zé)執(zhí)行他們。
Handler有兩個(gè)主要的用途:(1)確定在將來的某個(gè)時(shí)間點(diǎn)執(zhí)行一個(gè)或者一些Message和Runnable對(duì)象。(2)在其他線程(不是Handler綁定線程)中排入一些要執(zhí)行的動(dòng)作。
Scheduling?Message,即(1),可以通過以下方法完成:
post(Runnable):Runnable在handler綁定的線程上執(zhí)行,也就是說不創(chuàng)建新線程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post這個(gè)動(dòng)作讓你把Runnable對(duì)象排入MessageQueue,MessageQueue受到這些消息的時(shí)候執(zhí)行他們,當(dāng)然以一定的排序。sendMessage這個(gè)動(dòng)作允許你把Message對(duì)象排成隊(duì)列,這些Message對(duì)象包含一些信息,Handler的hanlerMessage(Message)會(huì)處理這些Message.當(dāng)然,handlerMessage(Message)必須由Handler的子類來重寫。這是編程人員需要作的事。
當(dāng)posting或者sending到一個(gè)Hanler時(shí),你可以有三種行為:當(dāng)MessageQueue準(zhǔn)備好就處理,定義一個(gè)延遲時(shí)間,定義一個(gè)精確的時(shí)間去處理。后兩者允許你實(shí)現(xiàn)timeout,tick,和基于時(shí)間的行為。
當(dāng)你的應(yīng)用創(chuàng)建一個(gè)新的進(jìn)程時(shí),主線程(也就是UI線程)自帶一個(gè)MessageQueue,這個(gè)MessageQueue管理頂層的應(yīng)用對(duì)象(像activities,broadcast?receivers等)和主線程創(chuàng)建的窗體。你可以創(chuàng)建自己的線程,并通過一個(gè)Handler和主線程進(jìn)行通信。這和之前一樣,通過post和sendmessage來完成,差別在于在哪一個(gè)線程中執(zhí)行這么方法。在恰當(dāng)?shù)臅r(shí)候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。
Message簡(jiǎn)介:
Message類就是定義了一個(gè)信息,這個(gè)信息中包含一個(gè)描述符和任意的數(shù)據(jù)對(duì)象,這個(gè)信息被用來傳遞給Handler.Message對(duì)象提供額外的兩個(gè)int域和一個(gè)Object域,這可以讓你在大多數(shù)情況下不用作分配的動(dòng)作。
盡管Message的構(gòu)造函數(shù)是public的,但是獲取Message實(shí)例的最好方法是調(diào)用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會(huì)從回收對(duì)象池中獲取一個(gè)。
MessageQueue簡(jiǎn)介:
這是一個(gè)包含message列表的底層類。Looper負(fù)責(zé)分發(fā)這些message。Messages并不是直接加到一個(gè)MessageQueue中,而是通過MessageQueue.IdleHandler關(guān)聯(lián)到Looper。
你可以通過Looper.myQueue()從當(dāng)前線程中獲取MessageQueue。
Looper簡(jiǎn)介:
Looper類被用來執(zhí)行一個(gè)線程中的message循環(huán)。默認(rèn)情況,沒有一個(gè)消息循環(huán)關(guān)聯(lián)到線程。在線程中調(diào)用prepare()創(chuàng)建一個(gè)Looper,然后用loop()來處理messages,直到循環(huán)終止。
大多數(shù)和message?loop的交互是通過Handler。
下面是一個(gè)典型的帶有Looper的線程實(shí)現(xiàn)。
??class?LooperThread?extends?Thread?{
??????public?Handler?mHandler;
??????
??????public?void?run()?{
??????????Looper.prepare();
??????????
??????????mHandler?=?new?Handler()?{
??????????????public?void?handleMessage(Message?msg)?{
??????????????????//?process?incoming?messages?here
??????????????}
??????????};
??????????
??????????Looper.loop();
??????}
??}
48.????AIDL的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)?
AIDL的英文全稱是Android?Interface?Define?Language
當(dāng)A進(jìn)程要去調(diào)用B進(jìn)程中的service時(shí),并實(shí)現(xiàn)通信,我們通常都是通過AIDL來操作的
A工程:
首先我們?cè)?span style="font-family:'Times New Roman'">net.blogjava.mobile.aidlservice包中創(chuàng)建一個(gè)RemoteService.aidl文件,在里面我們自定義一個(gè)接口,含有方法get。ADT插件會(huì)在gen目錄下自動(dòng)生成一個(gè)RemoteService.java文件,該類中含有一個(gè)名為RemoteService.stub的內(nèi)部類,該內(nèi)部類中含有aidl文件接口的get方法。
說明一:aidl文件的位置不固定,可以任意
然后定義自己的MyService類,在MyService類中自定義一個(gè)內(nèi)部類去繼承RemoteService.stub這個(gè)內(nèi)部類,實(shí)現(xiàn)get方法。在onBind方法中返回這個(gè)內(nèi)部類的對(duì)象,系統(tǒng)會(huì)自動(dòng)將這個(gè)對(duì)象封裝成IBinder對(duì)象,傳遞給他的調(diào)用者。
其次需要在AndroidManifest.xml文件中配置MyService類,代碼如下:
<!--?注冊(cè)服務(wù)?-->??
<service?android:name=".MyService">?
???<intent-filter>?
???<!--??指定調(diào)用AIDL服務(wù)的ID??-->?
???????<action?android:name="net.blogjava.mobile.aidlservice.RemoteService"?/>?
????</intent-filter>?
</service>
為什么要指定調(diào)用AIDL服務(wù)的ID,就是要告訴外界MyService這個(gè)類能夠被別的進(jìn)程訪問,只要?jiǎng)e的進(jìn)程知道這個(gè)ID,正是有了這個(gè)ID,B工程才能找到A工程實(shí)現(xiàn)通信。
說明:AIDL并不需要權(quán)限
B工程:
??????首先我們要將A工程中生成的RemoteService.java文件拷貝到B工程中,在bindService方法中綁定aidl服務(wù)
??????綁定AIDL服務(wù)就是將RemoteService的ID作為intent的action參數(shù)。
??????說明:如果我們單獨(dú)將RemoteService.aidl文件放在一個(gè)包里,那個(gè)在我們將gen目錄下的該包拷貝到B工程中。如果我們將RemoteService.aidl文件和我們的其他類存放在一起,那么我們?cè)?/span>B工程中就要建立相應(yīng)的包,以保證RmoteService.java文件的報(bào)名正確,我們不能修改RemoteService.java文件
???????????bindService(new?Inten("net.blogjava.mobile.aidlservice.RemoteService"),?serviceConnection,?Context.BIND_AUTO_CREATE);?
???????ServiceConnection的onServiceConnected(ComponentName?name,?IBinder?service)方法中的service參數(shù)就是A工程中MyService類中繼承了RemoteService.stub類的內(nèi)部類的對(duì)象。
49.?請(qǐng)解釋下Android程序運(yùn)行時(shí)權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別。
運(yùn)行時(shí)權(quán)限Dalvik(?android授權(quán))?
文件系統(tǒng)?linux?內(nèi)核授權(quán)
50.??系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁(yè)面?請(qǐng)說明原由。
通過直接發(fā)送Uri把參數(shù)帶過去,或者通過manifest里的intentfilter里的data屬性
51.?你如何評(píng)價(jià)Android系統(tǒng)?優(yōu)缺點(diǎn)。
答:Android平臺(tái)手機(jī)?5大優(yōu)勢(shì):?
一、開放性?
在優(yōu)勢(shì)方面,Android平臺(tái)首先就是其開發(fā)性,開發(fā)的平臺(tái)允許任何移動(dòng)終端廠商加入到Android聯(lián)盟中來。顯著的開放性可以使其擁有更多的開發(fā)者,隨著用戶和應(yīng)用的日益豐富,一個(gè)嶄新的平臺(tái)也將很快走向成熟。開放性對(duì)于Android的發(fā)展而言,有利于積累人氣,這里的人氣包括消費(fèi)者和廠商,而對(duì)于消費(fèi)者來講,隨大的受益正是豐富的軟件資源。開放的平臺(tái)也會(huì)帶來更大競(jìng)爭(zhēng),如此一來,消費(fèi)者將可以用更低的價(jià)位購(gòu)得心儀的手機(jī)。
二、掙脫運(yùn)營(yíng)商的束縛?
在過去很長(zhǎng)的一段時(shí)間,特別是在歐美地區(qū),手機(jī)應(yīng)用往往受到運(yùn)營(yíng)商制約,使用什么功能接入什么網(wǎng)絡(luò),幾乎都受到運(yùn)營(yíng)商的控制。從去年iPhone?上市?,用戶可以更加方便地連接網(wǎng)絡(luò),運(yùn)營(yíng)商的制約減少。隨著EDGE、HSDPA這些2G至3G移動(dòng)網(wǎng)絡(luò)的逐步過渡和提升,手機(jī)隨意接入網(wǎng)絡(luò)已不是運(yùn)營(yíng)商口中的笑談,當(dāng)你可以通過手機(jī)IM軟件方便地進(jìn)行即時(shí)聊天時(shí),再回想不久前天價(jià)的彩信和圖鈴下載業(yè)務(wù),是不是像噩夢(mèng)一樣?互聯(lián)網(wǎng)巨頭Google推動(dòng)的Android終端天生就有網(wǎng)絡(luò)特色,將讓用戶離互聯(lián)網(wǎng)更近。
三、豐富的硬件選擇?
這一點(diǎn)還是與Android平臺(tái)的開放性相關(guān),由于Android的開放性,眾多的廠商會(huì)推出千奇百怪,功能特色各具的多種產(chǎn)品。功能上的差異和特色,卻不會(huì)影響到數(shù)據(jù)同步、甚至軟件的兼容,好比你從諾基亞?Symbian風(fēng)格手機(jī)?一下改用蘋果?iPhone?,同時(shí)還可將Symbian中優(yōu)秀的軟件帶到iPhone上使用、聯(lián)系人等資料更是可以方便地轉(zhuǎn)移,是不是非常方便呢?
四、不受任何限制的開發(fā)商?
Android平臺(tái)提供給第三方開發(fā)商一個(gè)十分寬泛、自由的環(huán)境,不會(huì)受到各種條條框框的阻擾,可想而知,會(huì)有多少新穎別致的軟件會(huì)誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如可控制正是留給Android難題之一。
五、無縫結(jié)合的Google應(yīng)用?
如今叱詫互聯(lián)網(wǎng)的Google已經(jīng)走過10年度歷史,從搜索巨人到全面的互聯(lián)網(wǎng)滲透,Google服務(wù)如地圖、郵件、搜索等已經(jīng)成為連接用戶和互聯(lián)網(wǎng)的重要紐帶,而Android平臺(tái)手機(jī)將無縫結(jié)合這些優(yōu)秀的Google服務(wù)。
再說Android的5大不足:
一、安全和隱私?
由于手機(jī)?與互聯(lián)網(wǎng)的緊密聯(lián)系,個(gè)人隱私很難得到保守。除了上網(wǎng)過程中經(jīng)意或不經(jīng)意留下的個(gè)人足跡,Google這個(gè)巨人也時(shí)時(shí)站在你的身后,洞穿一切,因此,互聯(lián)網(wǎng)的深入將會(huì)帶來新一輪的隱私危機(jī)。
二、首先開賣Android手機(jī)的不是最大運(yùn)營(yíng)商?
眾所周知,T-Mobile在23日,于美國(guó)紐約發(fā)布?了Android首款手機(jī)G1。但是在北美市場(chǎng),最大的兩家運(yùn)營(yíng)商乃AT&T和Verizon,而目前所知取得Android手機(jī)銷售權(quán)的僅有?T-Mobile和Sprint,其中T-Mobile的3G網(wǎng)絡(luò)相對(duì)于其他三家也要遜色不少,因此,用戶可以買賬購(gòu)買G1,能否體驗(yàn)到最佳的3G網(wǎng)絡(luò)服務(wù)則要另當(dāng)別論了!
三、運(yùn)營(yíng)商仍然能夠影響到Android手機(jī)?
在國(guó)內(nèi)市場(chǎng),不少用戶對(duì)購(gòu)得移動(dòng)定制機(jī)不滿,感覺所購(gòu)的手機(jī)被人涂畫了廣告一般。這樣的情況在國(guó)外市場(chǎng)同樣出現(xiàn)。Android手機(jī)的另一發(fā)售運(yùn)營(yíng)商Sprint就將在其機(jī)型中內(nèi)置其手機(jī)商店程序。
四、同類機(jī)型用戶減少?
在不少手機(jī)論壇都會(huì)有針對(duì)某一型號(hào)的子論壇,對(duì)一款手機(jī)的使用心得交流,并分享軟件資源。而對(duì)于Android平臺(tái)手機(jī),由于廠商豐富,產(chǎn)品類型多樣,這樣使用同一款機(jī)型的用戶越來越少,缺少統(tǒng)一機(jī)型的程序強(qiáng)化。舉個(gè)稍顯不當(dāng)?shù)睦?#xff0c;現(xiàn)在山寨機(jī)泛濫,品種各異,就很少有專門針對(duì)某個(gè)型號(hào)山寨機(jī)的討論和群組,除了哪些功能異常搶眼、頗受追捧的機(jī)型以外。
五、過分依賴開發(fā)商缺少標(biāo)準(zhǔn)配置?
在使用PC端的Windows?Xp系統(tǒng)的時(shí)候,都會(huì)內(nèi)置微軟Windows?Media?Player這樣一個(gè)瀏覽器程序,用戶可以選擇更多樣的播放器,如Realplay或暴風(fēng)影音等。但入手開始使用默認(rèn)的程序同樣可以應(yīng)付多樣的需要。在?Android平臺(tái)中,由于其開放性,軟件更多依賴第三方廠商,比如Android系統(tǒng)的SDK中就沒有內(nèi)置音樂?播放器,全部依賴第三方開發(fā),缺少了產(chǎn)品的統(tǒng)一性。
52.?什么是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)超過5秒?
意向接受器(intentReceiver)超過10秒鐘仍未執(zhí)行完畢?
Android應(yīng)用程序完全運(yùn)行在一個(gè)獨(dú)立的線程中(例如main)。這就意味著,任何在主線程中運(yùn)行的,需要消耗大量時(shí)間的操作都會(huì)引發(fā)ANR。因?yàn)榇藭r(shí),你的應(yīng)用程序已經(jīng)沒有機(jī)會(huì)去響應(yīng)輸入事件和意向廣播(Intent?broadcast)。?
因此,任何運(yùn)行在主線程中的方法,都要盡可能的只做少量的工作。特別是活動(dòng)生命周期中的重要方法如onCreate()和?onResume()等更應(yīng)如此。潛在的比較耗時(shí)的操作,如訪問網(wǎng)絡(luò)和數(shù)據(jù)庫(kù);或者是開銷很大的計(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)檩斎胧录^5秒鐘不被處理而產(chǎn)生的ANR。這種實(shí)踐需要應(yīng)用到所有顯示用戶界面的線程,因?yàn)樗麄兌济媾R著同樣的超時(shí)問題。?
53.?什么情況會(huì)導(dǎo)致Force?Close??如何避免?能否捕獲導(dǎo)致其的異常??
答:一般像空指針啊,可以看起logcat,然后對(duì)應(yīng)到程序中?來解決錯(cuò)誤?
54.?Android本身的api并未聲明會(huì)拋出異常,則其在運(yùn)行時(shí)有無可能拋出runtime異常,你遇到過嗎?諾有的話會(huì)導(dǎo)致什么問題?如何解決??
55.?簡(jiǎn)要解釋一下activity、?intent?、intent?filter、service、Broadcase、BroadcaseReceiver?
答:一個(gè)activity呈現(xiàn)了一個(gè)用戶可以操作的可視化用戶界面?
一個(gè)service不包含可見的用戶界面,而是在后臺(tái)無限地運(yùn)行?
可以連接到一個(gè)正在運(yùn)行的服務(wù)中,連接后,可以通過服務(wù)中暴露出來的借口與其進(jìn)行通信?
一個(gè)broadcast?receiver是一個(gè)接收廣播消息并作出回應(yīng)的component,broadcast?receiver沒有界面?
intent:content?provider在接收到ContentResolver的請(qǐng)求時(shí)被激活。?
activity,?service和broadcast?receiver是被稱為intents的異步消息激活的。?
一個(gè)intent是一個(gè)Intent對(duì)象,它保存了消息的內(nèi)容。對(duì)于activity和service來說,它指定了請(qǐng)求的操作名稱和待操作數(shù)據(jù)的URI?
Intent對(duì)象可以顯式的指定一個(gè)目標(biāo)component。如果這樣的話,android會(huì)找到這個(gè)component(基于manifest文件中的聲明)并激活它。但如果一個(gè)目標(biāo)不是顯式指定的,android必須找到響應(yīng)intent的最佳component。?
它是通過將Intent對(duì)象和目標(biāo)的intent?filter相比較來完成這一工作的。一個(gè)component的intent?filter告訴android該component能處理的intent。intent?filter也是在manifest文件中聲明的。?
56.? IntentService有何優(yōu)點(diǎn)??
答:IntentService?的好處?
*?Acitivity的進(jìn)程,當(dāng)處理Intent的時(shí)候,會(huì)產(chǎn)生一個(gè)對(duì)應(yīng)的Service?
*?Android的進(jìn)程處理器現(xiàn)在會(huì)盡可能的不kill掉你?
*?非常容易使用?
57.?橫豎屏切換時(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="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法?
如何將SQLite數(shù)據(jù)庫(kù)(dictionary.db文件)與apk文件一起發(fā)布??
解答:可以將dictionary.db文件復(fù)制到Eclipse?Android工程中的res?aw目錄中。所有在res?aw目錄中的文件不會(huì)被壓縮,這樣可以直接提取該目錄中的文件??梢詫?/span>dictionary.db文件復(fù)制到res?aw目錄中?
58.?如何將打開res?aw目錄中的數(shù)據(jù)庫(kù)文件??
解答:在Android中不能直接打開res?aw目錄中的數(shù)據(jù)庫(kù)文件,而需要在程序第一次啟動(dòng)時(shí)將該文件復(fù)制到手機(jī)內(nèi)存或SD卡的某個(gè)目錄中,然后再打開該數(shù)據(jù)庫(kù)文件。復(fù)制的基本方法是使用getResources().openRawResource方法獲得res?aw目錄中資源的?InputStream對(duì)象,然后將該InputStream對(duì)象中的數(shù)據(jù)寫入其他的目錄中相應(yīng)文件中。在Android?SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數(shù)據(jù)庫(kù)文件。?
59.?Android引入廣播機(jī)制的用意??
答:a:從MVC的角度考慮(應(yīng)用程序內(nèi))?
其實(shí)回答這個(gè)問題的時(shí)候還可以這樣問,android為什么要有那4大組件,現(xiàn)在的移動(dòng)開發(fā)模型基本上也是照搬的web那一套MVC架構(gòu),只不過是改了點(diǎn)嫁妝而已。android的四大組件本質(zhì)上就是為了實(shí)現(xiàn)移動(dòng)或者說嵌入式設(shè)備上的MVC架構(gòu),它們之間有時(shí)候是一種相互依存的關(guān)系,有時(shí)候又是一種補(bǔ)充關(guān)系,引入廣播機(jī)制可以方便幾大組件的信息和數(shù)據(jù)交互。?
b:程序間互通消息(例如在自己的應(yīng)用程序內(nèi)監(jiān)聽系統(tǒng)來電)?
c:效率上(參考UDP的廣播協(xié)議在局域網(wǎng)的方便性)?
d:設(shè)計(jì)模式上(反轉(zhuǎn)控制的一種應(yīng)用,類似監(jiān)聽者模式)
60.?Android?dvm的進(jìn)程和Linux的進(jìn)程,?應(yīng)用程序的進(jìn)程是否為同一個(gè)概念?
DVM指dalivk的虛擬機(jī)。每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。而每一個(gè)DVM都是在Linux?中的一個(gè)進(jìn)程,所以說可以認(rèn)為是同一個(gè)概念。?
61.?sim卡的EF?文件有何作用?
sim卡的文件系統(tǒng)有自己規(guī)范,主要是為了和手機(jī)通訊,sim本?身可以有自己的操作系統(tǒng),EF就是作存儲(chǔ)并和手機(jī)通訊用的?
62.?嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,?各有何特性?
頁(yè)式,段式,段頁(yè),用到了MMU,虛擬空間等技術(shù)?
63.??什么是嵌入式實(shí)時(shí)操作系統(tǒng),?Android?操作系統(tǒng)屬于實(shí)時(shí)操作系統(tǒng)嗎??
嵌入式實(shí)時(shí)操作系統(tǒng)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時(shí),能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時(shí)間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)。主要用于工業(yè)控制、?軍事設(shè)備、?航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時(shí)間有苛刻的要求,這就需要使用實(shí)時(shí)系統(tǒng)。又可分為軟實(shí)時(shí)和硬實(shí)時(shí)兩種,而android是基于linux內(nèi)核的,因此屬于軟實(shí)時(shí)。?
64.?一條最長(zhǎng)的短信息約占多少byte??
中文70(包括標(biāo)點(diǎn)),英文160,160個(gè)字節(jié)。?
65.?android中的動(dòng)畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么??
兩種,一種是Tween動(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),類似電影。?
66.?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。?
67.?說說mvc模式的原理,它在android中的運(yùn)用?
MVC(Model_view_contraller)”模型_視圖_控制器”。?MVC應(yīng)用程序總是由這三個(gè)部分組成。Event(事件)導(dǎo)致Controller改變Model或View,或者同時(shí)改變兩者。只要?Controller改變了Models的數(shù)據(jù)或者屬性,所有依賴的View都會(huì)自動(dòng)更新。類似的,只要Contro?
68.?DDMS和TraceView的區(qū)別??
DDMS是一個(gè)程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器?。
69.?java中如何引用本地語(yǔ)言?
可以用JNI(java?native?interface??java?本地接口)接口?。
70.?談?wù)?span style="font-family:'Times New Roman'">Android的IPC(進(jìn)程間通信)機(jī)制?
IPC是內(nèi)部進(jìn)程通信的簡(jiǎn)稱,?是共享"命名管道"的資源。Android中的IPC機(jī)制是為了讓Activity和Service之間可以隨時(shí)的進(jìn)行交互,故在Android中該機(jī)制,只適用于Activity和Service之間的通信,類似于遠(yuǎn)程方法調(diào)用,類似于C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實(shí)現(xiàn)IPC接口,Client端調(diào)用IPC接口本地代理。
71.?NDK是什么
NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發(fā)者迅速的開發(fā)C/C++的動(dòng)態(tài)庫(kù),并能自動(dòng)將so和java?應(yīng)用打成apk包。
NDK集成了交叉編譯器,并提供了相應(yīng)的mk文件和隔離cpu、平臺(tái)等的差異,開發(fā)人員只需簡(jiǎn)單的修改mk文件就可以創(chuàng)建出so
總結(jié)
以上是生活随笔為你收集整理的android最全面试题71道题 详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android面试题总结加强
- 下一篇: 我的android面试经历