Android一些面試題
1>. Android 系統中 GC 什麼情況下會出現記憶體洩露呢?
出現情況:
1. 資料庫的 cursor 沒有關閉
2.構造 adapter 時,沒有使用快取contentview
3. Bitmap 物件不使用時採用 recycle()
4.activity 中的物件的生命週期大於activity
2>Android垃圾回收的機制
用以跟蹤正在使用的物件和發現並回收不再使用的物件, 有效防範因記憶體垃圾記憶體過多而引發的記憶體耗盡以及不恰當的記憶體釋放所造成的記憶體非法引用的2個動態記憶體分配造成的危險;
3>什麼是ANR?如何避免?
ANR:Application Not Responding。在 Android
1.使用者對應用程式的操作(如輸入事件,按鍵、觸控式螢幕事件)在5秒內無響應
2. 廣播接受器(BroadcastReceiver)在10秒內仍未執行完
原因是:任何在主執行緒中執行的,需要消耗大量時間的操作都會引發 ANR
4> Androiddvm的程序和Linux的程序, 應用程式的程序是否為同一個概念
DVM 指 dalivk 的虛擬機器。每一個 Android 應用程式都在它自己的程序中執行,
5>如果後臺的 Activity由於某原因被系統回收了,如何在被系統回收之前儲存當前狀態?
A跳轉到B,A被回收:重新呼叫onCreate();A沒有回收:重寫onsavedInstanceState ()
6>請解釋在單執行緒模式中Message,Handler,Message Queue,Looper之間的關係
7> DDMS 和 TraceView的區別?
DDMS 是一個程式執行檢視器,在裡面可以看見執行緒和堆疊等資訊,TraceView是程式效能
8>Activity的啟動模式:
4種 activity 的啟動模式
1)standard: 標準模式,一呼叫 startActivity()方法就會產生一個新的例項。
2)singleTop: 如果已經有一個例項位於 Activity 棧的頂部時,就不產生新的例項,而只是呼叫 Activity 中的 newInstance()方法。如果不位於棧頂,會產生一個新的例項。
3)singleTask: 會在一個新的 task 中產生這個例項,以後每次呼叫都會使用這個,不會去產生 新的例項了。
4)singleInstance: 這個跟 singleTask基本上是一樣,只有一個區別:在這個模式下的 Activity 例項所處的 task 中,只能有這個 activity 例項,不能有其他的例項。
9>根據自己的理解描述下 Android數字簽名。
- 所有的應用程式都必須有數字證書,Android 系統不會安裝一個沒有數字證書的應用程式
- Android 程式包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證
(3)如果要正式釋出一個 Android 程式,必須使用一個合適的私鑰生成的數字證書來給程式簽名,而不能使用adt 外掛或者 ant 工具生成的除錯證書來發布。
10>android 中有哪幾種解析 xml 的類,官方推薦哪種?以及它們的原理和區別.
DOM 解析 優點:
1.XML 樹在記憶體中完整儲存,因此可以直接修改其資料和結構. 2.可以通過該解析器隨時訪問 XML 樹中的任何一個節點.
3.DOM 解析器的 API 在使用上也相對比較簡單. 缺點:如果 XML 文件體積比較大時,將文件讀入記憶體是非常消耗系統資源的. 使用場景:DOM 是用與平臺和語言無關的方式
SAX 解析優點:
SAX 對記憶體的要求比較低,因為它讓開發人員自己來決定所要處理的標籤.特別是當開發人員只需要處理文件中所包含的部分資料時,SAX 這種擴充套件能力得到了更好的體現. 缺點: 用 SAX 方式進行 XML 解析時,需要順序執行,所以很難訪問到同一文件中的不同資料.此外, 在基於該方式的解析編碼過程也相對複雜. 使用場景: 對於含有資料量十分巨大,而又不用對文件的所有資料進行遍歷或者分析的時候,使用該方 法十分有效.該方法不用將整個文件讀入記憶體,而只需讀取到程式所需的文件標籤處即可.
pull 解析是基於流(stream)操作檔案,然後根據節點事件回撥開發者編寫的處理程式.因為是基於流的處理,因此 pull 和 sax 都比較節 約記憶體資源,不會象 dom 那樣要把所有節點以物件樹的形式展現在記憶體中.pull 比 sax更簡明,而且不需要掃描完整個流.
11>Socket 通訊程式設計 客戶端程式設計步驟:
1、 建立客戶端套接字(指定伺服器端 IP 地址與埠號)
2、 連線(Android 建立Socket時會自動連線)
3、 與伺服器端進行通訊
4、 關閉套接字
伺服器端:
1.建立一個 ServerSocket,用於監聽客戶端 Socket 的連線請求
2.採用迴圈不斷接受來自客戶端的請求
程式題:
1.請繼承 SQLiteOpenHelper 實現
1).建立一個版本為1的“diaryOpenHelper. db”的資料庫,
2).同時建立一個 “diary” 表(包含一個_id主鍵並自增長,topic字元型100
長度, content 字元型1000長度)
3).在資料庫版本變化時請刪除 diary 表,並重新創建出 diary 表