Android 面試精華題目總結_Android

來源:互聯網
上載者:User

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

某公司進階面試題(2015-03-14)【感謝helder分享】
1、詳述Android系統架構,包括層與層之間調用、binder、jni、底層檔案讀寫方法
2、描述自己的一個項目,要求畫出結構圖,UML圖,詳細描述項目種的技術點,技術痛點以及解決方案
3、一道演算法
4、談談自己專案管理的方法、對敏捷式軟體開發 (Agile Software Development)的理解

基礎面試題(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檔案夾裡放檔案,對於檔案的大小有沒有限制?

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裡面的一個進程.所以說這兩個進程是一個進程.

轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/24015867

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.