天天看點

andrid面試題

下面的題目都是樓主在android交流群大家面試時遇到的,如果大家有好的題目或者好的見解歡迎分享,樓主将長期維護此帖。

某公司進階面試題(2015-03-14)【感謝helder分享】

1、詳述android系統架構,包括層與層之間調用、binder、jni、底層檔案讀寫方法

2、描述自己的一個項目,要求畫出結構圖,uml圖,較長的描述項目種的技術點,技術難點以及解決方案

3、一道算法

4、談談自己項目管理的方法、對靈活軟體開發的了解

基礎面試題(2014-04-18)

1、請解釋下在單線程模型中message,handler,message queue,looper之間的關系。

拿主線程來說,主線程啟動時會調用looper.prepare()方法,會初始化一個looper,放入threadlocal中,接着調用looper.loop()不斷周遊message queue,

handler的建立依賴與目前線程中的looper,如果目前線程沒有looper則必須調用looper.prepare()。handler , sendmessage到messagequeue,looper不斷

從messagequeue中取出消息,回調handlemessage方法。

2、如果有個100m大的檔案,需要上傳至伺服器中,而伺服器form表單最大隻能上傳2m,可以用什麼方法。

這個問題不是很明确我覺得,首先來說使用http協定上傳資料,特别在android下,跟form沒什麼關系。傳統的在web中,在form中寫檔案上傳,其實浏覽器所做

的就是将我們的資料進行解析組拼成字元串,以流的方式發送到伺服器,且上傳檔案用的都是post方式,post方式對大小沒什麼限制。

回到題目,可以說假設每次真的隻能上傳2m,那麼可能我們隻能把檔案截斷,然後分别上傳了。

3、記憶體溢出和記憶體洩漏有什麼差別?何時會産生記憶體洩漏?記憶體優化有哪些方法?

記憶體溢出通俗了解就是軟體(應用)運作需要的記憶體,超出了它可用的最大記憶體。

記憶體洩漏就是我們對某一記憶體空間的使用,使用完成後沒有釋放。

記憶體優化:android中容易記憶體溢出的部分,就是圖檔的加載,我們可以使用圖檔的壓縮加上使用lrucache緩存的目的來控制圖檔所能夠使用的記憶體。

還有對于比較耗資源的對象及時的關閉,例如database conn , 各種傳感器 , service 等等。

4、asynctask使用在哪些場景?它的缺陷是什麼?如何解決?

asynctask 運用的場景就是我們需要進行一些耗時的操作,耗時操作完成後更新主線程,或者在操作過程中對主線程的ui進行更新。

缺陷:asynctask中維護着一個長度為128的線程池,同時可以執行5個工作線程,還有一個緩沖隊列,當線程池中已有128個線程,緩沖隊列已滿時,如果

此時向線程送出任務,将會抛出rejectedexecutionexception。

解決:由一個控制線程來處理asynctask的調用判斷線程池是否滿了,如果滿了則線程睡眠否則請求asynctask繼續處理。

5、activity用sharedpreferences儲存資料,大小有木有限制?

這個真心查不到。。。

6、activity間通過intent傳遞資料大小有沒有限制?

貌似是40k。

7、assest檔案夾裡放檔案,對于檔案的大小有沒有限制?22

assets目錄更像一個附錄類型的目錄,android不會為這個目錄中的檔案生成id并儲存在r類當中,是以它與android中的一些類和方法相容度更低。

同時,由于你需要一個字元串路徑來擷取這個目錄下的檔案描述符,通路的速度會更慢。但是把一些檔案放在這個目錄下會使一些操作更加友善,

比方說拷貝一個資料庫檔案到系統記憶體中。要注意的是,你無法在android xml檔案中引用到assets目錄下的檔案,隻能通過assetmanager來通路

這些檔案。資料庫檔案和遊戲資料等放在這個目錄下是比較合适的。另外,網上關于assets和raw的資料都千篇一律了,是以關于這兩者中單個檔案

大小不能超過1m的**錯誤**描述也在傳播,即如果讀取超過1m的檔案會報"data exceeds uncompress_data_max (1314625 vs 1048576)"的

ioexception,還引申出種種解決方案。個人認為不應該有這樣的限制,為了驗證這個說法寫了個demo,發現将近5m的壓縮包在assets和raw中

都能正常通路,是以在這裡糾正一下,理論上隻要打包不超過android apk 50m大小的限制都是沒有問題的。當然了,不排除是android很早期的

時候因為裝置硬體原因aapt在編譯的時候對這兩個檔案夾大小做出了限制,如果是這樣,較新版的adt應該不會出現這種情況。

來自:http://my.eoe.cn/futurexiong/archive/5350.html

8、 啟動一個程式,可以主界面點選圖示進入,也可以從一個程式中跳轉過去,二者有什麼差別?

是因為啟動程式(主界面也是一個app),發現了在這個程式中存在一個設定為<category android:name="android.intent.category.launcher" />的activity,

是以這個launcher會把icon提出來,放在主界面上。當使用者點選icon的時候,發出一個intent:

intent intent = mactivity.getpackagemanager().getlaunchintentforpackage(packagename);

mactivity.startactivity(intent);   

跳過去可以跳到任意允許的頁面,如一個程式可以下載下傳,那麼真正下載下傳的頁面可能不是首頁(也有可能是首頁),這時還是構造一個intent,startactivity.

這個intent中的action可能有多種view,download都有可能。系統會根據第三方程式向系統注冊的功能,為你的intent選擇可以打開的程式或者頁面。是以唯一的一點

不同的是從icon的點選啟動的intent的action是相對單一的,從程式中跳轉或者啟動可能樣式更多一些。本質是相同的。

9、程式之間的親和性的了解。

1、預設情況下一個應用的所有activity都是具有相同的affinity,都是從application中繼承,application的affinity預設就是manifest的包名。

2、affinity對activity來說,就像是身份證一樣,可以告訴所在的task,自己屬于其中的一員。

3、應用場合:

a:根據affinity重新為activity選擇合适的宿主task;

b:與allowtaskreparenting屬性配合;

c:啟動activity使用intent設定了flag_activity_new_task标記。

10、同一個程式,但不同的activity是否可以放在不同的task任務棧中?

可以放在不同的task中。需要為不同的activity設定不同的affinity屬性,啟動activity的intent需要包含flag_activity_new_task标記。

11、橫豎屏切換時候activity的生命周期。

1、不設定activity的android:configchanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設定activity的android:configchanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時隻會執行一次

3、設定activity的android:configchanges="orientation|keyboardhidden"時,切屏不會重新調用各個生命周期,隻會執行onconfigurationchanged方法

12、aidl的全稱是什麼?如何工作?

全稱是:android interface define language

在android中, 每個應用程式都可以有自己的程序. 在寫ui應用的時候, 經常要用到service. 在不同的程序中, 怎樣傳遞對象呢? 顯然, java中不允許跨程序記憶體共享.

 是以傳遞對象, 隻能把對象拆分成作業系統能了解的簡單形式, 以達到跨界對象通路的目的. 在j2ee中,采用rmi的方式, 可以通過序列化傳遞對象. 在android中, 則

采用aidl的方式. 理論上aidl可以傳遞bundle,實際上做起來卻比較麻煩。

aidl(android接口描述語言)是一種借口描述語言; 編譯器可以通過aidl檔案生成一段代碼,通過預先定義的接口達到兩個程序内部通信程序的目的. 如果需要

在一個activity中, 通路另一個service中的某個對象, 需要先将對象轉化成aidl可識别的參數(可能是多個參數), 然後使用aidl來傳遞這些參數, 在消息的接收端, 使用

這些參數組裝成自己需要的對象.aidl的ipc的機制和com或corba類似, 是基于接口的,但它是輕量級的。它使用代理類在用戶端和實作層間傳遞值. 如果要使用aidl, 

需要完成2件事情: 1. 引入aidl的相關類.; 2. 調用aidl産生的class.

aidl的建立方法:

aidl文法很簡單,可以用來聲明一個帶一個或多個方法的接口,也可以傳遞參數和傳回值。 由于遠端調用的需要, 這些參數和傳回值并不是任何類型.

下面是些aidl支援的資料類型:

1. 不需要import聲明的簡單java程式設計語言類型(int,boolean等)

2. string, charsequence不需要特殊聲明

3. list, map和parcelables類型, 這些類型内所包含的資料成員也隻能是簡單資料類型, string等其他比支援的類型.

(另外: 我沒嘗試parcelables, 在eclipse+adt下編譯不過, 或許以後會有所支援

13、dvm的程序和linux的程序, 應用程式的程序是否為同一個概念

      dvm的程序是dalivk虛拟機程序,每個android程式都運作在自己的程序裡面,每個android程式系統都會給他配置設定一個單獨的liunx uid(user id),

每個dvm都是linux裡面的一個程序.是以說這兩個程序是一個程序.

繼續閱讀