Android面试题总结加强再加强版(三)
http://blog.csdn.net/superjunjin/article/details/7860025
26.如果后臺(tái)的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?
當(dāng)你的程序中某一個(gè)Activity?A?在運(yùn)行時(shí)中,主動(dòng)或被動(dòng)地運(yùn)行另一個(gè)新的Activity?B?
這個(gè)時(shí)候A會(huì)執(zhí)行
Java代碼
public?void?onSaveInstanceState(Bundle?outState)?{???
? ? ? super.onSaveInstanceState(outState);????
? ? ? outState.putLong("id",?1234567890);
}??
?
B?完成以后又會(huì)來找A,?這個(gè)時(shí)候就有兩種情況,一種是A被回收,一種是沒有被回收,被回
收的A就要重新調(diào)用onCreate()方法,不同于直接啟動(dòng)的是這回onCreate()里是帶上參數(shù)savedInstanceState,沒被收回的就還是onResume就好了。
savedInstanceState是一個(gè)Bundle對象,你基本上可以把他理解為系統(tǒng)幫你維護(hù)的一個(gè)Map對象。在onCreate()里你可能會(huì)?用到它,如果正常啟動(dòng)onCreate就不會(huì)有它,所以用的時(shí)候要判斷一下是否為空。
Java代碼
if(savedInstanceState?!=?null){??
?????long?id?=?savedInstanceState.getLong("id");??
}??
就像官方的Notepad教程?里的情況,你正在編輯某一個(gè)note,突然被中斷,那么就把這個(gè)note的id記住,再起來的時(shí)候就可以根據(jù)這個(gè)id去把那個(gè)note取出來,程序就完整?一些。這也是看你的應(yīng)用需不需要保存什么,比如你的界面就是讀取一個(gè)列表,那就不需要特殊記住什么,哦,?沒準(zhǔn)你需要記住滾動(dòng)條的位置...
27.如何退出Activity
對于單一Activity的應(yīng)用來說,退出很簡單,直接finish()即可。當(dāng)然,也可以用killProcess()和System.exit()這樣的方法。現(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基類,處理這些共通問題。
28.請解釋下在單線程模型中Message、Handler、Message?Queue、Looper之間的關(guān)系。
答:簡單的說,Handler獲取當(dāng)前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進(jìn)行Message的分發(fā)和處理.
Message Queue(消息隊(duì)列):用來存放通過Handler發(fā)布的消息,通常附屬于某一個(gè)創(chuàng)建它的線程,可以通過Looper.myQueue()得到當(dāng)前線程的消息隊(duì)列
Handler:可以發(fā)布或者處理一個(gè)消息或者操作一個(gè)Runnable,通過Handler發(fā)布消息,消息將只會(huì)發(fā)送到與它關(guān)聯(lián)的消息隊(duì)列,然也只能處理該消息隊(duì)列中的消息
Looper:是Handler和消息隊(duì)列之間通訊橋梁,程序組件首先通過Handler把消息傳遞給Looper,Looper把消息放入隊(duì)列。Looper也把消息隊(duì)列里的消息廣播給所有的
Handler:Handler接受到消息后調(diào)用handleMessage進(jìn)行處理
Message:消息的類型,在Handler類中的handleMessage方法中得到單個(gè)的消息進(jìn)行處理
在單線程模型下,為了線程通信問題,Android設(shè)計(jì)了一個(gè)Message Queue(消息隊(duì)列), 線程間可以通過該Message Queue并結(jié)合Handler和Looper組件進(jìn)行信息交換。下面將對它們進(jìn)行分別介紹:
1. Message
????Message消息,理解為線程間交流的信息,處理數(shù)據(jù)后臺(tái)線程需要更新UI,則發(fā)送Message內(nèi)含一些數(shù)據(jù)給UI線程。
2. Handler
????Handler處理者,是Message的主要處理者,負(fù)責(zé)Message的發(fā)送,Message內(nèi)容的執(zhí)行處理。后臺(tái)線程就是通過傳進(jìn)來的 Handler對象引用來sendMessage(Message)。而使用Handler,需要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操作內(nèi)容,例如Update UI。通常需要子類化Handler來實(shí)現(xiàn)handleMessage方法。
3. Message Queue
????Message Queue消息隊(duì)列,用來存放通過Handler發(fā)布的消息,按照先進(jìn)先出執(zhí)行。
??? 每個(gè)message queue都會(huì)有一個(gè)對應(yīng)的Handler。Handler會(huì)向messagequeue通過兩種方法發(fā)送消息:sendMessage或post。這兩種消息都會(huì)插在message queue隊(duì)尾并按先進(jìn)先出執(zhí)行。但通過這兩種方法發(fā)送的消息執(zhí)行的方式略有不同:通過sendMessage發(fā)送的是一個(gè)message對象,會(huì)被 Handler的handleMessage()函數(shù)處理;而通過post方法發(fā)送的是一個(gè)runnable對象,則會(huì)自己執(zhí)行。
4. Looper
????Looper是每條線程里的Message Queue的管家。Android沒有Global的MessageQueue,而Android會(huì)自動(dòng)替主線程(UI線程)建立Message Queue,但在子線程里并沒有建立Message Queue。所以調(diào)用Looper.getMainLooper()得到的主線程的Looper不為NULL,但調(diào)用Looper.myLooper()得到當(dāng)前線程的Looper就有可能為NULL。對于子線程使用Looper,API Doc提供了正確的使用方法:這個(gè)Message機(jī)制的大概流程:
??? 1. 在Looper.loop()方法運(yùn)行開始后,循環(huán)地按照接收順序取出Message Queue里面的非NULL的Message。
??? 2. 一開始Message Queue里面的Message都是NULL的。當(dāng)Handler.sendMessage(Message)到Message Queue,該函數(shù)里面設(shè)置了那個(gè)Message對象的target屬性是當(dāng)前的Handler對象。隨后Looper取出了那個(gè)Message,則調(diào)用 該Message的target指向的Hander的dispatchMessage函數(shù)對Message進(jìn)行處理。在dispatchMessage方法里,如何處理Message則由用戶指定,三個(gè)判斷,優(yōu)先級從高到低:
??? 1) Message里面的Callback,一個(gè)實(shí)現(xiàn)了Runnable接口的對象,其中run函數(shù)做處理工作;
??? 2) Handler里面的mCallback指向的一個(gè)實(shí)現(xiàn)了Callback接口的對象,由其handleMessage進(jìn)行處理;
??? 3) 處理消息Handler對象對應(yīng)的類繼承并實(shí)現(xiàn)了其中handleMessage函數(shù),通過這個(gè)實(shí)現(xiàn)的handleMessage函數(shù)處理消息。
??? 由此可見,我們實(shí)現(xiàn)的handleMessage方法是優(yōu)先級最低的!
??? 3. Handler處理完該Message (updateUI) 后,Looper則設(shè)置該Message為NULL,以便回收!
??? 在網(wǎng)上有很多文章講述主線程和其他子線程如何交互,傳送信息,最終誰來執(zhí)行處理信息之類的,個(gè)人理解是最簡單的方法——判斷Handler對象里面的Looper對象是屬于哪條線程的,則由該線程來執(zhí)行!
??? 1. 當(dāng)Handler對象的構(gòu)造函數(shù)的參數(shù)為空,則為當(dāng)前所在線程的Looper;
? ? 2. Looper.getMainLooper()得到的是主線程的Looper對象,Looper.myLooper()得到的是當(dāng)前線程的Looper對象。
29.你如何評價(jià)Android系統(tǒng)?優(yōu)缺點(diǎn)。
答:Android平臺(tái)手機(jī) 5大優(yōu)勢:
一、開放性
在優(yōu)勢方面,Android平臺(tái)首先就是其開發(fā)性,開發(fā)的平臺(tái)允許任何移動(dòng)終端廠商加入到Android聯(lián)盟中來。顯著的開放性可以使其擁有更多的開發(fā)者,隨著用戶和應(yīng)用的日益豐富,一個(gè)嶄新的平臺(tái)也將很快走向成熟。開放性對于Android的發(fā)展而言,有利于積累人氣,這里的人氣包括消費(fèi)者和廠商,而對于消費(fèi)者來講,隨大的受益正是豐富的軟件資源。開放的平臺(tái)也會(huì)帶來更大競爭,如此一來,消費(fèi)者將可以用更低的價(jià)位購得心儀的手機(jī)。
二、掙脫運(yùn)營商的束縛
在過去很長的一段時(shí)間,特別是在歐美地區(qū),手機(jī)應(yīng)用往往受到運(yùn)營商制約,使用什么功能接入什么網(wǎng)絡(luò),幾乎都受到運(yùn)營商的控制。從去年iPhone 上市 ,用戶可以更加方便地連接網(wǎng)絡(luò),運(yùn)營商的制約減少。隨著EDGE、HSDPA這些2G至3G移動(dòng)網(wǎng)絡(luò)的逐步過渡和提升,手機(jī)隨意接入網(wǎng)絡(luò)已不是運(yùn)營商口中的笑談,當(dāng)你可以通過手機(jī)IM軟件方便地進(jìn)行即時(shí)聊天時(shí),再回想不久前天價(jià)的彩信和圖鈴下載業(yè)務(wù),是不是像噩夢一樣?互聯(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)營商
眾所周知,T-Mobile在23日,于美國紐約發(fā)布 了Android首款手機(jī)G1。但是在北美市場,最大的兩家運(yùn)營商乃AT&T和Verizon,而目前所知取得Android手機(jī)銷售權(quán)的僅有 T-Mobile和Sprint,其中T-Mobile的3G網(wǎng)絡(luò)相對于其他三家也要遜色不少,因此,用戶可以買賬購買G1,能否體驗(yàn)到最佳的3G網(wǎng)絡(luò)服務(wù)則要另當(dāng)別論了!
三、運(yùn)營商仍然能夠影響到Android手機(jī)
在國內(nèi)市場,不少用戶對購得移動(dòng)定制機(jī)不滿,感覺所購的手機(jī)被人涂畫了廣告一般。這樣的情況在國外市場同樣出現(xiàn)。Android手機(jī)的另一發(fā)售運(yùn)營商Sprint就將在其機(jī)型中內(nèi)置其手機(jī)商店程序。
四、同類機(jī)型用戶減少
在不少手機(jī)論壇都會(huì)有針對某一型號(hào)的子論壇,對一款手機(jī)的使用心得交流,并分享軟件資源。而對于Android平臺(tái)手機(jī),由于廠商豐富,產(chǎn)品類型多樣,這樣使用同一款機(jī)型的用戶越來越少,缺少統(tǒng)一機(jī)型的程序強(qiáng)化。舉個(gè)稍顯不當(dāng)?shù)睦?#xff0c;現(xiàn)在山寨機(jī)泛濫,品種各異,就很少有專門針對某個(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)一性。
30.談?wù)?span style="font-family:'Times New Roman'">android數(shù)據(jù)存儲(chǔ)方式。
Android提供了5種方式存儲(chǔ)數(shù)據(jù):
(1)使用SharedPreferences存儲(chǔ)數(shù)據(jù);它是Android提供的用來存儲(chǔ)一些簡單配置信息的一種機(jī)制,采用了XML格式將數(shù)據(jù)存儲(chǔ)到設(shè)備中。只能在同一個(gè)包內(nèi)使用,不能在不同的包之間使用。
(2)文件存儲(chǔ)數(shù)據(jù);文件存儲(chǔ)方式是一種較常用的方法,在Android中讀取/寫入文件的方法,與Java中實(shí)現(xiàn)I/O的程序是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取設(shè)備上的文件。
(3)SQLite數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù);SQLite是Android所帶的一個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)庫,它支持SQL語句,它是一個(gè)輕量級的嵌入式數(shù)據(jù)庫。
(4)使用ContentProvider存儲(chǔ)數(shù)據(jù);主要用于應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換,從而能夠讓其他的應(yīng)用保存或讀取此Content?Provider的各種數(shù)據(jù)類型。
(5)網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù);通過網(wǎng)絡(luò)上提供給我們的存儲(chǔ)空間來上傳(存儲(chǔ))和下載(獲取)我們存儲(chǔ)在網(wǎng)絡(luò)空間中的數(shù)據(jù)信息。
31.?Android中Activity,?Intent,?Content?Provider,?Service各有什么區(qū)別。
Activity:?活動(dòng),是最基本的android應(yīng)用程序組件。一個(gè)活動(dòng)就是一個(gè)用戶可以操作的可視化用戶界面,每一個(gè)活動(dòng)都被實(shí)現(xiàn)為一個(gè)獨(dú)立的類,并且從活動(dòng)基類繼承而來。
Intent:?意圖,描述應(yīng)用想干什么。最重要的部分是動(dòng)作和動(dòng)作對應(yīng)的數(shù)據(jù)。
Content?Provider:內(nèi)容提供器,android應(yīng)用程序能夠?qū)⑺鼈兊臄?shù)據(jù)保存到文件、SQLite數(shù)據(jù)庫中,甚至是任何有效的設(shè)備中。當(dāng)你想將你的應(yīng)用數(shù)據(jù)和其他應(yīng)用共享時(shí),內(nèi)容提供器就可以發(fā)揮作用了。
Service:服務(wù),具有一段較長生命周期且沒有用戶界面的程序組件。
32.View,?surfaceView,?GLSurfaceView有什么區(qū)別。
view是最基礎(chǔ)的,必須在UI主線程內(nèi)更新畫面,速度較慢。
SurfaceView?是view的子類,類似使用雙緩機(jī)制,在新的線程中更新畫面所以刷新界面速度比view快
GLSurfaceView?是SurfaceView的子類,opengl?專用的
33.Manifest.xml文件中主要包括哪些信息?
manifest:根節(jié)點(diǎn),描述了package中所有的內(nèi)容。
uses-permission:請求你的package正常運(yùn)作所需賦予的安全許可。
permission:?聲明了安全許可來限制哪些程序能你package中的組件和功能。
instrumentation:聲明了用來測試此package或其他package指令組件的代碼。
application:包含package中application級別組件聲明的根節(jié)點(diǎn)。
activity:Activity是用來與用戶交互的主要工具。
receiver:IntentReceiver能使的application獲得數(shù)據(jù)的改變或者發(fā)生的操作,即使它當(dāng)前不在運(yùn)行。
service:Service是能在后臺(tái)運(yùn)行任意時(shí)間的組件。
provider:ContentProvider是用來管理持久化數(shù)據(jù)并發(fā)布給其他應(yīng)用程序使用的組件。
34.根據(jù)自己的理解描述下Android數(shù)字簽名。
(1)所有的應(yīng)用程序都必須有數(shù)字證書,Android系統(tǒng)不會(huì)安裝一個(gè)沒有數(shù)字證書的應(yīng)用程序
(2)Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個(gè)權(quán)威的數(shù)字證書機(jī)構(gòu)簽名認(rèn)證
(3)如果要正式發(fā)布一個(gè)Android程序,必須使用一個(gè)合適的私鑰生成的數(shù)字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書來發(fā)布。
(4)數(shù)字證書都是有有效期的,Android只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過期也不會(huì)影響程序的正常功能。
35.?AIDL的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)?
AIDL全稱Android?Interface?Definition?Language(Android接口描述語言)是一種借口描述語言;?編譯器可以通過aidl文件生成一段代碼,通過預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程跨界對象訪問的目的.AIDL的IPC的機(jī)制和COM或CORBA類似,?是基于接口的,但它是輕量級的。它使用代理類在客戶端和實(shí)現(xiàn)層間傳遞值.?如果要使用AIDL,?需要完成2件事情:?1.?引入AIDL的相關(guān)類.;?2.?調(diào)用aidl產(chǎn)生的class.理論上,?參數(shù)可以傳遞基本數(shù)據(jù)類型和String,?還有就是Bundle的派生類,?不過在Eclipse中,目前的ADT不支持Bundle做為參數(shù),
具體實(shí)現(xiàn)步驟如下:
1、創(chuàng)建AIDL文件,?在這個(gè)文件里面定義接口,?該接口定義了可供客戶端訪問的方法和屬性。
2、編譯AIDL文件,?用Ant的話,?可能需要手動(dòng),?使用Eclipse?plugin的話,可以根據(jù)adil文件自動(dòng)生產(chǎn)java文件并編譯,?不需要人為介入.
3、在Java文件中,?實(shí)現(xiàn)AIDL中定義的接口.?編譯器會(huì)根據(jù)AIDL接口,?產(chǎn)生一個(gè)JAVA接口。這個(gè)接口有一個(gè)名為Stub的內(nèi)部抽象類,它繼承擴(kuò)展了接口并實(shí)現(xiàn)了遠(yuǎn)程調(diào)用需要的幾個(gè)方法。接下來就需要自己去實(shí)現(xiàn)自定義的幾個(gè)接口了.
4、向客戶端提供接口ITaskBinder,?如果寫的是service,擴(kuò)展該Service并重載onBind?()方法來返回一個(gè)實(shí)現(xiàn)上述接口的類的實(shí)例。
5、在服務(wù)器端回調(diào)客戶端的函數(shù).?前提是當(dāng)客戶端獲取的IBinder接口的時(shí)候,要去注冊回調(diào)函數(shù),?只有這樣,?服務(wù)器端才知道該調(diào)用那些函數(shù)
AIDL語法很簡單,可以用來聲明一個(gè)帶一個(gè)或多個(gè)方法的接口,也可以傳遞參數(shù)和返回值。?由于遠(yuǎn)程調(diào)用的需要,?這些參數(shù)和返回值并不是任何類型.下面是些AIDL支持的數(shù)據(jù)類型:
1.?不需要import聲明的簡單Java編程語言類型(int,boolean等)
2.?String,?CharSequence不需要特殊聲明
3.?List,?Map和Parcelables類型,?這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡單數(shù)據(jù)類型,?String等其他比支持的類型.
(另外:?我沒嘗試Parcelables,?在Eclipse+ADT下編譯不過,?或許以后會(huì)有所支持).
實(shí)現(xiàn)接口時(shí)有幾個(gè)原則:
.拋出的異常不要返回給調(diào)用者.?跨進(jìn)程拋異常處理是不可取的.
.IPC調(diào)用是同步的。如果你知道一個(gè)IPC服務(wù)需要超過幾毫秒的時(shí)間才能完成地話,你應(yīng)該避免在Activity的主線程中調(diào)用。也就是IPC調(diào)用會(huì)掛起應(yīng)用程序?qū)е陆缑媸ロ憫?yīng).?這種情況應(yīng)該考慮單起一個(gè)線程來處理.
.不能在AIDL接口中聲明靜態(tài)屬性。
IPC的調(diào)用步驟:
1.?聲明一個(gè)接口類型的變量,該接口類型在.aidl文件中定義。
2.?實(shí)現(xiàn)ServiceConnection。
3.?調(diào)用ApplicationContext.bindService(),并在ServiceConnection實(shí)現(xiàn)中進(jìn)行傳遞.
4.?在ServiceConnection.onServiceConnected()實(shí)現(xiàn)中,你會(huì)接收一個(gè)IBinder實(shí)例(被調(diào)用的Service).?調(diào)用
YourInterfaceName.Stub.asInterface((IBinder)service)將參數(shù)轉(zhuǎn)換為YourInterface類型。
5.?調(diào)用接口中定義的方法。你總要檢測到DeadObjectException異常,該異常在連接斷開時(shí)被拋出。它只會(huì)被遠(yuǎn)程方法拋出。
6.?斷開連接,調(diào)用接口實(shí)例中的ApplicationContext.unbindService()
參考:http://buaadallas.blog.51cto.com/399160/372090
36.android:gravity與android:layout_gravity的區(qū)別
LinearLayout有兩個(gè)非常相似的屬性:android:gravity與android:layout_gravity。他們的區(qū)別在?于:android:gravity用于設(shè)置View組件的對齊方式,而android:layout_gravity用于設(shè)置Container組件的?對齊方式。
舉個(gè)例子,我們可以通過設(shè)置android:gravity="center"來讓EditText中的文字在EditText組件中居中顯示;同?時(shí)我們設(shè)置EditText的android:layout_gravity="right"來讓EditText組件在LinearLayout中居右 顯示。來實(shí)踐以下:
正如我們所看到的,在EditText中,其中的文字已經(jīng)居中顯示了,而EditText組件自己也對齊到了LinearLayout的右側(cè)。
[html]?view plaincopy
38.?注冊廣播接收者兩種方式的區(qū)別,及優(yōu)缺點(diǎn)
答:首先寫一個(gè)類要繼承BroadcastReceiver
第一種:在清單文件中聲明,添加
<receiveandroid:name=".IncomingSMSReceiver " >
<intent-filter>
?? <actionandroid:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
第二種使用代碼進(jìn)行注冊如:
IntentFilterfilter =? newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiverreceiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);
兩種注冊類型的區(qū)別是:
1)第一種是常駐型(靜態(tài)注冊),也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行。
2)第二種不是常駐型廣播(動(dòng)態(tài)注冊),也就是說廣播跟隨程序的生命周期。
注冊的方法有兩種,一種是靜態(tài)注冊,一種是動(dòng)態(tài)注冊。
動(dòng)態(tài)注冊優(yōu)點(diǎn):在 Android 的廣播機(jī)制中,動(dòng)態(tài)注冊的優(yōu)先級是要高于靜態(tài)注冊優(yōu)先級的,因此在必要的情況下,我們是需要?jiǎng)討B(tài)注冊廣播接收器的。
39.Dalvik基于JVM的改進(jìn)
1.幾個(gè)class變?yōu)橐粋€(gè)dex,constant?pool,省內(nèi)存
2.Zygote,copy-on-write?shared,省內(nèi)存,省cpu,省電
3.基于寄存器的bytecode,省指令,省cpu,省電
4.Trace-based?JIT,省cpu,省電,省內(nèi)存
40.android中有哪幾種解析xml的類,官方推薦哪種?以及它們的原理和區(qū)別.
??DOM解析
????優(yōu)點(diǎn):
1.XML樹在內(nèi)存中完整存儲(chǔ),因此可以直接修改其數(shù)據(jù)和結(jié)構(gòu).?
2.可以通過該解析器隨時(shí)訪問XML樹中的任何一個(gè)節(jié)點(diǎn).?
3.DOM解析器的API在使用上也相對比較簡單.
缺點(diǎn):如果XML文檔體積比較大時(shí),將文檔讀入內(nèi)存是非常消耗系統(tǒng)資源的.
使用場景:DOM?是用與平臺(tái)和語言無關(guān)的方式表示?XML?文檔的官方?W3C?標(biāo)準(zhǔn).DOM?是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)的集合.這個(gè)層次結(jié)構(gòu)允許開發(fā)人員在樹中尋找特定信息.分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能進(jìn)行任何工作.DOM是基于對象層次結(jié)構(gòu)的.
??SAX解析
優(yōu)點(diǎn):
SAX?對內(nèi)存的要求比較低,因?yàn)樗岄_發(fā)人員自己來決定所要處理的標(biāo)簽.特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX?這種擴(kuò)展能力得到了更好的體現(xiàn).
缺點(diǎn):
用SAX方式進(jìn)行XML解析時(shí),需要順序執(zhí)行,所以很難訪問到同一文檔中的不同數(shù)據(jù).此外,在基于該方式的解析編碼過程也相對復(fù)雜.
使用場景:
對于含有數(shù)據(jù)量十分巨大,而又不用對文檔的所有數(shù)據(jù)進(jìn)行遍歷或者分析的時(shí)候,使用該方法十分有效.該方法不用將整個(gè)文檔讀入內(nèi)存,而只需讀取到程序所需的文檔標(biāo)簽處即可.
??Xmlpull解析
android?SDK提供了xmlpull?api,xmlpull和sax類似,是基于流(stream)操作文件,然后根據(jù)節(jié)點(diǎn)事件回調(diào)開發(fā)者編寫的處理程序.因?yàn)槭腔诹鞯奶幚?因此xmlpull和sax都比較節(jié)約內(nèi)存資源,不會(huì)象dom那樣要把所有節(jié)點(diǎn)以對橡樹的形式展現(xiàn)在內(nèi)存中.xmlpull比sax更簡明,而且不需要掃描完整個(gè)流.
41.Android系統(tǒng)中GC什么情況下會(huì)出現(xiàn)內(nèi)存泄露呢?
出現(xiàn)情況:
1.?數(shù)據(jù)庫的cursor沒有關(guān)閉
2.構(gòu)造adapter時(shí),沒有使用緩存contentview
???衍生listview的優(yōu)化問題-----減少創(chuàng)建view的對象,充分使用contentview,可以使用一靜態(tài)類來優(yōu)化處理getview的過程
3.Bitmap對象不使用時(shí)采用recycle()釋放內(nèi)存
4.activity中的對象的生命周期大于activity
調(diào)試方法:?DDMS==>?HEAPSZIE==>dataobject==>[Total?Size]
42.談?wù)剬?span style="font-family:'Times New Roman'">Android?NDK的理解
NDK全稱:Native Development Kit。 1、NDK是一系列工具的集合。 * NDK提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C++)的動(dòng)態(tài)庫,并能自動(dòng)將so和java應(yīng)用一起打包成apk。這些工具對開發(fā)者的幫助是巨大的。 * NDK集成了 交叉編譯器 ,并提供了相應(yīng)的mk文件隔離CPU、平臺(tái)、ABI等差異,開發(fā)人員只需要簡單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。 * NDK可以自動(dòng)地將so和Java應(yīng)用一起打包,極大地減輕了開發(fā)人員的打包工作。 2、NDK提供了一份穩(wěn)定、功能有限的API頭文件聲明。 Google明確聲明該API是穩(wěn)定的,在后續(xù)所有版本中都穩(wěn)定支持當(dāng)前發(fā)布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標(biāo)準(zhǔn)庫(libc)、標(biāo)準(zhǔn)數(shù)學(xué)庫(libm)、壓縮庫(libz)、Log庫(liblog)。總結(jié)
以上是生活随笔為你收集整理的Android面试题总结加强再加强版(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android面试题总结加强版(二)
- 下一篇: 微信企业号开发之如何建立连接