Android開發面試經——4.常見Android進階筆試題(更新中...)

 

關注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359html

上一篇文章咱們已經瞭解了Android筆試的一些基礎題目, 
[《Android開發面試經——2.常見Android基礎筆試題》 ] 
(http://blog.csdn.net/finddreams/article/details/44219231
筆試完,就是面試官問你問題了,相比筆試,面試咱們每每會有些許緊張,由於不知道面試官會問什麼奇怪的問題,要是問的問題恰好不懂,這時就更加頭皮發麻了。爲了能在面試提問中取得一個滿意的表現,我特別整理了一下常見的面試官提的技術問題: 
Android開發面試經——5.常見面試官提問Android題① 
Android開發面試經——6.常見面試官提問Android題②(更新中…)java

可是作爲一個有經驗的開發者,僅僅知道基礎題仍是不夠的,你的簡歷上說有兩年以上工做經驗的話,那面試官確定會問一些深刻性的問題,看你可否回答的出。因此爲了找一個更好的工做,咱們還須要去了解一下Android進階的筆試題目:android

1.什麼是ANR,如何避免? 
ANR:Application Not Responding。 
在 Android 中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列狀況時,Android 就會顯示 ANR 對話框了: 
①.用戶對應用程序的操做(如輸入事件,按鍵、觸摸屏事件)在5秒內無響應 
②. 廣播接受器(BroadcastReceiver)在10秒內仍未執行完畢 
Android 應用程序徹底運行在一個獨立的線程中(例如 main)。這就意味着,任何在主 線程中運行的,須要消耗大量時間的操做都會引起 ANR。由於此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intentbroadcast)。 
避免方法:Activity 應該在它的關鍵生命週期方法(如 onCreate()和 onResume())裏儘量少的去作建立操做, 
潛在的耗時操做。例如網絡或數據庫操做,或者高耗時的計算如改變位圖尺寸,應該在子線程裏(或者異步方式)來完成。 
主線程應該爲子線程提供一個 Handler,以便完成時可以提交給主線程。面試

2.Handler機制原理? 
andriod 提供了 Handler 和 Looper 來知足線程間的通訊。Handler 先進先出原則。 
Looper 類用來管理特定線程內對象之間的消息交換 (MessageExchange)。 
1)Looper: 一個線程能夠產生一個 Looper 對象,由它來管理此線程裏的 MessageQueue(消息隊列)。 
2)Handler: 你能夠構造 Handler 對象來與 Looper 溝通,以便 push 新消息到 MessageQueue 裏;或者接收 Looper 從 MessageQueue 取出)所送來的消息。 
3) Message Queue(消息隊列 ): 用來存放線程放入的消息。 
4)線程: UI thread 一般就是 main thread, 而 Android 啓動程序時會替它創建一個 MessageQueue。數據庫

3.請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係。 
簡單的說,Handler獲取當前線程中的 looper對象,looper 用來從存放 Message 的 MessageQueue中取出 Message,再有 Handler 進行 Message 的分發和處理. 
Message Queue(消息隊列): 用來存放經過 Handler 發佈的消息, 一般附屬於某一個建立它的線程,能夠經過 Looper.myQueue()獲得當前線程的消息隊列 
Handler:能夠發佈或者處理一個消息或者操做一個 Runnable,經過 Handler發佈消息, 消息將只會發送到與它關聯的消息隊列,然也只能處理該消息隊列中的消息 
Looper:是 Handler 和消息隊列之間通信橋樑,程序組件首先經過 Handler 把消息傳遞給 Looper,Looper 把消息放入隊列。Looper 也把消息隊列裏的消息廣播給全部的 
Handler:Handler 接受到消息後調用 handleMessage進行處理 
Message:消息的類型,在 Handler 類中的 handleMessage 方法中獲得單個的消息進行處理 
在單線程模型下, 爲了線程通訊問題, Android 設計了一個 Message Queue(消息隊列), 線程間能夠經過該 Message Queue 並結合 Handler 和 Looper 組件進行信息交換。 
下面將對它 們進行分別介紹: 
1. Message 
Message 消息,理解爲線程間交流的信息,處理數據後臺線程須要更新 UI ,則發送Message 內含一些數據給 UI 線程。 
2. Handler 
Handler處理者,是 Message 的主要處理者,負責 Message 的發送,Message 內容的執行處理。後臺線程就是經過傳進來的 Handler對象引用來 sendMessage(Message)。 
而使用 Handler,須要 implement 該類的 handleMessage(Message)方法,它是處理這些 
Message 的操做內容,例如 Update UI 。一般須要子類化 Handler 來實現 handleMessage方法。 
3. Message Queue 
Message Queue 消息隊列,用來存放經過 Handler 發佈的消息,按照先進先出執行。每一個 message queue 都會有一個對應的 Handler。Handler 會向 messagequeue 經過兩種方法發送消息:sendMessage 或 post。這兩種消息都會插在 message queue 隊尾並 
按先進先出執行。但經過這兩種方法發送的消息執行的方式略有不一樣:經過 sendMessage發送的是一個 message 對象,會被 Handler 的 handleMessage()函數處理;而經過 post 方法發送的是一個 runnable 對象,則會本身執行。 
4. Looper 
Looper 是每條線程裏的 Message Queue 的管家。Android 沒有 Global 的MessageQueue,而 Android 會自動替主線程(UI 線程)創建 Message Queue,但在子線程裏並無創建 Message Queue。 因此調用 Looper.getMainLooper()獲得的主線程的 Looper 不爲 NULL,但調用 Looper.myLooper()獲得當前線程的 Looper 就有可能爲 NULL。編程

4.Android 中線程與線程,進程與進程之間如何通訊 
一、一個 Android 程序開始運行時,會單獨啓動一個 Process。 
默認狀況下,全部這個程序中的 Activity 或者 Service 都會跑在這個 Process。 
默認狀況下,一個 Android 程序也只有一個 Process,但一個 Process 下卻能夠有許多個 Thread。 
二、一個 Android 程序開始運行時,就有一個主線程 MainThread 被建立。該線程主要負責 UI 界面的顯示、更新和控件交互,因此又叫 UI Thread。 
一個 Android 程序建立之初,一個 Process 呈現的是單線程模型–即 Main Thread, 
全部的任務都在一個線程中運行。因此,Main Thread 所調用的每個函數,其耗時應該 
越短越好。而對於比較費時的工做,應該設法交給子線程去作,以免阻塞主線程(主線程被阻塞,會致使程序假死 現象) 。 
三、Android 單線程模型:Android UI 操做並非線程安全的而且這些操做必須在 UI 線程中執行。若是在子線程中直接修改 UI,會致使異常。 
4.Android 的 的 IPC ( 進程間通訊 ) 機制 
IPC 是內部進程通訊的簡稱, 是共享 」 命名管道 」 的資源。Android 中的 IPC機制是爲了讓 
Activity 和 Service之間能夠隨時的進行交互,故在 Android 中該機制,只適用於 Activity 和 Service之間的通訊,相似於遠程方法調用,相似於 C/S 模式的訪問。經過定義 AIDL 接口文件來定義 IPC 接口。Servier 端實現 IPC接口,Client 端調用 IPC接口本地代理。安全

5.Android應用程序框架 
這裏寫圖片描述 
這裏寫圖片描述markdown

6.View, surfaceView, GLSurfaceView的區別 
View 是最基礎的,必須在 UI 主線程內更新畫面,速度較慢。 
SurfaceView 是 view 的子類,相似使用雙緩機制,在新的線程中更新畫面因此刷新界面速度比 view 快 GLSurfaceView 是 SurfaceView 的子類,opengl 專用的。 
區別:SurfaceView是從View基類中派生出來的顯示類,直接子類有GLSurfaceView和VideoView,能夠看出GL和視頻播放以及Camera攝像頭通常均使用SurfaceView 
SurfaceView和View最本質的區別在於,surfaceView是在一個新起的單獨線程中能夠從新繪製畫面而View必須在UI的主線程中更新畫面。 
那麼在UI的主線程中更新畫面 可能會引起問題,好比你更新畫面的時間過長,那麼你的主UI線程會被你正在畫的函數阻塞。那麼將沒法響應按鍵,觸屏等消息。 
當使用surfaceView 因爲是在新的線程中更新畫面因此不會阻塞你的UI主線程。但這也帶來了另一個問題,就是事件同步。好比你觸屏了一下,你須要surfaceView中thread處理,通常就須要有一個event queue的設計來保存touch event,這會稍稍複雜一點,由於涉及到線程同步。網絡

7. AIDL的全稱是什麼?如何工做? 
AIDL 全稱 Android Interface Definition Language(Android 接口描述語言)是一種接口描述語言 ; 編譯器能夠經過 aidl文件生成一段代碼, 經過預先定義的接口達到兩個進程內 
部通訊進程跨界對象訪問的目的.AIDL 的 IPC 的機制和 COM 或 CORBA 相似 , 是基於接口的, 但它是輕量級的。 它使用代理類在客戶端和實現層間傳遞值 . 若是要使用 AIDL, 須要完成2件事情 : 
1. 引入AIDL的相關類 .; 
2. 調用 aidl產生的 class.理論上 , 參數能夠傳遞基本數據類型和String, 還有就是Bundle的派生類 
當A進程要去調用B進程中的service時,並實現通訊,咱們一般都是經過AIDL來操做的 。 
A工程: 
首先咱們在net.blogjava.mobile.aidlservice包中建立一個RemoteService.aidl文件,在裏面咱們自定義一個接口,含有方法get。ADT插件會在gen目錄下自動生成一個RemoteService.Java文件,該類中含有一個名爲RemoteService.stub的內部類,該內部類中含有aidl文件接口的get方法。 
說明一:aidl文件的位置不固定,能夠任意 
而後定義本身的MyService類,在MyService類中自定義一個內部類去繼承RemoteService.stub這個內部類,實現get方法。在onBind方法中返回這個內部類的對象,系統會自動將這個對象封裝成IBinder對象,傳遞給他的調用者。 
其次須要在AndroidManifest.xml文件中配置MyService類,代碼以下:

<!-- 註冊服務 --> <service android:name=".MyService"> <intent-filter> <!-- 指定調用AIDL服務的ID --> <action android:name="net.blogjava.mobile.aidlservice.RemoteService" /> </intent-filter> </service>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

爲何要指定調用AIDL服務的ID,就是要告訴外界MyService這個類可以被別的進程訪問,只要別的進程知道這個ID,正是有了這個ID,B工程才能找到A工程實現通訊。 
說明:AIDL並不須要權限 
B工程: 
首先咱們要將A工程中生成的RemoteService.java文件拷貝到B工程中,在bindService方法中綁定aidl服務 
綁定AIDL服務就是將RemoteService的ID做爲intent的action參數。 
說明:若是咱們單獨將RemoteService.aidl文件放在一個包裏,那個在咱們將gen目錄下的該包拷貝到B工程中。若是咱們將RemoteService.aidl文件和咱們的其餘類存放在一塊兒,那麼咱們在B工程中就要創建相應的包,以保證RmoteService.java文件的報名正確,咱們不能修改RemoteService.java文件 
bindService(new Inten(「net.blogjava.mobile.aidlservice.RemoteService」), serviceConnection, Context.BIND_AUTO_CREATE); 
ServiceConnection的onServiceConnected(ComponentName name, IBinder service)方法中的service參數就是A工程中MyService類中繼承了RemoteService.stub類的內部類的對象。

8.關於AndroidOOM,以及如何避免? 
Android的虛擬機是基於寄存器的Dalvik,它的最大堆大小通常是16M,有的機器爲24M。所以咱們所能利用的內存空間是有限的。若是咱們的內存佔用超過了必定的水平就會出現OutOfMemory的錯誤。 
①.爲何會出現內存不夠用的狀況呢?我想緣由主要有兩個:因爲咱們程序的失誤,長期保持某些資源(如Context)的引用,形成內存泄露,資源形成得不到釋放。保存了多個耗用內存過大的對象(如Bitmap),形成內存超出限制。 
② .如何避免優化? 
一、應該儘可能避免static成員變量引用資源耗費過多的實例,好比Context。Context儘可能使用Application Context,由於Application的Context的生命週期比較長,引用它不會出現內存泄露的問題。使用WeakReference代替強引用。好比可使用WeakReference mContextRef; 
二、線程也是形成內存泄露的一個重要的源頭。線程產生內存泄露的主要緣由在於線程生命週期的不可控。將線程的內部類,改成靜態內部類。三、Bitmap問題:能夠說出現OutOfMemory問題的絕大多數人,都是由於Bitmap的問題。由於Bitmap佔用的內存實在是太多了,它是一個「超級大胖子」,特別是分辨率大的圖片,若是要顯示多張那問題就更顯著了。 
如何解決Bitmap帶給咱們的內存問題? 
及時的銷燬。  雖然,系統可以確認Bitmap分配的內存最終會被銷燬,可是因爲它佔用的內存過多,因此極可能會超過java堆的限制。所以,在用完Bitmap時,要及時的recycle掉。recycle並不能肯定當即就會將Bitmap釋放掉,可是會給虛擬機一個暗示:「該圖片能夠釋放了」。設置必定的採樣率。  有時候,咱們要顯示的區域很小,沒有必要將整個圖片都加載出來,而只須要記載一個縮小過的圖片,這時候能夠設置必定的採樣率,那麼就能夠大大減少佔用的內存。以下面的代碼: BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2;//圖片寬高都爲原來的二分之一,即圖片爲原來的四分之一。 
四、巧妙的運用軟引用(SoftRefrence)  有些時候,咱們使用Bitmap後沒有保留對它的引用,所以就沒法調用Recycle函數。這時候巧妙的運用軟引用,可使Bitmap在內存快不足時獲得有效的釋放 
五、及時釋放Cursor; 
六、儘可能使用9path圖片。Adapter要使用convertView複用等等;

9. AsyncTask 的介紹 
在開發 Android 移動客戶端的時候每每要使用多線程來進行操做, 咱們一般會將耗時的操做放在單獨的線程執行, 避免其佔用主線程而給用戶帶來很差的用戶體驗。 可是在子線程中沒法 去操做主線程(UI 線程) ,在子線程中操做 UI 線程會出現錯誤。所以 android 提供了一個類 Handler 來在子線程中來更新 UI 線程,用發消息的機制更新 UI 界面,呈現給用戶。 這樣就解決了子線程更新 UI 的問題。可是費時的任務操做總會啓動一些匿名的子線程,太多的子線程給系統帶來巨大的負擔,隨之帶來一些性能問題。所以 android 提供了一個工具類AsyncTask,顧名思義異步執行任務。這個 AsyncTask 生來就是處理一些後臺的比較耗時的任務,給用戶帶來良好用戶體驗的,從編程的語法上顯得優雅了許多,再也不須要子線程和Handler就能夠完成異步操做而且刷新用戶界面。

10.說說mvc模式的原理,它在android中的運用 
答:android的官方建議應用程序的開發採用mvc模式。何謂mvc? 
 mvc是model,view,controller的縮寫,mvc包含三個部分: 
  l、模型(model)對象:是應用程序的主體部分,全部的業務邏輯都應該寫在該層。 
  二、視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶惟一能夠看到的一層,接收用戶的輸入,顯示處理結果。 
  三、控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,想用用戶出發的相關事件,交給m處理。 
 android鼓勵弱耦合和組件的重用,在android中mvc的具體體現以下: 
1)視圖層(view):通常採用xml文件進行界面的描述,使用的時候能夠很是方便的引入,固然,如何你對android瞭解的比較的多了話,就必定 能夠想到在android中也可使用JavaScript+html等的方式做爲view層,固然這裏須要進行java和javascript之間的通 信,幸運的是,android提供了它們之間很是方便的通訊實現。 
 2)控制層(controller):android的控制層的重 任一般落在了衆多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要經過activity交割model業務邏輯層處理, 這樣作的另一個緣由是android中的acitivity的響應時間是5s,若是耗時的操做放在這裏,程序就很容易被回收掉。 
 3)模型層(model):對數據庫的操做、對網絡等的操做都應該在model裏面處理,固然對業務計算等操做也是必須放在的該層的。 
  
 11.根據本身的理解描述下Android數字簽名。 
答:(1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序 
(2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證 
(3)若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。 
(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能

12. 談談對 Android NDK 的理解 
NDK 全稱:Native Development Kit。 
一、NDK 是一系列工具的集合。 * NDK 提供了一系列的工具,幫助開發者快速開發 C(或 C++)的動態庫,並能自動將 so 和 java 應用 
一塊兒打包成 apk。這些工具對開發者的幫助是巨大的。 * NDK 集成了交叉編譯器,並提供了相應的 mk 文件隔離 CPU、平臺、ABI 等差別,開發人員只須要簡單修改 mk 文件(指出「哪些文件須要編譯」、「編譯特性要求」等) ,就能夠建立出 so。 * NDK 能夠自動地將 
so 和 Java 應用一塊兒打包,極大地減輕了開發人員的打包工做。 
二、NDK 提供了一份穩定、功能有限的 API 頭文件聲明。 Google 明確聲明該 API 是穩定的,在後續全部版本中都穩定支持當前發佈的 API。從該版本的 NDK 中看出,這些 API 支持的功能很是有限, 
包含有:C 標準庫(libc) 、標準數學庫(libm) 、壓縮庫(libz) 、Log 庫(liblog) 。

13.ViewStub的應用 
在開發應用程序的時候,常常會遇到這樣的狀況,會在運行時動態根據條件來決定顯示哪一個View或某個佈局。那麼最一般的想法就是把可能用到的View都寫在上面,先把它們的可見性都設爲View.GONE,而後在代碼中動態的更改它的可見性。這樣的作法的優勢是邏輯簡單並且控制起來比較靈活。可是它的缺點就是,耗費資源。雖然把View的初始可見View.GONE可是在Inflate佈局的時候View仍然會被Inflate,也就是說仍然會建立對象,會被實例化,會被設置屬性。也就是說,會耗費內存等資源。 
推薦的作法是使用android.view.ViewStub,ViewStub是一個輕量級的View,它一個看不見的,不佔佈局位置,佔用資源很是小的控件。能夠爲ViewStub指定一個佈局,在Inflate佈局的時候,只有ViewStub會被初始化,而後當ViewStub被設置爲可見的時候,或是調用了ViewStub.inflate()的時候,ViewStub所向的佈局就會被Inflate和實例化,而後ViewStub的佈局屬性都會傳給它所指向的佈局。這樣,就可使用ViewStub來方便的在運行時,要仍是不要顯示某個佈局。 
但ViewStub也不是萬能的,下面總結下ViewStub能作的事兒和何時該用ViewStub,何時該用可見性的控制。 
首先來講說ViewStub的一些特色: 
1. ViewStub只能Inflate一次,以後ViewStub對象會被置爲空。按句話說,某個被ViewStub指定的佈局被Inflate後,就不會夠再經過ViewStub來控制它了。 
2. ViewStub只能用來Inflate一個佈局文件,而不是某個具體的View,固然也能夠把View寫在某個佈局文件中。 
基於以上的特色,那麼能夠考慮使用ViewStub的狀況有: 
1. 在程序的運行期間,某個佈局在Inflate後,就不會有變化,除非從新啓動。 
由於ViewStub只能Inflate一次,以後會被置空,因此沒法期望後面接着使用ViewStub來控制佈局。因此當須要在運行時不止一次的顯示和隱藏某個佈局,那麼ViewStub是作不到的。這時就只能使用View的可見性來控制了。 
2. 想要控制顯示與隱藏的是一個佈局文件,而非某個View。 
由於設置給ViewStub的只能是某個佈局文件的Id,因此沒法讓它來控制某個View。 
因此,若是想要控制某個View(如Button或TextView)的顯示與隱藏,或者想要在運行時不斷的顯示與隱藏某個佈局或View,只能使用View的可見性來控制。

 
11
2
相關文章
相關標籤/搜索