為什麼要用ContentProvider?它和sql的實現上有什麼差別?
使用ContentProvider 可以將資料共用給其他應用,讓除本應用之外的應用也可以訪問本應用的資料。它的底層是用SQLite 資料庫實現的,所以其對資料做的各種操作都是以Sql實現,只是在上層提供的是Uri
AIDL的全稱是什麼?如何工作?能處理哪些類型的資料?
AIDL 是一種介面定義語言,用於約束兩個進程間的通訊規則,供編譯器產生代碼,實現Android 裝置上的處理序間通訊。
進程之間的通訊資訊首先會被轉換成AIDL 協議訊息,然後發送給對方,對方受到 AIDL 協議訊息後再轉換成相應的對象。
AIDL 支援的類型包括Java 原生類型和String,List,Map,CharSequence,如果使用自訂類型,必須實現Parcelable 介面
啟動一個程式,可以主介面點擊表徵圖進入,也可以從一個程式中跳轉過去,二者有什麼區別?
從主介面啟動一個應用 程式是通過捷徑直接調mainActivity 啟動的,從其他應用程式調用需要隱式的通過Action 或者在 Intent 中需要使用setClasss() ,且要寫明包路徑.
如何判斷是否有SD卡?
在程式中訪問SDCard,需要申請訪問SDCard 的許可權
在AndroidManifest.xml 中加入訪問SDCard 的許可權如下:
< !--在SDCard 中建立與刪除檔案許可權-->
< uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
< !-- 往SDCard 寫入資料許可權 -->
< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Environment.getExternalStorageState().equals(Enviroment.MEDIA_MOUNTED)
Environment.getExternalStorageState() 方法用於擷取SDCard 的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Android系統中GC什麼情況下會出現記憶體泄露呢?
出現情況 :
1. 資料庫的 cursor 沒有關閉
2. 構造 adapter 時,沒有使用緩衝contentview
衍生listview 的最佳化問題----減少建立view 的對象,充分使用contentview,可以使用一靜態類來最佳化處理 getView 的過程
3. Bitmap 對象不使用時採用recycle() 釋放記憶體
4. Activity 中的對象的生命週期大於Activity
調試方法: DDMS----> HEAPSIZE --->dataobject ---> [Total Size]
android 中有哪幾種解析xml 的類,它們的原理和區別
DOM 解析
優點:
1. XML 樹在記憶體中完整理儲存,因此可以直接修改其資料和結構。
2. 可以通過該解析器隨時訪問XML樹中的任何一個節點.
3. DOM 解析器的 API 在使用上也相對比較簡單
缺點: 如果XML 文檔體積比較大時,將文檔讀入記憶體是非常消耗系統資源的。
使用情境:
DOM 是用與平台和語言無關的方式表示 XML 文檔的官方 W3C標準.DOM 是以階層組織的節點的集合。這個階層允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文檔和構造階層,然後才能進行工作.DOM 是基於對象階層的。
SAX解析
優點: SAX 對記憶體的要求比較低,因為它讓開發人員自己來決定所要處理的標籤。特別是當開發人員只需要處理文檔中所包含的部分資料時,SAX 這種擴充能力得到了更好的體現。
缺點: 用SAX 方式進行XML解析時,需要順序執行,所以很難訪問到同一文檔中的不同資料。此外,在基於該方式的解析編碼過程也相對複雜。
使用情境: 對於含有資料量十分巨大,而又不用對文檔的所有資料進行遍曆或者分析的時候,使用該方法十分有效。該方法不用將整個文檔讀入記憶體,而只需讀取到程式所需的文檔標籤即可.
Xmlpull 解析
android 提供了xmlpull api ,xmlpull 和sax 類似,是基於流(stream) 操作檔案,然後根據節時間點事件回調開發人員編寫的處理常式。因為是基於流的處理,因此xmlpull 和 sax 都比較節約記憶體資源,不會象DOM 那樣要把所有節點以對象樹的形式展現在記憶體中。
xmlpull 比sax 更簡明,而且不需要掃描完整個流.
res目錄有預設幾項resource
5項, drawable-hdpi,drawable-ldpi,drawable-mdpi,layout,values
handler機制的原理
Android 提供了 Handler 和 Looper 來滿足線程間的通訊. Handler 先進先出原則. Looper 類用來管理特定線程內對象之間的訊息交換(Message Exchange)
(1) Looper: 一個線程可以產生一個Looper 對象,由它來管理此線程裡的 Message Queue(訊息佇列)
(2) Hanlder: 可以構造 Handler 對象來與 Looper 溝通,以便推送新訊息到 Message Queue裡,或者接收Looper 從Message Queue 取出所送來的訊息.
說說Activity,Intent,Service是什麼關係
一個 Activity 通常是一個單獨的螢幕,每一個Activity 都被實現為一個單獨的類,這些類都是從Activity 基類中繼承來的,Activity 類會顯示由視圖控制群組成的使用者介面,並對視圖控制項的事件做出響應。
Intent 的調用是用業進行架構螢幕之間的切換的,Intent 是描述應用想要做什麼。Intent 資料結構中兩個最重要的部分是動作和動作對應的資料,一個動作對應一個動作資料。
Android Service 是運行在背景代碼,不能與使用者互動,可以運行在自己的進程,也可以運行在其他應用程式進程的上下文裡。需要通過某一個Activity 或者其他 Context 對象來調用.
Activity 跳轉到 Activity ,Activity 啟動Service ,Service 開啟Activity都需要Intent 表時跳轉的意圖,以及傳遞參靈敏,Intent 是這些組件間訊號傳遞的承載者。
請描述一下Intent 和 Intent Filter
Intent 在Android 中被翻譯為"意圖",也就是目的,它們是應用程式四種基本組件——————activity,service和broadcast receiver 之間互相啟用的手段。在調用Intent 名稱時使用結構全名時為顯示調用。這種方式一般用於應用程式的內部調用,因為你不一定會知道別人寫的類的全名。關於隱式Intent 的用法,這裡有配置Activity 的Intent Filter
在調用的時候指定Intent 的action,系統就會自動的去對比是哪個 intent-filter 符合相應的Activity,找到後就會啟動Activity.
一個intent filter 是 IntentFilter 類的執行個體,但是它一般不出現在代碼中,而是出現在androidManifest.xml檔案中,以 的形式(有一個例外是broadcast receiver 的intent filter 是使用Context.registerReceiver() 來動態設定的,其intent filter 也是在代碼中建立的。)
一個filter 有action,data,category等欄位.一個隱式intent 為了能被某個intent filter 接受,必須通過3個測試,一個intent 為了被某個組件接受,則必須通過它所有的intent filter 中的一個。
Service有哪些啟動方法,有什麼區別,怎樣停用Service?
兩種啟動Service的方式Context.startService() 和 Context.bindService()。
區別為Context.startService(): Service會經曆onCreate ---> onStart(如果Service還沒有運行,先調用onCreate()再調用onStart(),如果Service已經運行,則只調用 onStart(),所以一個Service的onStart()可能會重複調用多次);停止Service 時直接調用onDestory,如果是調用者自己直接退出而沒有停止服務,Service會一直在後台運行。該Service 的調用者再啟動起來後可以通過 停止服務關閉Service
Context.bindService(): Service 會經曆 onCreate() ---> onBind(),onBind將返回給用戶端一個IBind 介面執行個體,IBind 允許用戶端回調服務的方法,比如得到Service 啟動並執行狀態或其他動作。這個時候把調用者(Context,例如) 會和Service綁定在一起,Context 退出了,Service 就會調用onUnbind()---->onDestory()相應退出。
停用service 使用context.stopService()
同一個程式,但不同的Activity是否可以放在不同的Task任務棧中?
可以放在不同的Task中。需要為不同的activity 設定不同的taskaffinity 屬性,啟動activity 的Intent 需要包含FLAG_ACTIVITY_NEW_TASK標記
橫豎屏切換時候Activity的生命週期。
1. 不設定Activity 的android:configChanges時,切屏會重新調用各個生命週期,切模屏時會執行一次,切豎屏時會執行兩次
2. 設定Activity 的android:configChanges="orientation" 時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次
3.設定Activity 的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
如何將一個Activity設定成視窗的樣式。
1、在styles.xml檔案中可以建立一個如下類似Dialog的style
在2.2, 這個方法失效了,可使用以下幾個人工的方法
1. 記錄開啟的Activity: 每開啟一個Activity ,就記錄下來。在需要退出時,關閉每一個Activity 即可。
2. 發送特定廣播: 在需要結束應用時,發送一個特定的廣播,每個Activity 收到廣播後,關閉即可.
背景Activity被系統回收怎麼辦?
android 系統會記錄下回收前Activity 的狀態,再次調用被回收的Activity 就要重新調用onCreate(),不同於直接啟動的是這回onCreate()裡包括參數savedInstanceState。
使用 savedInstanceState 可以恢複到回收前的狀態。