第一篇:Android面試題總結(jié)
Android面試題總結(jié)
1.簡(jiǎn)述Activity的生命周期?
1)Activity的生命周期通過(guò)7個(gè)生命周期方法onCreate(),onRestart(), onStart(), onResume(), onPause(),onStop(),onDestroy()來(lái)體現(xiàn)。2)其中6個(gè)生命周期方法是成對(duì)對(duì)應(yīng)起來(lái)的,哪里創(chuàng)建的對(duì)象,一般應(yīng)該在其對(duì)應(yīng)的方法中銷毀。
onCreate()--onDestroy()onStart()--onStop()onResume()--onPause()3)當(dāng)程序啟動(dòng)之后,第一個(gè)Activity經(jīng)過(guò)的生命周期方法是:onCreate()→onStart()→ onResume()方法,當(dāng)?shù)谝粋€(gè)Activity A啟動(dòng)第二個(gè)Activity B的時(shí)候(備注:第二個(gè)Activity完全遮蓋住第一個(gè)Activity,并且這個(gè)過(guò)程中沒(méi)有出現(xiàn)點(diǎn)擊Home鍵,或者第一個(gè)Activity被殺死等異常情況,并且兩個(gè)Activity的啟動(dòng)模式是標(biāo)準(zhǔn)模式),這兩個(gè)Activity經(jīng)歷的生命周期方法是:
A onPause()→ B onCreate()→ B onStart()→ B onResume()→ A onStop()→(此時(shí)Activity A已經(jīng)在回退棧的最低端,Activity B已經(jīng)在Activity A的上面,在回退棧的最頂端)當(dāng)通過(guò)點(diǎn)擊后退鍵退出Activity B的時(shí)候:
(此時(shí)Activity B 彈出回退棧)→ B onPause()→ A onRestart()→ A onStart()→ A onResume()→ B onStop()→ B onDestroy()此時(shí)B 被銷毀
2.簡(jiǎn)述Service的生命周期?
1).如果在Activity中通過(guò)調(diào)用startService()方法啟動(dòng)一個(gè)Service的話,那么生命周期是:
onCreate()→ onStartCommand()→ 運(yùn)行中 →(如果自己或者客戶端(如Activity)調(diào)用了stop Service的方法的話)→ onDestroy()2).如果在Activity中通過(guò)調(diào)用bindService()方法啟動(dòng)一個(gè)Service的話,那么生命周期是:
onCreate()→ onBind()→ 運(yùn)行中 →(如果有客戶端(Activity)調(diào)用了unBindService()方法與Service解除綁定時(shí))→ onUnbind()→ onDestroy()3.有幾種控件布局的方式?
1)RelativeLayout:相對(duì)布局,可以根據(jù)相對(duì)位置來(lái)調(diào)整控件的位置。推薦使用相對(duì)布局,更利于屏幕的自適應(yīng)。2)LinearLayout:線性布局,控件之間的水平排列或者垂直排列。但是如果要想構(gòu)建復(fù)雜布局,要進(jìn)行多層的LinearLayout布局嵌套,但是這樣會(huì)運(yùn)行布局載入效率。
3)FrameLayout:幀布局,控件與控件之間處于上下疊加的狀態(tài)。
備注:還有兩個(gè)已經(jīng)不怎么用的布局:TableLayout:表格布局 AbsoluteLayout 絕對(duì)布局。
布局實(shí)現(xiàn)方式有兩種:xml文件靜態(tài)實(shí)現(xiàn),代碼動(dòng)態(tài)實(shí)現(xiàn)。
一般xml文件中可以實(shí)現(xiàn)布局控制的話,就不建議放在代碼中實(shí)現(xiàn)布局控制,因?yàn)樵趚ml文件中實(shí)現(xiàn)布局控制,可以做到布局與代碼分離。4.有幾種數(shù)據(jù)存儲(chǔ)方式,分別是什么? 1)SQLite數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。
2)文件存儲(chǔ):分為內(nèi)部存儲(chǔ)和外部存儲(chǔ)(SD卡)兩種存儲(chǔ)方式。3)SharedPreferences共享參數(shù),鍵值對(duì)形式存儲(chǔ)。4)網(wǎng)絡(luò)存儲(chǔ)。
5.IntentService與Service有什么區(qū)別? IntentService是Service的子類
1)Service如果要處理異步請(qǐng)求(如耗時(shí)操作)的話,需要自己?jiǎn)?dòng)一個(gè)worker thread,如果啟動(dòng)多個(gè)worker thread來(lái)處理相關(guān)事務(wù)的話,各線程之間無(wú)法很好的控制。而IntentService可以將多個(gè)異步請(qǐng)求的Intent放入隊(duì)列中,封裝了一個(gè)開(kāi)啟worker thread的onHandleIntent()方法,來(lái)依次處理放入隊(duì)列中的Intent,只有一個(gè)worker thread在運(yùn)行,同一時(shí)刻只有一個(gè)Intent被處理,當(dāng)一個(gè)Intent處理完了之后才會(huì)處理另外一個(gè)Intent。
2)Service可以通過(guò)startService()或者bindService()方法來(lái)啟動(dòng),而IntentService則是通過(guò)startService()方法來(lái)啟動(dòng)。3)Service適合多線程處理異步請(qǐng)求。而IntentService則適合處理需要排隊(duì)的請(qǐng)求。
6.StartService與bindService之間的區(qū)別?
1)StartService啟動(dòng)了Service之后無(wú)法與Activity之間進(jìn)行通信,與現(xiàn)有的Activity分離,即使Activity被殺掉了之后,Service還可以運(yùn)行,同時(shí)通過(guò)設(shè)置Service的粘性,還可以讓Service被殺掉之后,可以自啟動(dòng)。而bindService啟動(dòng)Service之后,與綁定的Activity之間有關(guān)系,可以依據(jù)Server/Client模式來(lái)進(jìn)行通信(binder客戶端主動(dòng)請(qǐng)求模式,或者通過(guò)信使),但是無(wú)法設(shè)置Serrvice的粘性。2)StartService啟動(dòng)的Service,Activity中可以調(diào)用stopService()方法來(lái)結(jié)束一個(gè)Service,或者通過(guò)Service自己調(diào)用stopSelf()方法來(lái)結(jié)束Service。而bindService只能通過(guò)Activity()來(lái)調(diào)用unbindService()方法來(lái)結(jié)束Service,Service會(huì)調(diào)用onUnBind()方法,以及onDestroy()方法。
7.ArrayAdapter BaseAdapter CursorAdapter的區(qū)別?
ArrayAdpter CursorAdapter都是BaseAdapter的子類。都是用來(lái)填充那些含有item的控件。
1)主要區(qū)別是數(shù)據(jù)來(lái)源不同。ArrayAdapter數(shù)據(jù)來(lái)源是Object數(shù)組,CursorAdapter數(shù)據(jù)來(lái)源是數(shù)據(jù)庫(kù)的Cursor,而BaseAdapter適合創(chuàng)建復(fù)雜自定義的item內(nèi)容,通過(guò)繼承BaseAdapter類,重寫相關(guān)方法來(lái)實(shí)現(xiàn)。
8.Handler與Looper之間的關(guān)系? 1)Handler和Looper的關(guān)系就好比,坐地鐵過(guò)安檢時(shí)候:每一個(gè)人可以理解為一個(gè)Handler,一個(gè)人的一個(gè)或者多個(gè)東西看做Message而循環(huán)滾動(dòng)的檢查臺(tái)裝置可以看做是Looper,而要檢查的東西排成隊(duì)列可以理解為MessageQueue消息隊(duì)列。
2)Looper是Handler和MessageQuene之間的橋梁,Looper將Handler發(fā)送過(guò)的消息放入MessageQueue,同時(shí)Looper也將MessageQueue中的Message發(fā)送給Handler來(lái)處理。
9.res文件夾與assets文件夾有什么區(qū)別? 1)res文件夾中的資源在會(huì)在R.java文件中生成ID,代碼中可以直接通過(guò)R.id的形式來(lái)訪問(wèn)。而assets文件夾中的資源不會(huì)在R.java文件中生成ID,需要通過(guò)AssetsManager通過(guò)IO流的方式來(lái)訪問(wèn)。
2)res文件夾中的文件會(huì)被壓縮,而assets文件中的文件不會(huì)被壓縮。
3)Res不能自定義目錄名,不支持多層目錄。而assets支持自定義目錄名,支持多層目錄。
10.廣播接收器有幾種注冊(cè)方式,分別是什么?
1)動(dòng)態(tài)注冊(cè):在代碼中注冊(cè),創(chuàng)建一個(gè)IntentFilter(意圖過(guò)濾器)對(duì)象,設(shè)置想要就收的廣播,在onCreate()方法中通過(guò)調(diào)用registerReceiver()方法來(lái)注冊(cè)廣播接收器,在onDestroy()方法中通過(guò)調(diào)用unregisterReceiver()方法來(lái)注銷廣播接收器。2)靜態(tài)注冊(cè):在AndroidManifest.xml文件中注冊(cè),
第二篇:android面試題
選擇題(包括多選)
1.下列哪些語(yǔ)句關(guān)于內(nèi)存回收的說(shuō)明是正確的?
A、程序員必須創(chuàng)建一個(gè)線程來(lái)釋放內(nèi)存
B、內(nèi)存回收程序負(fù)責(zé)釋放無(wú)用內(nèi)存
C、內(nèi)存回收程序允許程序員直接釋放內(nèi)存
D、內(nèi)存回收程序可以在指定的時(shí)間釋放內(nèi)存對(duì)象
2.下面異常是屬于Runtime Exception 的是
A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException
3.Math.round(-11.5)等于多少
A、11 ,-11
B、11 ,-12
C、12 ,-11
D、12 ,-1
24.下列程序段的輸出結(jié)果是:
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
5.對(duì)一些資源以及狀態(tài)的操作保存,最好是保存在生命周期的哪個(gè)函數(shù)中進(jìn)行
A、onPause()
B、onCreate()
C、onResume()
D、onStart()
6.Intent傳遞數(shù)據(jù)時(shí),下列的數(shù)據(jù)類型哪些可以被傳遞
A、Serializable
B、charsequence
C、Parcelable
D、Bundle
7.android 中下列屬于Intent的作用的是
A、實(shí)現(xiàn)應(yīng)用程序間的數(shù)據(jù)共享
B、是一段長(zhǎng)的生命周期,沒(méi)有用戶界面的程序,可以保持應(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)的是
A、將整個(gè)文檔樹在內(nèi)存中,便于操作,支持刪除,修改,重新排列等多種功能
B、不用事先調(diào)入整個(gè)文檔,占用資源少
C、整個(gè)文檔調(diào)入內(nèi)存,浪費(fèi)時(shí)間和空間
D、不是長(zhǎng)久駐留在內(nèi)存,數(shù)據(jù)不是持久的,事件過(guò)后,若沒(méi)有保存數(shù)據(jù),數(shù)據(jù)就會(huì)
消失
9.在android中使用SQLiteOpenHelper這個(gè)輔助類時(shí),可以生成一個(gè)數(shù)據(jù)庫(kù),并可以對(duì)數(shù)據(jù)庫(kù)版本進(jìn)行管理的方法可以是()
A、getWriteableDatabase()
B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()
10.android 關(guān)于service生命周期的onCreate()和onStart()說(shuō)法正確的是
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()方法
11.下面是屬于GLSurFaceView特性的是
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ù)
12.下面在AndroidManifest.xml文件中注冊(cè)BroadcastReceiver方式正確的A、
android:name=“android.provider.action.NewBroad”/> B、 android:name=“android.provider.action.NewBroad”/> C、 android:name=“android.provider.action.NewBroad”/> D、 android:name=“android.provider.action.NewBroad”/> 13.關(guān)于ContenValues類說(shuō)法正確的是 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類型 14.我們都知道Hanlder是線程與Activity通信的橋梁,如果線程處理不當(dāng),你的機(jī)器就會(huì)變得越慢,那么線程銷毀的方法是 A、onDestroy() B、onClear() C、onFinish() D、onStop() 15.下面退出Activity錯(cuò)誤的方法是 A、finish() B、拋異常強(qiáng)制退出 C、System.exit() D、onStop() 16.下面屬于android的動(dòng)畫分類的有 A、Tween B、Frame C、Draw D、Animation 17.下面關(guān)于Android dvm的進(jìn)程和Linux的進(jìn)程,應(yīng)用程序的進(jìn)程說(shuō)法正確的是 A、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,不一定擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM都是在Linux中的一個(gè)進(jìn)程,所以說(shuō)可以認(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)程,所以說(shuō)不是一個(gè)概念.C、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM不一定都是在Linux中的一個(gè)進(jìn)程,所以說(shuō)不是一個(gè)概念.D、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的 Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM都是在Linux中的一個(gè)進(jìn)程,所以說(shuō)可以認(rèn)為是同一個(gè)概念.18.Android項(xiàng)目工程下面的assets目錄的作用是什么 A、放置應(yīng)用到的圖片資源。 B、主要放置多媒體等數(shù)據(jù)文件 C、放置字符串,顏色,數(shù)組等常量數(shù)據(jù) D、放置一些與UI相應(yīng)的布局文件,都是xml文件 19.關(guān)于res/raw目錄說(shuō)法正確的是 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ǔ)到指定的包中 20.下列對(duì)android NDK的理解正確的是 A、NDK是一系列工具的集合B、NDK 提供了一份穩(wěn)定、功能有限的 API 頭文件聲明。 C、使 “Java+C” 的開(kāi)發(fā)方式終于轉(zhuǎn)正,成為官方支持的開(kāi)發(fā)方式 D、NDK 將是 Android平臺(tái)支持 C 開(kāi)發(fā)的開(kāi)端 問(wèn)答題: 1.系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問(wèn)指定頁(yè)面?請(qǐng)說(shuō)明原由。 2.Activity和Task的啟動(dòng)模式有哪些? 每種含義是什么? 3.SQLite支持事務(wù)嗎? 添加刪除如何提高性能? 4.對(duì)Intent、Activity、廣播、Service等的理解 5、handler機(jī)制的原理 一.Java的問(wèn)題 1.回調(diào)函數(shù)是?有什么用?好處是?一般什么時(shí)候用?手寫個(gè)例子代碼。 2.Java抽象類是什么?你怎么理解抽象類?為什么要有抽象類?好處,壞處。3.Public,protected,private,默認(rèn) 這四個(gè)修飾符的區(qū)別和范圍。4.Java中泛型的概念,如何實(shí)現(xiàn)的? 5.Switch中支持的類型(注意string和long)6.內(nèi)部類有幾種?它們的區(qū)別。 7.設(shè)計(jì)模式(單例模式,工場(chǎng)方法模式等,它們的優(yōu)缺點(diǎn))8.GC機(jī)制,垃圾的清除算法 9.創(chuàng)建線程的幾種方式 10.多線程的同步問(wèn)題 11.寫一下socket通信的大致代碼 12.單線程和多線程處理哪個(gè)好(分單cup和多cpu)13.虛擬內(nèi)存的概念,內(nèi)存置換算法 14.強(qiáng)連接,軟連接,弱連接,虛連接的概念和使用舉例 15.Android開(kāi)發(fā)如何進(jìn)行算法和界面的優(yōu)化 16.為什么內(nèi)部類可以直接訪問(wèn)外邊類的成員 17.外部類可以直接訪問(wèn)內(nèi)部類的成員嗎?(不能)為什么?那應(yīng)該怎樣實(shí)現(xiàn)訪問(wèn) 18.Hashmap內(nèi)部是怎么實(shí)現(xiàn)的,他的動(dòng)態(tài)內(nèi)存大小怎么變,和hashtable的區(qū)別與聯(lián)系? 19.Hashmap同步嗎?如何實(shí)現(xiàn)同步。20.線程之間如何實(shí)現(xiàn)通信 21.線程和進(jìn)程的區(qū)別,線程有自己的棧和存儲(chǔ)機(jī)制嗎? 22.Threadlocal知道嗎?作用 23.Jvm和dvm的區(qū)別與聯(lián)系 24.線程池,消息池,常量池的概念 25.棧和堆的區(qū)別 26.Hashmap的遍歷方式有幾種,各種的區(qū)別,手寫下例子代碼 27.Java支持中文嗎? 28.Volatile的作用,是否可靠它實(shí)現(xiàn)同步安全? 29.如何實(shí)現(xiàn)同步 30.Android的動(dòng)畫實(shí)現(xiàn)有哪幾種方式,區(qū)別 31.Java中繼承有哪些特征 32.抽象類和接口的區(qū)別 33.Exception的概念,運(yùn)行時(shí),非運(yùn)行時(shí)的區(qū)別 34.Java中一次跳出多個(gè)循環(huán)的方式 35.死鎖的概念和必要條件,解決方法 36.Tcp和udp的區(qū)別 37.Tap的3次握手過(guò)程,大概畫一畫 38.內(nèi)部碎片與外部碎片的概念和區(qū)別 39.反射機(jī)制 40.C++與java的區(qū)別 二.Android的問(wèn)題 41.android中內(nèi)存泄露是?產(chǎn)生原因?解決方法? 42.Android中內(nèi)存溢出是?產(chǎn)生原因?解決方法?它和內(nèi)存泄露有什么區(qū)別? 43.Activity的生命周期,三種狀態(tài) 44.Activity的4種啟動(dòng)模式 45.Android的四大組件 46.說(shuō)說(shuō)intent 47.Androidmanifest的作用 48.Android系統(tǒng)有幾層,了解application framework層嗎? 49.Service的啟動(dòng)方式和它們的區(qū)別 50.用過(guò)自定義控件沒(méi)?怎么實(shí)現(xiàn)自定義控件,手寫下例子代碼。 51.知道Fragment嗎?哪個(gè)版本出的?它和activity的區(qū)別,它的生命周期?用它的好處?它和activity如何實(shí)現(xiàn)通信,相互調(diào)用。 52.Fragment怎么實(shí)習(xí)按back鍵進(jìn)行回退而不是一次性退出它所依附的activity? 53.Android如何實(shí)現(xiàn)定時(shí)器(timer,alarmManager)54.handler機(jī)制的概念,應(yīng)用 55.Handler如何實(shí)現(xiàn)定時(shí)器效果(3種)56.兩個(gè)activity之間如何通信(各種方式)57.用過(guò)eclipse的debug調(diào)試沒(méi)?怎么用的 58.知道多少eclipse的快捷鍵 59.結(jié)束一個(gè)進(jìn)程的幾種方式? 60.進(jìn)程間如何實(shí)現(xiàn)通信 61.Android如何實(shí)現(xiàn)信息存儲(chǔ) 62.知道volley等一些第三方庫(kù)嗎? 63.Android對(duì)view的更新方式 64.知道一些代碼優(yōu)化的方式嗎? 65.Handler和thread的區(qū)別 66.Android中http訪問(wèn)的兩種方式 67.Asynctask的概念,作用,與handler的區(qū)別 68.Android中如何實(shí)現(xiàn)畫圖,手寫個(gè)簡(jiǎn)單的例子 69.一個(gè)子線程是否可用直接修改ui界面?為什么 70.Service和Intentservice的區(qū)別與聯(lián)系 71.Context是什么? 72.Boardcast的概念,作用,有序廣播和無(wú)序廣播的區(qū)別,粘性廣播的概念 73.Boardcast的靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)的區(qū)別 74.Aidl,如何實(shí)現(xiàn)進(jìn)程間通信 75.Contentprovider概念和作用 76.Json比xml的好處,他們的區(qū)別 77.Listview的概念,優(yōu)化,如何實(shí)現(xiàn)每項(xiàng)的布局不同 78.Touch事件的分發(fā)過(guò)程 79.Linearlayout的Weight屬性的作用 80.Android有哪幾種布局,它們的5種布局的區(qū)別 81.Finish和exit(0)的區(qū)別 82.Sqlite的事務(wù)處理 83.Android實(shí)現(xiàn)可滑動(dòng)tab的3種方式,它們的區(qū)別和各種的好處 84.Android中跨進(jìn)程通信的4種方式,(正好對(duì)應(yīng)四大組件)85.Handler的內(nèi)存泄露是? 86.Android系統(tǒng)提供的與用戶交互的兩種機(jī)制(回調(diào)函數(shù),監(jiān)聽(tīng)器)87.Ndk的理解,jni的理解 88.Toast的概念,它的時(shí)間設(shè)置的兩種方式 89.Activity的狀態(tài)保存的方式 90.Activity的5個(gè)進(jìn)程等級(jí) 91.Surface了解嗎? 92.程序閃退的原因有哪些,怎么解決 93.Get和post的區(qū)別 94.Android有哪三種菜單?區(qū)別 95.實(shí)現(xiàn)序列化的兩種方式,比較它們的優(yōu)缺點(diǎn) 96.Broadcast receiver的生命周期 97.Sharedpreference的作用,底層實(shí)現(xiàn) 98.如何實(shí)現(xiàn)一個(gè)前臺(tái)的service,簡(jiǎn)單寫下代碼例子 99.按home鍵activity的生命周期變化 100.Activity由a跳到b,哪些生命周期會(huì)執(zhí)行 101.橫豎屏切換,activity的生命周期,configchange的應(yīng)用 102.如何設(shè)置activity為對(duì)話框風(fēng)格 103.Activity,window,view的聯(lián)系和區(qū)別 104.Style和theme的聯(lián)系和區(qū)別 105.知道android平臺(tái)主流的幾種消息推送方式嗎? 106.Viewstub的概念,作用,好處 107.Android數(shù)字簽名 108.Zygote的概念 109.Adb的概念,作用。Adb死掉了怎么辦? 110.Ddms和teaceview的區(qū)別,他們的作用 111.MVC模式概念 112.Android的事件傳遞機(jī)制 113.圖片的緩存機(jī)制 114.Android內(nèi)存優(yōu)化及管理 115.如何實(shí)現(xiàn)低版本可用高版本的新的東西 116.Gallery畫廊的使用 117.http如何實(shí)現(xiàn)長(zhǎng)連接 118.Android是不是linux?為什么? 119.三.算法和寫代碼 74.寫數(shù)的后序遍歷(非遞歸)75.實(shí)現(xiàn)一個(gè)字符串的全排列 76.快速排序,堆排序,歸并排序 77.如何在大量數(shù)據(jù)中快速找到中位數(shù)? 78.如何判斷一個(gè)數(shù)是不是2的n次方 android面試題總結(jié)加強(qiáng)版 (三)(轉(zhuǎn)自CSDN)轉(zhuǎn)載地址:http://blog.csdn.net/itachi85/article/details/7426474 自己總結(jié)的最強(qiáng)android應(yīng)用面試題集 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ì)來(lái)找A, 這個(gè)時(shí)候就有兩種情況,一種是A被回收,一種是沒(méi)有被回收,被回 收的A就要重新調(diào)用onCreate()方法,不同于直接啟動(dòng)的是這回onCreate()里是帶上參數(shù)savedInstanceState,沒(méi)被收回的就還是onResume就好了。 savedInstanceState是一個(gè)Bundle對(duì)象,你基本上可以把他理解為系統(tǒng)幫你維護(hù)的一個(gè)Map對(duì)象。在onCreate()里你可能會(huì) 用到它,如果正常啟動(dòng)onCreate就不會(huì)有它,所以用的時(shí)候要判斷一下是否為空。Java代碼 if(savedInstanceState!= null){ long id = savedInstanceState.getLong(“id”);} 就像官方的Notepad教程 里的情況,你正在編輯某一個(gè)note,突然被中斷,那么就把這個(gè)note的id記住,再起來(lái)的時(shí)候就可以根據(jù)這個(gè)id去把那個(gè)note取出來(lái),程序就完整 一些。 比如你的界面就是讀取一個(gè)列表,那就不需要特殊記住什么,哦,沒(méi)準(zhǔn)你需要記住滾動(dòng)條的位置...27.如何退出Activity 對(duì)于單一Activity的應(yīng)用來(lái)說(shuō),退出很簡(jiǎn)單,直接finish()即可。當(dāng)然,也可以用killProcess()和System.exit()這樣的方法。現(xiàn)提供幾個(gè)方法,供參考: 1、拋異常強(qiáng)制退出:該方法通過(guò)拋異常,使程序Force Close。驗(yàn)證可以,但是,需要解決的問(wèn)題是,如何使程序結(jié)束掉,而不彈出Force Close的窗口。 2、記錄打開(kāi)的Activity:每打開(kāi)一個(gè)Activity,就記錄下來(lái)。在需要退出時(shí),關(guān)閉每一個(gè)Activity即可。 3、發(fā)送特定廣播:在需要結(jié)束應(yīng)用時(shí),發(fā)送一個(gè)特定的廣播,每個(gè)Activity收到廣播后,關(guān)閉即可。 4、遞歸退出在打開(kāi)新的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á)到了,而且沒(méi)有影響用戶使用。為了編程方便,最好定義一個(gè)Activity基類,處理這些共通問(wèn)題。 28.請(qǐng)解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關(guān)系。 Message Queue(消息隊(duì)列):用來(lái)存放通過(guò)Handler發(fā)布的消息,通常附屬于某一個(gè)創(chuàng)建它的線程,可以通過(guò)Looper.myQueue()得到當(dāng)前線程的消息隊(duì)列 Handler:可以發(fā)布或者處理一個(gè)消息或者操作一個(gè)Runnable,通過(guò)Handler發(fā)布消息,消息將只會(huì)發(fā)送到與它關(guān)聯(lián)的消息隊(duì)列,然也只能處理該消息隊(duì)列中的消息 Looper:是Handler和消息隊(duì)列之間通訊橋梁,程序組件首先通過(guò)Handler把消息傳遞給Looper,Looper把消息放入隊(duì)列。Looper也把消息隊(duì)列里的消息廣播給所有的 Handler,Handler接受到消息后調(diào)用handleMessage進(jìn)行處理 Message:消息的類型,在Handler類中的handleMessage方法中得到單個(gè)的消息進(jìn)行處理.29.你如何評(píng)價(jià)Android系統(tǒng)??jī)?yōu)缺點(diǎn)。 1、學(xué)習(xí)的開(kāi)源性 2、軟件兼容性比較好 3、軟件發(fā)展迅速 4、界面布局好 缺點(diǎn): 1、版本過(guò)多 2、先有軟件少 3、商務(wù)性能差 30.談?wù)刟ndroid數(shù)據(jù)存儲(chǔ)方式。 Android提供了5種方式存儲(chǔ)數(shù)據(jù): (1)使用SharedPreferences存儲(chǔ)數(shù)據(jù);它是Android提供的用來(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)用保存或讀取此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ù)信息。 31.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ù)保存到文件、SQLite數(shù)據(jù)庫(kù)中,甚至是任何有效的設(shè)備中。當(dāng)你想將你的應(yīng)用數(shù)據(jù)和其他應(yīng)用共享時(shí),內(nèi)容提供器就可以發(fā)揮作用了。 Service:服務(wù),具有一段較長(zhǎng)生命周期且沒(méi)有用戶界面的程序。 有什么區(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:請(qǐng)求你的package正常運(yùn)作所需賦予的安全許可。 permission: 聲明了安全許可來(lái)限制哪些程序能你package中的組件和功能。instrumentation:聲明了用來(lái)測(cè)試此package或其他package指令組件的代碼。application:包含package中application級(jí)別組件聲明的根節(jié)點(diǎn)。activity:Activity是用來(lái)與用戶交互的主要工具。 receiver:IntentReceiver能使的application獲得數(shù)據(jù)的改變或者發(fā)生的操作,即使它當(dāng)前不在運(yùn)行。 service:Service是能在后臺(tái)運(yùn)行任意時(shí)間的組件。 provider:ContentProvider是用來(lái)管理持久化數(shù)據(jù)并發(fā)布給其他應(yīng)用程序使用的組件。 34.根據(jù)自己的理解描述下Android數(shù)字簽名。 (1)所有的應(yīng)用程序都必須有數(shù)字證書,Android系統(tǒng)不會(huì)安裝一個(gè)沒(méi)有數(shù)字證書的應(yīng)用程序(2)Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個(gè)權(quán)威的數(shù)字證書機(jī)構(gòu)簽名認(rèn)證 (3)如果要正式發(fā)布一個(gè)Android,必須使用一個(gè)合適的私鑰生成的數(shù)字證書來(lái)給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書來(lái)發(fā)布。 (4)數(shù)字證書都是有有效期的,Android只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過(guò)期也不會(huì)影響程序的正常功能。 35.AIDL的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)? AIDL全稱Android Interface Definition Language(AndRoid接口描述語(yǔ)言)是一種借口描述語(yǔ)言;編譯器可以通過(guò)aidl文件生成一段代碼,通過(guò)預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程跨界對(duì)象訪問(wèn)的目的.AIDL的IPC的機(jī)制和COM或CORBA類似, 是基于接口的,但它是輕 .如果要使用AIDL, 需要完成2件事情: 1.引入AIDL的相關(guān)類.;2.調(diào)用aidl產(chǎn)生的class.理論上, 參數(shù)可以傳遞基本數(shù)據(jù)類型和String, 還有就是Bundle的派生類, 不過(guò)在Eclipse中,目前的ADT不支持Bundle做為參數(shù), 具體實(shí)現(xiàn)步驟如下: 1、創(chuàng)建AIDL文件, 在這個(gè)文件里面定義接口, 該接口定義了可供客戶端訪問(wèn)的方法和屬性。 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è)方法。接下來(lái)就需要自己去實(shí)現(xiàn)自定義的幾個(gè)接口了.4、向客戶端提供接口ITaskBinder, 如果寫的是service,擴(kuò)展該Service并重載onBind()方法來(lái)返回一個(gè)實(shí)現(xiàn)上述接口的類的實(shí)例。 5、在服務(wù)器端回調(diào)客戶端的函數(shù).前提是當(dāng)客戶端獲取的IBinder接口的時(shí)候,要去注冊(cè)回調(diào)函數(shù), 只有這樣, 服務(wù)器端才知道該調(diào)用那些函數(shù) AIDL語(yǔ)法很簡(jiǎn)單,可以用來(lái)聲明一個(gè)帶一個(gè)或多個(gè)方法的接口,也可以傳遞參數(shù)和返回值。由于遠(yuǎn)程調(diào)用的需要, 這些參數(shù)和返回值并不是任何類型.下面是些AIDL支持的數(shù)據(jù)類型: 1.不需要import聲明的簡(jiǎn)單Java編程語(yǔ)言類型(int,boolean等)2.String, CharSequence不需要特殊聲明 3.List, Map和Parcelables類型, 這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡(jiǎn)單數(shù)據(jù)類型, String等其他比支持的類型.(另外: 我沒(méi)嘗試Parcelables, 在Eclipse+ADT下編譯不過(guò), 或許以后會(huì)有所支持).實(shí)現(xiàn)接口時(shí)有幾個(gè)原則: .拋出的異常不要返回給調(diào)用者.跨進(jìn)程拋異常處理是不可取的..IPC調(diào)用是同步的。如果你知道一個(gè)IPC服務(wù)需要超過(guò)幾毫秒的時(shí)間才能完成地話,你應(yīng)該避免在Activity的主線程中調(diào)用。也就是IPC調(diào)用會(huì)掛起應(yīng)用程序?qū)е陆缑媸ロ憫?yīng).這種情況應(yīng)該考慮單起一個(gè)線程來(lái)處理..不能在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)用接口中定義的方法。你總要檢測(cè)到DeadObjectException異常,該異常在連接斷開(kāi)時(shí)被拋出。它只會(huì)被遠(yuǎn)程方法拋出。 6.斷開(kāi)連接,調(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組件的對(duì)齊方式,而android:layout_gravity用于設(shè)置Container組件的 對(duì)齊方式。 舉個(gè)例子,我們可以通過(guò)設(shè)置android:gravity=“center”來(lái)讓EditText中的文字在EditText組件中居中顯示;同 時(shí)我們?cè)O(shè)置EditText的android:layout_gravity=“right”來(lái)讓EditText組件在LinearLayout中居中 顯示。來(lái)實(shí)踐以下: 正如我們所看到的,在EditText中,其中的文字已經(jīng)居中顯示了,而EditText組件自己也對(duì)齊到了LinearLayout的右側(cè)。 [html] view plaincopyprint? 1. 2.xmlns:android=“http://schemas.android.com/apk/res/android” 3.android:orientation=“vertical” 4.android:layout_width=“fill_parent” 5.android:layout_height=“fill_parent”> 6. 7.android:layout_width=“wrap_content” 8.android:gravity=“center” 9.android:layout_height=“wrap_content” 10.android:text=“one” 11.android:layout_gravity=“right”/> 12. 這兩個(gè)屬性也可以用于 Framlayout Textview 等等,表示的意思大同小異 37.padding與margin的區(qū)別 padding填充的意思,指的是view中的content與view邊緣的距離,類似文本中的indent 而margin表示的是view的左邊緣與parent view的左邊緣的距離 margin一般用來(lái)描述控件間位置關(guān)系,而padding一般描述控件內(nèi)容和控件的位置關(guān)系。簡(jiǎn)單,padding是站在父 view的角度描述問(wèn)題,它規(guī)定它里面的內(nèi)容必須與這個(gè)父view邊界的距離。margin則是站在自己的角度描述問(wèn)題,規(guī)定自己和其他(上下左右)的 view之間的距離,如果同一級(jí)只有一個(gè)view,那么它的效果基本上就和padding一樣了。例如我的XML layout代碼如下: view plaincopy to clipboardprint? [html] view plaincopyprint? 1. 2. 3.android:orientation=“vertical” 4.android:layout_width=“fill_parent” 5.android:layout_height=“fill_parent” 6.android:paddingLeft=“10dip” 7.android:paddingRight=“10dip” 8.android:paddingTop=“10dip” 9.android:paddingBottom=“10dip” 10.> 11. 12.android:layout_width=“wrap_content” 13.android:layout_height=“wrap_content” 14.android:background=“#FF0000” 15.android:text=“@string/hello” 16.android:paddingLeft=“50dip” 17.android:paddingRight=“50dip” 18.android:paddingTop=“50dip” 19.android:paddingBottom=“50dip” 20.android:layout_marginBottom=“10dip” 21./> 22. 23.android:layout_width=“wrap_content” 24.android:layout_height=“wrap_content” 25.android:background=“#FF0000” 26.android:text=“@string/hello” 27.android:paddingLeft=“50dip” 28.android:paddingRight=“50dip” 29.android:paddingTop=“50dip” 30.android:paddingBottom=“50dip” 31.android:layout_marginBottom=“10dip” 32./> 33. 34.android:layout_width=“wrap_content” 35.android:layout_height=“wrap_content” 36.android:background=“#FF0000” 37.android:text=“@string/hello” 38.android:paddingLeft=“50dip” 39.android:paddingRight=“50dip” 40.android:paddingTop=“50dip” 41.android:paddingBottom=“50dip” 42.android:layout_marginBottom=“10dip” 43./> 44. 45.android:layout_width=“wrap_content” 46.android:layout_height=“wrap_content” 47.android:background=“#FF0000” 48.android:text=“@string/hello” 49.android:paddingLeft=“50dip” 50.android:paddingRight=“50dip” 51.android:paddingTop=“50dip” 52.android:paddingBottom=“50dip” 53.android:layout_marginBottom=“10dip” 54./> 55. 那么我會(huì)得到如下的效果,圖上已經(jīng)很明確的標(biāo)出來(lái)區(qū)別咯。 38.注冊(cè)廣播接收者兩種方式的區(qū)別 現(xiàn)在我們就來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的廣播程序。Android提供了兩種注冊(cè)廣播接受者的形式,分別是在程序中動(dòng)態(tài)注冊(cè)和在xml中指定。他們之間的區(qū)別就是作用 的范圍不同,程序動(dòng)態(tài)注冊(cè)的接收者只在程序運(yùn)行過(guò)程中有效,而在xml注冊(cè)的接收者不管你的程序有沒(méi)有啟動(dòng)有會(huì)起作用。 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.可以通過(guò)該解析器隨時(shí)訪問(wèn)XML樹中的任何一個(gè)節(jié)點(diǎn).3.DOM解析器的API在使用上也相對(duì)比較簡(jiǎn)單.缺點(diǎn):如果XML文檔體積比較大時(shí),將文檔讀入內(nèi)存是非常消耗系統(tǒng)資源的.使用場(chǎng)景:DOM 是用與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示 XML 文檔的官方 W3C 標(biāo)準(zhǔn).DOM 是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)的集合.這個(gè)層次結(jié)構(gòu)允許開(kāi)發(fā)人員在樹中尋找特定信息.分析該結(jié)構(gòu),然后才能進(jìn)行任何工作.DOM是基于對(duì)象層次結(jié)構(gòu)的.? SAX解析 優(yōu)點(diǎn): SAX 對(duì)內(nèi)存的要求比較低,因?yàn)樗岄_(kāi)發(fā)人員自己來(lái)決定所要處理的標(biāo)簽.特別是當(dāng)開(kāi)發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX 這種擴(kuò)展能力得到了更好的體現(xiàn).缺點(diǎn): 用SAX方式進(jìn)行XML解析時(shí),需要順序執(zhí)行,所以很難訪問(wèn)到同一文檔中的不同數(shù)據(jù).此外,在基于該方式的解析編碼過(guò)程也相對(duì)復(fù)雜.使用場(chǎng)景: 對(duì)于含有數(shù)據(jù)量十分巨大,而又不用對(duì)文檔的所有數(shù)據(jù)進(jìn)行遍歷或者分析的時(shí)候,使用該方法十分有效.該方法不用將整個(gè)文檔讀入內(nèi)存,而只需讀取到程序所需的文檔標(biāo)簽處即可.? Xmlpull解析 android SDK提供了xmlpull api,xmlpull和sax類似,是基于流(stream)操作文件,然后根據(jù)節(jié)點(diǎn)事件回調(diào)開(kāi)發(fā)者編寫的處理程序.因?yàn)槭腔诹鞯奶幚?因此xmlpull和sax都比較節(jié)約內(nèi)存資源,不會(huì)象dom那樣要把所有節(jié)點(diǎn)以對(duì)橡樹的形式展現(xiàn)在內(nèi)存中.xmlpull比sax更簡(jiǎn)明,而且不需要掃描完整個(gè)流.41.Android系統(tǒng)中GC什么情況下會(huì)出現(xiàn)內(nèi)存泄露呢? 出現(xiàn)情況: 1.數(shù)據(jù)庫(kù)的cursor沒(méi)有關(guān)閉 2.構(gòu)造adapter時(shí),沒(méi)有使用緩存contentview 衍生listview的優(yōu)化問(wèn)題-----減少創(chuàng)建view的對(duì)象,充分使用contentview,可以使用一靜態(tài)類來(lái)優(yōu)化處理getview的過(guò)程/ 3.Bitmap對(duì)象不使用時(shí)采用recycle()釋放內(nèi)存 4.activity中的對(duì)象的生命周期大于activity 調(diào)試方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size] 談?wù)剬?duì)Android NDK的理解 NDK 全稱: Native Development Kit 2.誤解 誤解一: NDK 發(fā)布之前, Android 不支持進(jìn)行 C 開(kāi)發(fā) 在Google 中搜索 “NDK” ,很多 “Android 終于可以使用 C++ 開(kāi)發(fā) ” 之類的標(biāo)題,這是一種對(duì) Android平臺(tái)編程方式的誤解.其實(shí), Android平臺(tái)從誕生起,就已經(jīng)支持 C.C++ 開(kāi)發(fā).眾所周知, Android 的 SDK 基于 Java 實(shí)現(xiàn),這意味著基于 Android SDK 進(jìn)行開(kāi)發(fā)的第三方應(yīng)用都必須使用 Java 語(yǔ)言.但這并不等同于 “ 第三方應(yīng)用只能使用 Java”.在 Android SDK 首次發(fā)布時(shí), Google 就宣稱其虛擬機(jī) Dalvik 支持 JNI 編程方式,也就是第三方應(yīng)用完全可以通過(guò) JNI 調(diào)用自己的 C 動(dòng)態(tài)庫(kù),即在 Android平臺(tái)上, “Java+C” 的編程方式是一直都可以實(shí)現(xiàn)的.當(dāng)然這種誤解的產(chǎn)生是有根源的:在Android SDK 文檔里,找不到任何 JNI 方面的幫助.即使第三方應(yīng)用開(kāi)發(fā)者使用 JNI 完成了自己的 C 動(dòng)態(tài)鏈接庫(kù)(so)開(kāi)發(fā),但是 so 如何和應(yīng)用程序一起打包成 apk 并發(fā)布?這里面也存在技術(shù)障礙.我曾經(jīng)花了不少時(shí)間,安裝交叉編譯器創(chuàng)建 so ,并通過(guò) asset(資源)方式,實(shí)現(xiàn)捆綁 so 發(fā)布.但這種方式只能屬于取巧的方式,并非官方支持.所以,在 NDK 出來(lái)之前,我們將 “Java+C” 的開(kāi)發(fā)模式稱之為灰色模式,即官方既不聲明 “ 支持這種方式 ” ,也不聲明 “ 不支持這種方式 ”.誤解二:有了 NDK ,我們可以使用純 C 開(kāi)發(fā) Android 應(yīng)用 Android SDK采用 Java 語(yǔ)言發(fā)布,把眾多的 C 開(kāi)發(fā)人員排除在第三方應(yīng)用開(kāi)發(fā)外(注意:我們所有討論都是基于“ 第三方應(yīng)用開(kāi)發(fā) ” , Android 系統(tǒng)基于 Linux ,系統(tǒng)級(jí)別的開(kāi)發(fā)肯定是支持 C 語(yǔ)言的.).NDK 的發(fā)布,許多人會(huì)誤以為,類似于 Symbian.WM ,在 Android平臺(tái)上終于可以使用純 C.C++ 開(kāi)發(fā)第三方應(yīng)用了!其實(shí)不然, NDK 文檔明確說(shuō)明: it is not a good way.因?yàn)?NDK 并沒(méi)有提供各種系統(tǒng)事件處理支持,也沒(méi)有提供應(yīng)用程序生命周期維護(hù).此外,在本次發(fā)布的 NDK 中,應(yīng)用程序 UI 方面的 API 也沒(méi)有提供.至少目前來(lái)說(shuō),使用純 C.C++ 開(kāi)發(fā)一個(gè)完整應(yīng)用的條件還不完備.1.NDK 是一系列工具的集合.NDK提供了一系列的工具,幫助開(kāi)發(fā)者快速開(kāi)發(fā) C(或 C++)的動(dòng)態(tài)庫(kù),并能自動(dòng)將 so 和 java 應(yīng)用一起打包成 apk.這些工具對(duì)開(kāi)發(fā)者的幫助是巨大的.NDK集成了交叉編譯器,并提供了相應(yīng)的 mk 文件隔離 CPU.平臺(tái).ABI 等差異,開(kāi)發(fā)人員只需要簡(jiǎn)單修改 mk 文件(指出 “ 哪些文件需要編譯 ”.“ 編譯特性要求 ” 等),就可以創(chuàng)建 出 NDK可以自動(dòng)地將 so 和 Java 應(yīng)用一起打包,極大地減輕了開(kāi)發(fā)人員的打包工作.2.NDK 提供了一份穩(wěn)定.功能有限的 API 頭文件聲明.Google明確聲明該 API 是穩(wěn)定的,在后續(xù)所有版本中都穩(wěn)定支持當(dāng)前發(fā)布的 API.從該版本的 NDK 中看出,這些 API 支持的功能非常有限,包含有: C 標(biāo)準(zhǔn)庫(kù)(libc).標(biāo)準(zhǔn)數(shù)學(xué)庫(kù)(libm).壓縮庫(kù)(libz).Log 庫(kù)(liblog).3.NDK 帶來(lái)什么 1.NDK 的發(fā)布,使 “Java+C” 的開(kāi)發(fā)方式終于轉(zhuǎn)正,成為官方支持的開(kāi)發(fā)方式.使用NDK ,我們可以將要求高性能的應(yīng)用邏輯使用 C 開(kāi)發(fā),從而提高應(yīng)用程序的執(zhí)行效率.使用NDK ,我們可以將需要保密的應(yīng)用邏輯使用 C 開(kāi)發(fā).畢竟, Java 包都是可以反編譯的.NDK促使專業(yè) so 組件商的出現(xiàn).(樂(lè)觀猜想,要視乎 Android 用戶的數(shù)量) 2.NDK 將是 Android平臺(tái)支持 C 開(kāi)發(fā)的開(kāi)端.NDK提供了的開(kāi)發(fā)工具集合,使開(kāi)發(fā)人員可以便捷地開(kāi)發(fā).發(fā)布 C 組件.同時(shí), Google承諾在 NDK 后續(xù)版本中提高 “ 可調(diào)式 ” 能力,即提供遠(yuǎn)程的 gdb 工具,使我們可以便捷地調(diào)試 C 源碼.在支持 Android平臺(tái) C 開(kāi)發(fā),我們能感覺(jué)到 Google 花費(fèi)了很大精力,我們有理由憧憬 “C 組件支持 ” 只是 Google Android平臺(tái)上C 開(kāi)發(fā)的開(kāi)端.畢竟, C 程序員仍然是碼農(nóng)陣營(yíng)中的絕對(duì)主力,將這部分人排除在 Android 應(yīng)用開(kāi)發(fā)之外,顯然是不利于 Android平臺(tái)繁榮昌盛的. Android 面試題(有詳細(xì)答案) 附帶答案,共100分 一、選擇題(30題,每題1.5分,共45分) 1.java.io包中定義了多個(gè)流類型來(lái)實(shí)現(xiàn)輸入和輸出功能,可以從不同的角度對(duì)其進(jìn)行分類,按功能分為:(c),如果為讀取的內(nèi)容進(jìn)行處理后再輸出,需要使用下列哪種流?() A、輸入流和輸出流B、字節(jié)流和字符流C、節(jié)點(diǎn)流和處理流 D、File streamE、Pipe streamF、Random streamG、Filter stream 2.下列代碼的執(zhí)行結(jié)果是:() public class Test3{ public static void main(String args[]){ System.out.print(100%3); System.out.print(“,”); System.out.println(100%3.0); } } A、1,1 B、1,1.0 C、1.0,1 D、1.0,1.0 3.在繼承中,關(guān)于構(gòu)造方法的說(shuō)明,下列說(shuō)法錯(cuò)誤的是() A、子類無(wú)條件的繼承父類的無(wú)參構(gòu)造方法,B、子類可以引用父類中的有參構(gòu)造方法,使用super關(guān)鍵字,C、如果子類沒(méi)有構(gòu)造方法,則父類無(wú)參構(gòu)造方法作為自已的構(gòu)造方法,D、如果子類有無(wú)參構(gòu)造方法,而父類的無(wú)參構(gòu)造方法則被覆蓋。 4.以下程序的運(yùn)行結(jié)果為() public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x==y) System.out.println(“Not equal”); else System.out.println(“Equal”); } } A、Not equalB、EqualC、無(wú)輸出D、編譯出錯(cuò) 5.Java語(yǔ)言中字符串“學(xué)Java”所占的內(nèi)存空間是() A.6個(gè)字節(jié) B.7個(gè)字節(jié) C.10個(gè)字節(jié) D.11個(gè)字節(jié) 6.關(guān)于下列程序段的輸出結(jié)果,說(shuō)法正確的是:() public class MyClass{ static int i; public static void main(String argv[]){ System.out.println(i); } } A、有錯(cuò)誤,變量i沒(méi)有初始化。 B、null C、1 D、0 7.下列哪些語(yǔ)句關(guān)于內(nèi)存回收的說(shuō)明是正確的?() A、程序員必須創(chuàng)建一個(gè)線程來(lái)釋放內(nèi)存 B、內(nèi)存回收程序負(fù)責(zé)釋放無(wú)用內(nèi)存 C、內(nèi)存回收程序允許程序員直接釋放內(nèi)存 D、內(nèi)存回收程序可以在指定的時(shí)間釋放內(nèi)存對(duì)象 8.下面異常是屬于Runtime Exception 的是()(多選) A、ArithmeticException B、IllegalArgumentException C、NullPointerException D、BufferUnderflowException 9.Math.round(11.5)等于多少().Math.round(-11.5)等于多少().A、11 ,-11B、11 ,-12C、12 ,-11D、12 ,-12 10.下列程序段的輸出結(jié)果是:() 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、trueB、falseC、1D、0 11.activity對(duì)一些資源以及狀態(tài)的操作保存,最好是保存在生命周期的哪個(gè)函數(shù)中進(jìn)行 () A、onPause()B、onCreate()C、onResume()D、onStart() 12.Intent傳遞數(shù)據(jù)時(shí),下列的數(shù)據(jù)類型哪些可以被傳遞()(多選) A、SerializableB、charsequenceC、ParcelableD、Bundle 13.android 中下列屬于Intent的作用的是() A、實(shí)現(xiàn)應(yīng)用程序間的數(shù)據(jù)共享 B、是一段長(zhǎng)的生命周期,沒(méi)有用戶界面的程序,可以保持應(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)用程序整體性的工作 14.下列屬于SAX解析xml文件的優(yōu)點(diǎn)的是() A、將整個(gè)文檔樹在內(nèi)存中,便于操作,支持刪除,修改,重新排列等多種功能 B、不用事先調(diào)入整個(gè)文檔,占用資源少 C、整個(gè)文檔調(diào)入內(nèi)存,浪費(fèi)時(shí)間和空間 D、不是長(zhǎng)久駐留在內(nèi)存,數(shù)據(jù)不是持久的,事件過(guò)后,若沒(méi)有保存數(shù)據(jù),數(shù)據(jù)就會(huì) 消失 15.下面的對(duì)自定style的方式正確的是() A、 B、 C、 D、 16.在android中使用Menu時(shí)可能需要重寫的方法有()。(多選) A、onCreateOptionsMenu() B、onCreateMenu() C、onOptionsItemSelected() D、onItemSelected() 17.在SQL Server Management Studio 中運(yùn)行下列T-SQL語(yǔ)句,其輸出值()。 SELECT @@IDENTITY A、可能為0.1 B、可能為3 C、不可能為-100 D、肯定為0 18.在SQL Server 2005中運(yùn)行如下T-SQL語(yǔ)句,假定SALES表中有多行數(shù)據(jù),執(zhí)行查詢之后的結(jié)果是()。 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 COMMIT TRANSACTION B COMMIT TRANSACTION A A、SALES表中qty列最小值大于等于30 B、SALES表中qty列最小值大于等于40 C、SALES表中qty列的數(shù)據(jù)全部為50 D、SALES表中qty列最小值大于等于60 19.在android中使用SQLiteOpenHelper這個(gè)輔助類時(shí),可以生成一個(gè)數(shù)據(jù)庫(kù),并可以對(duì)數(shù) 據(jù)庫(kù)版本進(jìn)行管理的方法可以是() A、getWriteableDatabase() B、getReadableDatabase() C、getDatabase() D、getAbleDatabase() 20.android 關(guān)于service生命周期的onCreate()和onStart()說(shuō)法正確的是()(多選題) 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()方法 21.下面是屬于GLSurFaceView特性的是()(多選) 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ù) 22.下面在AndroidManifest.xml文件中注冊(cè)BroadcastReceiver方式正確的是() A、 android:name=“android.provider.action.NewBroad”/> B、 android:name=“android.provider.action.NewBroad”/> C、 android:name=“android.provider.action.NewBroad”/> D、 android:name=“android.provider.action.NewBroad”/> 23.關(guān)于ContenValues類說(shuō)法正確的是() 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類型 24.我們都知道Hanlder是線程與Activity通信的橋梁,如果線程處理不當(dāng),你的機(jī)器就會(huì)變得越慢,那么線程銷毀的方法是() A、onDestroy() B、onClear() C、onFinish() D、onStop() 25.下面退出Activity錯(cuò)誤的方法是() A、finish() B、拋異常強(qiáng)制退出 C、System.exit() D、onStop() 26.下面屬于android的動(dòng)畫分類的有()(多項(xiàng)) A、TweenB、Frame C、Draw D、Animation 27.下面關(guān)于Android dvm的進(jìn)程和Linux的進(jìn)程,應(yīng)用程序的進(jìn)程說(shuō)法正確的是() A、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,不一定擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM都是在Linux 中的一個(gè)進(jìn)程,所以說(shuō)可以認(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)程,所以說(shuō)不是一個(gè)概念.C、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM不一定都是在Linux 中的一個(gè)進(jìn)程,所以說(shuō)不是一個(gè)概念.D、DVM指dalivk的虛擬機(jī).每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例.而每一個(gè)DVM都是在Linux 中的一個(gè)進(jìn)程,所以說(shuō)可以認(rèn)為是同一個(gè)概念.28.Android項(xiàng)目工程下面的assets目錄的作用是什么 A、放置應(yīng)用到的圖片資源。 B、主要放置多媒體等數(shù)據(jù)文件 C、放置字符串,顏色,數(shù)組等常量數(shù)據(jù) D、放置一些與UI相應(yīng)的布局文件,都是xml文件 29..關(guān)于res/raw目錄說(shuō)法正確的是() 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ǔ)到指定的包中 30.下列對(duì)android NDK的理解正確的是() A、NDK是一系列工具的集合B、NDK 提供了一份穩(wěn)定、功能有限的 API 頭文件聲明。 C、使 “Java+C” 的開(kāi)發(fā)方式終于轉(zhuǎn)正,成為官方支持的開(kāi)發(fā)方式 D、NDK 將是 Android平臺(tái)支持 C 開(kāi)發(fā)的開(kāi)端 二.填空題(每題2分,共20分) 1.我們用___ ____來(lái)定義一個(gè)整數(shù),用___ ____來(lái)定義一個(gè)字符類型,稱為原始數(shù)據(jù)類型。 2.android中常用的四個(gè)布局是?s 3.android 的四大組件是? 4.java.io包中的__________和______________類主要用于對(duì)對(duì)象(Object)的讀寫。 5.android 中service的實(shí)現(xiàn)方法是:_______-和___________-。 6.activity一般會(huì)重載7個(gè)方法用來(lái)維護(hù)其生命周期,除了onCreate(),onStart(),onDestory()外還有_______-,_________ ,_________ ,_____________。 7.android的數(shù)據(jù)存儲(chǔ)的方式____________,___________,________ ,_______-,________。 8.當(dāng)啟動(dòng)一個(gè)Activity并且新的Activity執(zhí)行完后需要返回到啟動(dòng)它的Activity來(lái)執(zhí)行的回調(diào)函數(shù)是_____________()。 9.請(qǐng)使用命令行的方式創(chuàng)建一個(gè)名字為myAvd,sdk版本為2.2,sd卡是在d盤的根目錄下,名字為scard.img,并指定屏幕大小HVGA.____________________________________。 10.程序運(yùn)行的結(jié)果是:_______________。 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'; } } 三 簡(jiǎn)答編程題(共35分) 1簡(jiǎn)述Android應(yīng)用程序結(jié)構(gòu)是哪些?(7分) Android應(yīng)用程序結(jié)構(gòu)是:請(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表。 3.頁(yè)面上現(xiàn)有ProgressBar控件progressBar,請(qǐng)用書寫線程以10秒的的時(shí)間完成其進(jìn)度顯示工作。(10分)第三篇:Android最全的面試題總結(jié)
第四篇:Android面試題總結(jié)強(qiáng)勁版(三)
第五篇:Android面試題(十一)