Android開發經典筆試面試題彙總(持續更新中)

1.咱們都知道Handler是線程與Activity通訊的橋樑,假設線程處理不當。你的機器就會變得很是慢,那麼線程銷燬的方法是:(A)
A. onDestroy()
B. onClear()
C. onFinish()
D. onStop()

理解:正確銷燬線程的方法應該是handler.removeCallBacks()。

2.SharedPreferences保存文件的路徑和擴展名是:/data/data/package_name/shared_prefs/
*.xml.



3.Android的本身主動恢復功能能夠完畢?(D)
A.回覆地址簿
B.修復丟失的文字信息
C.回覆刪除的信息
D.恢復備份設置和數據來又一次安裝程序



4.爲知足線程間通訊,Android提供了(A)
A.Handler和Looper
B.Handler
C.Message Queue
D.Looper

理解:Android提供了Handler和Looper來知足線程間通訊,Handler先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(MessageExchange)。
1)Looper:一個線程可以產生一個Looper對象。由他來管理此線程裏的MEssageQueue(消息隊列)
2)Handler:可以構造Handler對象來與Looper溝通,以便push新消息到MessageQueue,或者接收Looper從Message Queue取出所送來的消息。
3)Message Queue:用來存放線程放入的消息;
4)UIThread就是主線程,Android啓動時會創建一個MessageQueue.




5.如下哪一種進程最重要,最後被銷燬?(D)
A.服務進程
B.後臺進程
C.可見進程
D.前臺進程

理解:重要性依次是:前臺進程、可見進程、服務進程、後臺進程、空進程。因此銷燬的順序爲逆方向。





6.在Android中,在屏幕密度爲160時,1pt大概等於(B)sp。
A.1.22
B.2.22
C.2.12
D.1.12

理解:在Android中,1pt大概等於2.22sp。
Android支持下列所有單位:
1)px (像素):屏幕上的點;
2)in(英寸):長度單位;
3)mm(毫米):長度單位;
4)pt(磅):1/72英寸
5)dp(與密度無關的像素):一種基於屏幕密度的抽象單位。java

在每英寸160點的顯示器上,1dp=1px;
6)dip  (同dp)
7)sp (與刻度無關的像素):與dp相似,但是可以依據用戶字體大小首選項進行縮放。android




Apk的資源包中:
當屏幕density=240時。使用hdpi標籤的資源。
當屏幕density=160時,使用mdpi標籤的資源。
當屏幕density=120時。使用ldpi標籤的資源;

(1)在屏幕密度爲160時,1dp=1px=1dip,    1pt=160/72sp,      1pt=1/72英寸。
(2)當屏幕密度爲240時,1dp=1dip=1.5px




7.經過Intent傳遞一些二進制數據的方法:
1)使用Serializable接口實現序列化,這是java常用的方法;
2)實現Parcelable接口,這裏Android的部分分類比方Bitmap類已經實現了,同一時候Parcelable在Android  AIDL中交換數據也非常常見。



8.如下屬於Android的動畫分類的有?(A B)
A. Tween
B. Frame
C. Draw
D. Animation

理解:Tween動畫,可以使視圖組件移動、縮放、旋轉、透明度變化;
Frame動畫:經過順序的播放排列好的圖片來實現,相似電影;



9.下列關於數據持久化的描寫敘述正確的有:(BD)
A. 在內存中緩存多個Bitmap對象是一種數據持久化方法
B. SQLite數據庫文件可以保存在SD卡中
C. ContentProvider的主要目的是爲了將Android應用的數據持久化
D. 數據持久化就是將內存的數據保存到外存




10.將一個Activity設置成窗體樣式,僅僅需要設置Theme就能夠。


11.Intent傳遞數據時。下列的數據類型不可以被傳遞的是(D)
A. Serializable
B. File
C. Parcelable
D. Thread



12.Android DVM的進程和Linux的進程,下面說法錯誤的是(D)
A.它們都是進程的一種
B. dvm是Android的虛擬機
C. Linux的進程是程序的詳細實現。是運行程序的過程
D. dvm中可以建立多個進程來處理應用間的同步問題


理解:每一個Android應用程序都在它本身的進程中執行。都擁有一個獨立的Dalvik虛擬機實例,每一個DVM都是在Linux中的一個進程。git




13.Toast顯示時長默認僅僅有2種,分別爲Toast.LENGTH_LONG和Toast.LENGTH_SHORT.
分別爲2s和3.5s。其它的值都是無效的。github


API文檔儘管寫的第三個參數是時間。但是Framework作了重定義,限定了2s和3.5s兩個值。



14.下列哪些狀況下,系統可能會彈出ANR對話框(ABC)
A.在Activity中,Main線程消息隊列中的消息在5s內沒有獲得對應
B.在Service中,onStartCommand()方法運行超過5s
C.在BroadcastReceive中。onReceive()方法運行時間超過10s
D.在啓動的新線程中。run()方法運行時間超過5s

理解:ANR:Application Not Responsing
1)UI線程堵塞時間超過5s會ANR。
2)Service屬於主線程,耗時操做要開啓子線程
3)在BroadcastReceive中,onReceive的生命週期爲10s,因此裏面的操做不能超過10s



15.在Android中使用Menu時可能需要重寫的方法有(AC)
A. onCreateOptionsMenu()
B. onCreateMenu()
C. onOptionsItemSelected()
D. onItemSelected()

理解:一個是建立菜單的方法,一個是菜單項點擊事件的方法。


16.下列關於IntentService與Service的關係描寫敘述錯誤的是(CD)
A. IntentService是Service的子類
B. IntentService在執行時會啓動新的線程來執行任務
C. 啓動方式不一樣
D.沒有差異

理解:IntentService是繼承Service的,包括了Service的全部特性,也包括了Service的生命週期,那麼與Service不一樣的是。IntentService在運行onCreate()操做時候,內部開了一個線程,去運行耗時操做。

IntentService和Service的啓動方式一樣。都是經過startService()方法。數據庫





17.在多個應用中讀取共享存儲數據時,需要用到query()方法,這是哪一個對象的方法(A)
A. ContentResolver
B. ContentProvider
C. Cursor
D. SQLiteHelper

理解:ContentResolver和ContentProvider是一對。緩存

一個執行在提供數據端(provider),一個執行在調用端(resolver).使用的時候利用resolver(query,insert,update)來調用provider的方法。而後provider再進行數據查詢。


18.關於ServiceConnection接口的onServiceConnected()方法的觸發條件描寫敘述正確的是(B)
A. bindService()方法運行成功後
B. bindService()方法運行成功同一時候onBInd()方法返回非空IBinder對象
C. Service的onCreate()方法和onBind()方法運行成功後
D. Service的onCreate()和onStartCommand()方法啓動成功後


19.Android中使用SQLiteOpenHelper這個輔助類時。可以生成一個數據庫,並可以對數據庫版本號進行管理的方法可以是(AB)
A. getWriteableDatabase()
B. getReadableDatabase()
C. getDatabase()
D. getAbleDatabase()



20.下面關於Toast說法正確的是(BD)
A. Toast能編輯
B. Toast沒有焦點
C. Toast可以得到用戶輸入
D. Toast僅僅能持續一段時間

理解:Toast可以由程序猿本身定義,但是用戶是不能編輯的。用戶也沒法輸入。併發


注意:可編輯和本身定義的概念是不一樣的。

Toast和Dialog不一樣,Toast是沒有焦點的。



21.在一個ListView中。顯示的佈局有多種不一樣的形式。好比某些行僅僅有ImageView,而另一些行僅僅有TextView.需要重寫哪幾個方法?(ABCD)
A. getCount()
B. getItemId()
C. getItemViewType()
D. getViewTypeCount()




22.前臺進程(Foreground)最重要,一般最後被銷燬
與用戶當前正在作的事情密切相關。不一樣的應用程序組件能夠經過不一樣的方法使它的宿主進程移到前臺。當如下不論什麼一個條件知足時,能夠考慮將進程移到前臺:
1)進程正在執行一個與用戶交互的Activity,它的onResume()方法被調用
2)進程有一個Service,該Service相應的Activity正在與用戶交互
3)進程有一個Service被調用startForeground()方法,要求到前臺來運行
4)進程有一個Service,並且在Service的某個回調函數(onCreate(),onStart(),onDestroy())內有正在運行的代碼
5)進程有一正在執行的BroadcastReceiver,它的onReceive()方法正在執行。



23.如下關於Android中定義style和theme的描寫敘述正確的是(AD)
A.都可以下降反覆屬性設置
B. style可以做用在Activity上
C. theme可以繼承
D. 一個TextView的style中定義了textColor屬性。TextView自己也設置textColor屬性。那麼TextView自己定義的優先級較高。

理解:theme被final標記了。不能被繼承;



24.下列對Android NDK的理解正確的是(ABCD)
A. NDK是一系列工具的集合
B. NDK提供了一份穩定、功能有限的API頭文件聲明
C. 使「java+C」的開發方式最終轉正,成爲官方支持的開發方式
D. NDK將是Android平臺支持C開發的開端



25.如下那條語句可以構造正確的對話框(BC)
A. AlertDialog dialog = new AlertDialog(context)
B. AlertDialog.Builder builder = new AlertDialog.Builder(context)
C. ProgressDialog dialog = new ProgressDialog(context)
D. ProgressDialog.Builder builder = new ProgressDialog.Builder(context)

理解:AlertDialog的構造方法被聲明爲protected。因此不能直接使用new keyword來建立AlertDialog類的對象實例。要想建立AlertDialog對話框,需要使用Builder類,該類是AlertDialog類中定義的一個內嵌類。異步

所以必須建立AlertDialog.Builder類的對象實例。ide





26.下列哪些狀況系統會彈出Force Close對話框(BC)
A. 應用執行時,Main線程進行了耗時操做
B. 應用執行時拋出了OutOfMemoryError
C. 應用執行時拋出了RuntimeException
D. 應用執行時。用戶操做過於頻繁

理解:注意區分ANR 和 Force Close。
A D會致使ANR。



27.Android中MVC模式C層指的是?(A)
A. Activity
B. Service
C. Content
D. Intent

理解:Android控制層的任務通常就是Activity來完畢。
視圖層相應了Android中的View,也可以理解爲佈局或者控件。


28.RemoteView在哪些功能中使用?(BD)
A. Toast
B. AppWidget
C. ListView
D. Notification


29.關於BroadcastReceiver的說法不對的是(B)
A. 是用來接收廣播Intent的
B. 一個廣播Intent僅僅能被一個訂閱了此廣播的BroadcastReceiver所接收
C. 對有序廣播,系統會依據接收者聲明的優先級別按順序逐個運行接收者
D. 接收者聲明的優先級別在<intent-filter>的android:priority屬性中聲明,數值越大表示優先級越高。



30.Android系統對下列哪些對象提供了資源池(AC)
A. Message
B. Thread
C. Async Task
D. Looper

理解:
Message提供了消息池。有靜態方法Obtain從消息池中取對象;
Thread默認不提供資源池,除非使用線程池ThreadPool管理;
AsyncTask是線程池改造的,默認提供最多5個線程進行併發操做;
Looper建立時建立一個消息隊列和線程對象。也不是資源池;



31.Android中的R.java不可以手動改動。函數


 理解:本身主動生成,沒法改動。

改動後編譯器也會本身主動改回去。


32.Android DVM的進程和Linux的進程。應用程序的進程是否爲同一個概念?  【是】

理解:DVM指dalvik虛擬機,每個Android程序都有一個獨立的dvm實例,每個Android應用程序都在他本身的進程中執行。
而一個dvm實例都是做爲Linux的進程運行的。可以以爲是一個概念。

補充:Dalvik是Google公司本身設計用於Android平臺的java虛擬機。每一個Dalvik應用做爲一個獨立的Linux進程運行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。



33.下列關於Android數字簽名描寫敘述錯誤的是:(C)
A.所有的應用程序都必須有數字證書。Android系統不會安裝一個沒有數字證書的應用程序
B.Android程序包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證
C.假設要正式公佈一個Android程序,可以使用集成開發工具生成的調試證書來公佈
D.數字證書都是有有效期的。Android僅僅是在應用程序安裝的時候纔會檢查證書的有效期。假設程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。



理解:必須要使用一個合適的私鑰生成的數字證書給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來公佈。
因爲集成工具生成的調試證書不是一個包括開發人員信息,取得開發人員受權的有效私有密鑰。




34.Android中可以使用System.out.println(「 」);在控制檯顯示想要的內容嗎?【不能】

理解:使用System.out.println(「 」);語句輸出的內容也僅僅會出現在LogCat中。而不會出現在Console控制檯中。顯示的tag爲System.out


35.經過startService()和bindService()。下面說法錯誤的是:(C)
A.經過startService()啓動服務:會調用例如如下生命週期方法:onCreate()-onStart()-onDestroy()
B.當採用startService()方法啓動服務,訪問者與服務是沒有綁定在一塊兒的,訪問者退出,服務還在執行
C.假設是調用bindService()啓動服務:會調用例如如下生命週期方法:onCreate()-onBInd()-onDestroy()onUnbind()
D.採用bindService()方法啓動服務時, 訪問者與服務是綁定在一塊兒的,即訪問者退出,服務也就終止,解除綁定

理解:C:onCreate()onBind()onUnbind()onDestroy()


36.使用AIDL完畢遠程service方法調用下列說法不對的是(A)
A. AIDL相應的接口名稱不能與AIDL文件名稱一樣
B. AIDL的文件的額內容相似java代碼
C.建立一個Service(服務),在服務的onBind(Intent intent)方法中返回實現了AIDL接口的對象
D. AIDL相應的接口的方法前面不能加訪問權限修飾符

理解:AIDL相應的接口名稱必須與AIDL文件名稱一樣,不然沒法本身主動編譯;
AIDL相應的接口的方法不能加訪問權限修飾符


37.【騰訊2015春招移動client開發練習卷】
Android中Looper的實現原理,爲何調用Looper.prepare()就在當前線程關聯了一個Looper對象。它是怎樣實現的。



理解:
1)線程間通訊機制:首先,Looper,Handler,MessageQueue三者共同實現了Android系統裏線程間通訊機制。

如在A,B兩個子線程之間需要傳遞消息。首先給每個子線程綁定一套Handler,Looper,MessageQueue機制。而後這三個對象都與各自的線程相應。而後A線程經過調用B線程的Handler對象,發送消息。這個消息會被Handler發送到B線程的MessageQueue中, 而屬於B線程的Looper對象一直在循環無限遍歷MessageQueue,一旦發現該消息隊列裏收到新的消息,就會去對消息進行處理,處理過程當中會回調自身Handler,HandleMessage方法。從而實現了不一樣線程間通訊。

2)Looper實現原理:Looper類裏面包括一個消息隊列對象和一個線程對象。

當建立Looper時。會本身主動建立一個消息隊列,同一時候將內部線程對象指向建立Looper的線程。當開啓Looper後(Looper.loop()),會本身主動進入無限for循環中,不斷去遍歷消息隊列,假設沒有消息則堵塞,有消息則回調Handler的handleMessage()方法進行處理。



3)Looper.prepare():首先,要使用Looper機制一般會在當前線程中建立Handler對象,裏面會本身主動建立一個Looper對象和消息隊列,這裏面的消息隊列屬於當前線程空間。但此時的Looper還不會去遍歷。也沒有綁定到當前線程。

當中,Looper對象內部也包括一個空消息隊列對象和空線程。

經過Looper.prepare()方法,先讓該消息隊列指向當前線程的消息隊列。讓空線程也指向當前線程。從而實現了綁定。






38.【騰訊2015春招移動client開發練習卷】
簡述Android怎樣處理UI與耗時操做的通訊,有哪些方式及各自的優缺點。



理解:。。。

AsyncTask本質上是一個線程池。所有的異步任務都會在這個線程池中的工做線程中運行,當需要操做UI界面時,會和工做線程經過Handler傳遞消息。




github主頁:https://github.com/chenyufeng1991  。

歡迎你們訪問!

相關文章
相關標籤/搜索