android面試題目匯總持續更新

來源:互聯網
上載者:User

為什麼要用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 可以恢複到回收前的狀態。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.