Android ----------------- 面試題 整理 一
1. XML的解析方式都有哪些? 每一種解析方式的執行流程?
設XML為:abcc1
Dom SAX Pull
2.abcc1 以樹的方式展現應該是什麼樣子的
根節點 在上面
子節點和文本在下面
3. 設現有3個Activity,A1, A2, A3,如何? A1 啟動 A2, A2啟動A3後,由A3進行返回操作,直接可以返回到 A1? 舉出兩種方式?
Inflate
1 A1 – 》 A2-》 A3 A2 finish()
2 A2 不進回退站?(如何) A2 啟動 A3
3.2. 設現有3個Activity, A1, A2, A3,現由A1啟動A2,並且由A2返回複雜資料給A1, A1接收到資料後,啟動A3,並且傳遞相應的資料進行操作,應該如何??
startACTIVITYForRessult()
OnActivity Result() ->> A3 Intent Bundle 傳值
4. 設現有應用程式 App1, App2, 其中App2是圖書資源應用,App1是讀者應用,App1要擷取App2的圖書資料,應該採用什麼方式?能否通過App1刪除App2種的圖書資料?
A2 實現ContentProvider, 提供增刪改查,delete()
5. Android GCM的推送原理是什嗎?
用戶端後台有訊息接受的Service . Google提供推送的伺服器。
客戶單與伺服器保持長串連的關係。來接受推送的msg! 同時google的伺服器,
提供後台管理介面。給特定的裝置發送資訊。
------------------------------------------------------------------------------------------------------------------------------------------------
使用GCM服務(Google Cloud Messaging)
簡介:Google推出的雲Message Service,即第二代的C2DM。
優點:Google提供的服務、原生、簡單,無需實現和部署服務端。
缺點:Android版本限制(必須大於2.2版本),該服務在國內不夠穩定、需要使用者綁定Google帳號,受限於Google。
6. 現有應用程式App2,使用資料庫進行資料存放區,新發布版本App1.1那麼資料庫應該如何處理?如何儲存已有資料?
SqlLite: onCreateonUpdate() update用於升級,可以進行資料和表的操作。
在 onUpgrade()採用調整表結構不修改資料的方式來完成資料的升級?
7. 現需要實現一鬧鈴軟體,其鬧鈴定時功能需要如何??
1自訂: 後台啟動 service 驗證當前的時間,從資料庫中擷取鬧鐘的設定時間, 進行時間匹配,
OK 播放一段聲音。
2Android: 系統提供的AlermManager 可以通過相關API的進行操作。
8. FrameLayout與RelativeLayout的區別是什嗎?都適應於哪些情境?
FrameLayout 層的概念: 起重工所有的子控制項都是層疊的。
預設的情況下都是在左上方。
RelativeLayout 相對布局:
其中的所有子空間預設情況下都是在一層。
相對:控制項之間有相對的關係進項控制。
預設的情況下都是在左上方。
適應情境:
FrameLayout:多個控制項層疊在一起。例片上面加一個贊踩。
RelativeLayout: 主要用於快速的對其控制項的情況:例如: 一般的登陸介面。
RelativeLayout相對布局,就是裡面的控制項位置都可以用相對於誰在什麼地方來指定;
Framelayout幀布局
就是先定義的控制項會再後定義的控制項下面;FrameLayout主要是在多層之間的布局,RelativeLayout則是在同層之間不同位置之間的布局。
9. Fragment的作用是什嗎?如何使用?
作用:
介面內容的複用
如何:
當軟體中,多個介面或者一個介面中有多個部分相同是可以採用這個Fragment 封裝。
當前,使用Fragment 提高了代碼的重用性。
http://blog.csdn.net/yangdeli888/article/details/7842029
Fragment用來描述一些行為或一部分使用者介面在一個Activity中,你可以合并多個fragment在一個單獨的activity中建立多個UI面板,同時重用 fragment在多個activity中.你可以認為fragment作為一個activity中的一節模組,fragment有自己的生命週期,接收自己的輸入事件,你可以添加或移除從運行中的activity.
一個fragment必須總是嵌入在一個activity中,同時fragment的生命週期受activity而影響。
Fragment存在於Activity的ViewGroup中
onCreate()
當fragment建立時被調用,你應該初始化一些實用的組件,比如在fragment暫停或停止時需要恢複的
onCreateView()
當系統調用fragment在首次繪製使用者介面時,如果畫一個UI在你的fragment你必須返回一個View當然了你可以返回null代表這個fragment沒有UI.
9. HTTP協議中Cookie標準是什嗎?有什麼作用?
作用:
Cookie: 是用戶端與伺服器之間的會話維持以及 資料的傳遞(儲存資料)。
Cookie: 用戶端就收伺服器傳遞過來的Http 頭欄位 Set-Cookie 來擷取 伺服器傳遞的資訊。
用戶端發送Http 請求的時候,傳遞自身儲存的 伺服器傳遞的Cookie info。
內容的格式:
Name = value Path=/xxx domain=.Baidu.com
Cookies是一種能夠讓網站伺服器把少量資料儲存到用戶端的硬碟或記憶體,或是從用戶端的硬碟讀取資料的一種技術。Cookies是當你瀏覽某網站時,由Web伺服器置於你硬碟上的一個非常小的文字檔,它可以記錄你的使用者ID、密碼、瀏覽過的網頁、停留的時間等資訊。當你再次來到該網站時,網站通過讀取Cookies,得知你的相關資訊,就可以做出相應的動作,如在頁面顯示歡迎你的標語,或者讓你不用輸入ID、密碼就直接登入等等。 從本質上講,它可以看作是你的身份證。但Cookies不能作為代碼執行,也不會傳送病毒,且為你所專有,並只能由提供它的伺服器來讀取。儲存的資訊片斷以“名/值”對(name-value pairs)的形式儲存,一個“名/值”對僅僅是一條命名的資料。一個網站只能取得它放在你的電腦中的資訊,它無法從其它的Cookies檔案中取得資訊,也無法得到你的電腦上的其它任何東西。 Cookies中的內容大多數經過了加密處理,因此一般使用者看來只是一些毫無意義的字母數字組合,只有伺服器的CGI處理常式才知道它們真正的含義。 由於Cookies是我們瀏覽的網站傳輸到使用者電腦硬碟中的文字檔或記憶體中的資料,因此它在硬碟中存放的位置與使用的作業系統和瀏覽器密切相關。在Windows 9X系統電腦中,Cookies檔案的存放位置為C:WindowsCookies,在Windows NT/2000/XP的電腦中,Cookies檔案的存放位置為C:Documents and Settings使用者名稱Cookies。 硬碟中的Cookies檔案可以被Web瀏覽器讀取,它的命令格式為:使用者名稱@網站地址[數字].txt。如筆者電腦中的一個Cookies檔案名稱為:ch@163[1].txt。要注意的是:硬碟中的Cookies屬於文字檔,不是程式。 特別想說明的是,還有一個和cookie相似的檔案,那就是session,它和cookie的作用幾乎是相同的,最大的區別是session是放在伺服器端的,而cookie是在用戶端的。所有知道cookie就應該知道session。你可以再網上在搜尋一下session的相關內容。
10. 如何處理伺服器返回的302, 307, 304 狀態代碼?
302 307: 重新導向:
302: 臨時性(重新導向) 網路請求的地址發生跳轉。需要擷取Http 頭的Location 欄位來進行重新串連。
307: 同上需要進行 Loaction欄位的重新串連。
304:Not Modified
主要是針對 網路資料 緩衝,伺服器會為每一個資源定義一個ID標誌。
以及上一次修改的時間標誌。 用戶端儲存緩衝是回儲存這些欄位。 當用戶端發送請求時,
用戶端發送資訊。服務端 檢查資訊是否改變。伺服器返回 304 錯誤。
100 Continue
初始的請求已經接受,客戶應當繼續發送請求的其餘部分
101 Switching Protocols
伺服器將遵從客戶的請求轉換到另外一種協議
200 OK
一切正常,對GET和POST請求的應答文檔跟在後面
201 Created
伺服器已經建立了文檔,Location頭給出了它的URL。
202 Accepted
已經接受請求,但處理尚未完成。
203 Non-Authoritative Information
文檔已經正常地返回,但一些應答頭可能不正確,因為使用的是文檔的拷貝
204 No Content
沒有新文檔,瀏覽器應該繼續顯示原來的文檔。如果使用者定期地重新整理頁面,而Servlet可以確定使用者文檔足夠新,這個狀態碼是很有用的
205 Reset Content
沒有新的內容,但瀏覽器應該重設它所顯示的內容。用來強制瀏覽器清除表單輸入內容
206 Partial Content
客戶發送了一個帶有Range頭的GET請求,伺服器完成了它
300 Multiple Choices
客戶請求的文檔可以在多個位置找到,這些位置已經在返回的文檔內列出。如果伺服器要提出優先選擇,則應該在Location應答頭指明。
301 Moved Permanently
客戶請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。
302 Found
類似於301,但新的URL應該被視為臨時性的替代,而不是永久性的。
303 See Other
類似於301/302,不同之處在於,如果原來的請求是POST,Location頭指定的重新導向目的文件應該通過GET提取
304 Not Modified
用戶端有緩衝的文檔並發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。伺服器告訴客戶,原來緩衝的文檔還可以繼續使用。
305 Use Proxy
客戶請求的文檔應該通過Location頭所指明的Proxy 伺服器提取
307 Temporary Redirect
和302(Found)相同。許多瀏覽器會錯誤地響應302應答進行重新導向,即使原來的請求是 POST,即使它實際上只能在POST請求的應答是303時才能重新導向。由於這個原因,HTTP 1.1新增了307,以便更加清除地區分幾個狀態碼: 當出現303應答時,瀏覽器可以跟隨重新導向的GET和POST請求;如果是307應答,則瀏覽器只能跟隨對GET請求的重新導向。
400 Bad Request
請求出現語法錯誤。
401 Unauthorized
客戶試圖未經授權訪問受密碼保護的頁面。應答中會包含一個WWW-Authenticate頭,瀏覽器據此顯示使用者名稱字/密碼對話方塊,然後在填寫合適的Authorization頭後再次發出請求。
403 Forbidden
資源不可用。
404 Not Found
無法找到指定位置的資源
405 Method Not Allowed
要求方法(GET、POST、HEAD、Delete、PUT、TRACE等)對指定的資源不適用。
406 Not Acceptable
指定的資源已經找到,但它的MIME類型和客戶在Accpet頭中所指定的不相容
407 Proxy Authentication Required
類似於401,表示客戶必須先經過Proxy 伺服器的授權。
408 Request Timeout
在伺服器許可的等待時間內,客戶一直沒有發出任何請求。客戶可以在以後重複同一請求。
409 Conflict
通常和PUT請求有關。由於請求和資源的目前狀態相衝突,因此請求不能成功。
410 Gone
所請求的文檔已經不再可用,而且伺服器不知道應該重新導向到哪一個地址。它和404的不同在於,返回410表示文檔永久地離開了指定的位置,而404表示由於未知的原因文檔不可用。
411 Length Required
伺服器不能處理請求,除非客戶發送一個Content-Length頭。
412 Precondition Failed
要求標頭中指定的一些前提條件失敗
413 Request Entity Too Large
目的文件的大小超過伺服器當前願意處理的大小。如果伺服器認為自己能夠稍後再處理該請求,則應該提供一個Retry-After頭
414 Request URI Too Long
URI太長
416 Requested Range Not Satisfiable
伺服器不能滿足客戶在請求中指定的Range頭
500 Internal Server Error
伺服器遇到了意料不到的情況,不能完成客戶的請求
501 Not Implemented
伺服器不支援實現請求所需要的功能。例如,客戶發出了一個伺服器不支援的PUT請求
502 Bad Gateway
伺服器作為網關或者代理時,為了完成請求訪問下一個伺服器,但該伺服器返回了非法的應答
503 Service Unavailable
伺服器由於維護或者負載過重未能應答。例如,Servlet可能在資料庫連接池已滿的情況下返回503。伺服器返回503時可以提供一個Retry-After頭
504 Gateway Timeout
由作為代理或網關的伺服器使用,表示不能及時地從遠程伺服器獲得應答
505 HTTP Version Not Supported
伺服器不支援要求中所指明的HTTP版本
11. 對於ListView中每一個Item包含圖片的情況,如何從網路進行載入?
1 Adaptert GetView()
2 先判斷緩衝中是否存在,沒有的話開啟線程,非同步任務,Volley進行圖片資料的下載。
3 更新UI HandLerMessage AsyncTask() ViewHolder()
對list的圖片單獨開一個隊列進行下載,在activity中回調重新整理adapter。adapter從本地取圖片。
12. AsyncTask支援的範型參數代表什麼意思?
AsyncTask<傳進的參數類型,進度類型,返回資料的類型>
1. AsyncTask的三個泛型參數說明(三個參數可以是任何類型)
2. 第一個參數:傳入doInBackground()方法的參數類型
3. 第二個參數:傳入onProgressUpdate()方法的參數類型
4. 第三個參數:傳入onPostExecute()方法的參數類型,也是doInBackground()方法返回的類型
13. AsyncTask 哪些部分運行於主線程?如何通過AsyncTask更新UI資訊?能否通過代碼控制AsyncTask的停止?
主線程:
onPostExecute()
onPreExecute(),
onProgressUpdate(Progress...),
子線程:
doInBackground()
___________________________________________________________________________________s
能否通過代碼控制AsyncTask的停止:
final boolean |
cancel(boolean mayInterruptIfRunning) |
-------------------------------------------------------------------------------------------------------------------------------------------------
AsyncTask的執行分為四個步驟,每一步都對應一個回調方法,開發人員需要實現這些方法。
* 1) 繼承AsyncTask
* 2) 實現AsyncTask中定義的下面一個或幾個方法
* onPreExecute(), 該方法將在執行實際的後台操作前被UI線程調用。可以在該方法中做一些準備工作,如在介面上顯示一個進度條,或者一些控制項的執行個體化,這個方法可以不用實現。
* doInBackground(Params...), 將在onPreExecute方法執行後馬上執行,該方法運行在後台線程中。這裡將主要負責執行那些很耗時的幕後處理工作。可以調用 publishProgress方法來更新即時的任務進度。該方法是抽象方法,子類必須實現。
* onProgressUpdate(Progress...),在publishProgress方法被調用後,UI線程將調用這個方法從而在介面上展示任務的進展情況,例如通過一個進度條進行展示。
* onPostExecute(Result), 在doInBackground執行完成後,onPostExecute方法將被UI線程調用,背景計算結果將通過該方法傳遞到UI線程,並且在介面上展示給使用者.
* onCancelled(),在使用者取消線程操作的時候調用。在主線程中調用onCancelled()的時候調用。
14.Handler, Message的作用是什嗎?舉例使用情境?
主要用於先線程之間通訊。子線程使用Handler發送message 給主線程,進行資料的更新。
子線程完成資料的更新,使用Handler + Message來更新UI。
Handler的使用主要是android中無法在主線程(即UI線程)中訪問網路、無法在子線程中訪問UI線程元素。一般是在子線程中訪問網路,然後使用Handler發送message通知主線程處理UI更新操作
15. 說明Android支援i18n的原理。
I18n 叫做國際化。軟體在res/vales 以及 其他帶有語言修飾符的檔案夾。如: values-zh 這些檔案夾中 提供
語言,樣式,尺寸 xml資源。
Android 手機在啟動軟體的時候或者在顯示layout介面的時候會根據當前手機設定的語言進行資源的匹配。
進行最佳的匹配。
例如:Android設定的中文,那麼 android 啟動軟體的時候載入資源就是以 –zh結尾的、
檔案夾,優先載入。 如果沒有,就會載入預設的Values 檔案。手機的適配性。
國際化。android 對i18n和L10n提供了非常好的支援。android沒有專門的API來提供國際化,而是通過對不同resource的命名來達到國際化,
同時這種命名方法還可用於對硬體的區分,如不同的新視屏用不同的圖片。
17. Java語言中 final, finally 的區別?
final— 修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為abstract的,又被聲明為final的。將變數或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變數必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
finally—再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。
17.2. Hashtable的儲存原理是什嗎?假設有 Book類與Person類,並且一一對應,那麼如果需要儲存Key(Book)-Value(Person)的形式,Book類需要做什麼處理?Person需要做什麼處理。
JavaAPI 的理解:
HashTable HashMap都是採用Hash演算法。
針對 key的對象進行 HashCode()方法的計算。算出一個HashCode。利用 hashCOde來定位對象的儲存位置。
可以根據位置進行儲存和尋找。當需要調用 put get remove 方法的時候,還需要進行 Key是否相同判斷。 Key的對象,
必須要重寫 Boolean equals(Object o);
步驟:根據HashCode進行定位,再判定位的對象和傳遞的參數是否相等?相等的話,才進行操作。
Book 必須重寫 hashCode() equals()兩個方法。
Person 對象添加是不可為空。 HashTable
-------------------------------------------------------------------------------------------------------------------------
雜湊表之所以能夠實現根據關鍵字 (典型的例子是一個字串鍵值)來擷取記錄,是因為她在內部建立了記錄儲存位置 -即內部數組中的索引號和關鍵字的一套對應關係 f,因而在尋找時,只需根據這個映射關係 f找到給定鍵值 K對應的數 f(K),就可直接從數組中取得目的資料 Hashtable[K] = Hashtable.InternalArray[f(K)],而不必對數組進行遍曆和比較.這個對應關係 f我們稱為雜湊函數
18. 原廠模式與單例模式的描述與區別?
單例模式:整個程式運行期間,只能建立一個對象執行個體。
主要用於內容的共用,共用資料。
原廠模式:根據傳遞的參數 配置。 建立執行個體。
在原廠模式中,最重要的是滿足物件導向設計中的多態原則,在應用程式中只需要建立一個工廠類的介面,然後調用該介面的生產產品的方法,但具體的實現卻不用應用程式去考慮,他只要知道的是他使用的那個介面的方法一定可用就可以了!
再說說單例模式,也叫單件模式。其實這個模式我覺得是最簡單的,只要滿足兩個基本條件就可以了:一是提供而且只提供一個全域的訪問節點,二是保證不能產生多於一個的執行個體,即要進行執行個體控制,也就是對建構函式要進行控制。
單例模式是建立在簡單原廠模式的基礎之上的,而且他們都需要Factory 方法有特殊的邏輯,以便實現迴圈使用產品的執行個體。
19. 適配器模式與監聽者模式的區別?
適配器: 資料與 UI介面的橋樑。
可以利用適配器進行資料到Ui的轉換。
監聽者模式:UI控制項的事件處理過程中為外部代碼提供一種可以監聽事件發生的一種設計模式。一直在監聽。例如資料抓包。
(1)類適配器:
當客戶在介面中定義了他期望的行為時,我們就可以應用適配器模式,提供一個實現該介面的類,並且擴充已有的類,通過建立子類來實現適配。
下面是類適配器的UML圖:
(2)對象適配器:
對象適配器”通過組合除了滿足“使用者期待介面”還降低了代碼間的不良耦合。在工作中推薦使用“對象適配”。下面是對象適配器的UML圖:
(3)預設適配器模式:
預設適配器模式是一種特殊的適配器模式,但這個適配器是由一個抽象類別實現的,並且在抽象類別中要實現目標介面中所規定的所有方法,但很多方法的實現都是“平庸”的實現,也就是說,這些方法都是空方法。而具體的子類都要繼承此抽象類別。
監聽者模式,即觀察者模式。有時被稱作發布/訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
20. Java中的序列化方式是什嗎?實作類別 Book [title, author, price] 的多記錄序列化?(說明兩種方式,要求全部採用二進位格式儲存為檔案)。
Book 類實現:必須實現java.io.Serializable 然後採用ObjectOutputStream進行資料序列化操作,儲存存資料。
DataOutputStream存資料。 自訂資料結構即可。
在序列化一個對象的時候,這個對象必須實現java.io.Serializable 介面, Serializable 介面中不含任何方法,這個可以理解為聲明該對象是可以序列化的方法吧。當我們在序列化一個對象時,有些屬性我們不想序列化(可以減少資料量),那麼我們可以聲明該屬性為瞬間態(用transient 關鍵字聲明)。另外,靜態欄位也是不會被序列化的。