1. 程式人生 > >Android常見面試題

Android常見面試題

  1. 橫豎屏切換時候 activity 的生命週期
    1). 不設定 Activity 的 android:configChanges 時 , 切屏會重新呼叫各個生命週期 , 切橫屏時會執行一次 , 切豎屏時會執行兩次 .

2). 設定 Activity 的 android:configChanges=”orientation” 時 , 切屏還是會重新呼叫各個生命週期 , 切橫、豎屏時只會執行一次 .

3). 設定 Activity 的 android:configChanges=”orientation|keyboardHidden” 時 , 切屏不會重新呼叫各個生命週期 , 只會執行 onConfigurationChanged 方法 .

2.android 中的動畫有哪幾類,它們的特點和區別是什麼 ?
兩種,一種是 Tween 動畫、還有一種是 Frame 動畫。 Tween 動畫,這種實現方式可以使檢視元件移動、放大、縮小以及產生透明度的變化 ; 另一種 Frame 動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
3. 一條最長的簡訊息約佔多少 byte?
中文70( 包括標點) ,英文160 ,160 個位元組。

4.handler 機制的原理
andriod 提供了 Handler 和 Looper 來滿足執行緒間的通訊。 Handler 先進先出原則。 Looper 類用來管理特定執行緒內物件之間的訊息交換 (Message Exchange) 。
1)Looper: 一個執行緒可以產生一個 Looper 物件,由它來管理此執行緒裡的 Message Queue( 訊息佇列 ) 。
2)Handler: 你可以構造 Handler 物件來與 Looper 溝通,以便 push 新訊息到 Message Queue 裡; 或者接收 Looper 從 Message Queue 取出 ) 所送來的訊息。
3) Message Queue( 訊息佇列 ): 用來存放執行緒放入的訊息。
4) 執行緒: UI thread 通常就是 main thread ,而 Android 啟動程式時會替它建立一個 Message Queue 。
5. 什麼是嵌入式實時作業系統 , Android 作業系統屬於實時作業系統嗎 ?

嵌入式實時作業系統是指當外界事件或資料產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致執行的嵌入式作業系統。主要用於工業控制、 軍事裝置、 航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而 android 是基於linux 核心的,因此屬於軟實時。

6.android 中執行緒與執行緒,程序與程序之間如何通訊
1) 、一個 Android 程式開始執行時,會單獨啟動一個 Process 。
預設情況下,所有這個程式中的 Activity 或者 Service 都會跑在這個 Process 。
預設情況下,一個 Android 程式也只有一個 Process ,但一個 Process 下卻可以有許多個 Thread。
2 )、一個 Android 程式開始執行時,就有一個主執行緒 Main Thread 被建立。該執行緒主要負責 UI 介面的顯示、更新和控制元件互動,所以又叫 UI Thread 。
一個 Android 程式建立之初,一個 Process 呈現的是單執行緒模型 — 即 Main Thread ,所有的任務都在一個執行緒中執行。所以, Main Thread 所呼叫的每一個函式,其耗時應該越短越好。而對於比較費時的工作,應該設法交給子執行緒去做,以避免阻塞主執行緒(主執行緒被阻塞,會導致程式假死 現象)。

3 )、 Android 單執行緒模型: Android UI 操作並不是執行緒安全的並且這些操作必須在 UI 執行緒中執行。如果在子執行緒中直接修改 UI ,會導致異常。

7.Android dvm 的程序和 Linux 的程序 , 應用程式的程序是否為同一個概念
DVM 指 dalivk 的虛擬機器。每一個 Android 應用程式都在它自己的程序中執行,都擁有一個獨立的 Dalvik 虛擬機器例項。而每一個 DVM 都是在 Linux 中的一個程序,所以說可以認為是同一個概念。

8.sim 卡的 EF 檔案有何作用
sim 卡的檔案系統有自己規範,主要是為了和手機通訊, sim 本 身可以有自己的作業系統,EF 就是作儲存並和手機通訊用的

9.android 中的動畫有哪幾類,它們的特點和區別是什麼 ?
兩種,一種是 Tween 動畫、還有一種是 Frame 動畫。 Tween 動畫,這種實現方式可以使檢視元件移動、放大、縮小以及產生透明度的變化 ; 另一種 Frame 動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

  1. 讓 Activity 變成一個視窗: Activity 屬性設定

講點輕鬆的吧 , 可能有人希望做出來的應用程式是一個漂浮在手機主介面的東西,那麼很 簡單你只需要設定 一下 Activity 的主題就可以了在 AndroidManifest.xml 中定義 Activity 的 地方一句話:

Xml 程式碼

  1. android :theme=”@android:style/Theme.Dialog”

這就使你的應用程式變成對話方塊的形式彈出來了,或者

Xml 程式碼

  1. android:theme=”@android:style/Theme.Translucent”

就變成半透明的, [ 友情提示 -.-] 類似的這種 activity 的屬性可以在 android.R.styleable 類的AndroidManifestActivity 方法中看到, AndroidManifest.xml 中所有元素的屬性的介紹都可以參考這個類 android.R.styleable

上面說的是屬性名稱,具體有什麼值是在 android.R.style 中 可以看到,比如這個”@android:style/Theme.Dialog” 就對應於 android.R.style.Theme_Dialog ,(‘_’ 換成 ‘.’ < — 注意:這個是文章內容不是笑臉 ) 就可以用在描述檔案 中了 , 找找類定義和描述檔案中的對應關係就都明白了。

  1. 如何將 SQLite 資料庫 (dictionary.db 檔案 ) 與 apk 檔案一起釋出 ?
    解答:可以將 dictionary.db 檔案複製到 Eclipse Android 工程中的 res aw 目錄中。所有在 res aw 目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。可以將 dictionary.db 檔案複製到 res aw 目錄中

  2. 如何將開啟 res aw 目錄中的資料庫檔案 ?

解答:在 Android 中不能直接開啟 res aw 目錄中的資料庫檔案,而需要在程式第一次啟動時將該檔案複製到手機記憶體或 SD 卡的某個目錄中,然後再開啟該資料庫檔案。複製的基本方法是使用getResources().openRawResource 方法獲得 res aw 目錄中資源的 InputStream 物件,然後將該InputStream 物件中的資料寫入其他的目錄中相應檔案中。在 Android SDK 中可以使用SQLiteDatabase.openOrCreateDatabase 方法來開啟任意目錄中的 SQLite 資料庫檔案。

  1. 在 android 中 mvc 的具體體現

MVC 是 Model,View,Controller 的縮寫,從上圖可以看出 MVC 包含三個部分:
.. 模型( Model )物件:是應用程式的主體部分,所有的業務邏輯都應該寫在該
層。
.. 檢視( View )物件:是應用程式中負責生成使用者介面的部分。也是在整個
MVC 架構中使用者唯一可以看到的一層,接收使用者的輸入,顯示處理結果。
.. 控制器( Control )物件:是根據使用者的輸入,控制使用者介面資料顯示及更新
Model 物件狀態的部分,控制器更重要的一種導航功能,想用使用者出發的相
關事件,交給 M 哦得了處理。

Android 鼓勵弱耦合和元件的重用,在 Android 中 MVC 的具體體現如下
1) 檢視層( view ) :一般採用 xml 檔案進行介面的描述,使用的時候可以非常方便的引入,當然,如何你對 android 瞭解的比較的多了話,就一定可 以想到在 android 中也可以使用javascript+html 等的方式作為 view 層,當然這裡需要進行 java 和 javascript 之間的通 信,幸運的是, android 提供了它們之間非常方便的通訊實現。

2) 控制層( controller ): android 的控制層的重 任通常落在了眾多的 acitvity 的肩上,這句話也就暗含了不要在 acitivity 中寫程式碼,要通過 activity 交割 model 業務邏輯層處理, 這樣做的另外一個原因是 android 中的 acitivity 的響應時間是 5s ,如果耗時的操作放在這裡,程式就很容易被回收掉。

3) 模型層( model ): 對資料庫的操作、對網路等的操作都應該在 model 裡面處理,當然對業務計算等操作也是必須放在的該層的。

15.Android 系統的架構
android 的系統架構和其作業系統一樣,採用了分層的架構。從架構圖看, android 分為四個層,從高層到低層分別是應用程式層、應用程式框架層、系統執行庫層和 linux 核心層。
1. 應用程式
Android 會同一系列核心應用程式包一起釋出,該應用程式包包括 email 客戶端, SMS 短訊息程式,日曆,地圖,瀏覽器,聯絡人管理程式等。所有的應用程式都是使用 JAVA 語言編寫的。
2. 應用程式框架
開發人員也可以完全訪問核心應用程式所使用的 API 框架。該應用程式的架構設計簡化了元件的重用 ; 任何一個應用程式都可以釋出它的功能塊並且任何其它的應用程式都可以使用其所釋出的功能塊 ( 不過得遵循框架的安全性限制 ) 。同樣,該應用程式重用機制也使使用者可以方便的替換程式元件。
隱藏在每個應用後面的是一系列的服務和系統 , 其中包括 ;
* 豐富而又可擴充套件的檢視 (Views) ,可以用來構建應用程式, 它包括列表 (lists) ,網格 (grids),文字框 (text boxes) ,按鈕 (buttons) , 甚至可嵌入的 web 瀏覽器。
* 內容提供器 (Content Providers) 使得應用程式可以訪問另一個應用程式的資料 ( 如聯絡人資料庫 ) , 或者共享它們自己的資料
* 資源管理器 (Resource Manager) 提供 非程式碼資源的訪問,如本地字串,圖形,和佈局檔案 ( layout files ) 。
* 通知管理器 (Notification Manager) 使得應用程式可以在狀態列中顯示自定義的提示資訊。
* 活動管理器 ( Activity Manager) 用來管理應用程式生命週期並提供常用的導航回退功能。
有關更多的細節和怎樣從頭寫一個應用程式,請參考 如何編寫一個 Android 應用程式 .
3. 系統執行庫
1) 程式庫
Android 包含一些 C/C++ 庫,這些庫能被 Android 系統中不同的元件使用。它們通過 Android應用程式框架為開發者提供服務。以下是一些核心庫:
* 系統 C 庫 – 一個從 BSD 繼承來的標準 C 系統函式庫 ( libc ) , 它是專門為基於 embedded linux 的裝置定製的。
* 媒體庫 – 基於 PacketVideo OpenCORE; 該庫支援多種常用的音訊、視訊格式回放和錄製,同時支援靜態影象檔案。編碼格式包括 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
* Surface Manager – 對顯示子系統的管理,並且為多個應用程式提 供了 2D 和 3D 圖層的無縫融合。
* LibWebCore – 一個最新的 web 瀏覽器引擎用,支援 Android 瀏覽器和一個可嵌入的 web 檢視。
* SGL – 底層的 2D 圖形引擎
* 3D libraries – 基於 OpenGL ES 1.0 APIs 實現 ; 該庫可以使用硬體 3D 加速 ( 如果可用 ) 或者使用高度優化的 3D 軟加速。
* FreeType – 點陣圖 (bitmap) 和向量 (vector) 字型顯示。

  • SQLite – 一個對於所有應用程式可用,功能強勁的輕型關係型資料庫引擎。
    2)Android 執行庫
    Android 包括了一個核心庫,該核心庫提供了 JAVA 程式語言核心庫的大多數功能。
    每一個 Android 應用程式都在它自己的程序中執行,都擁有一個獨立的 Dalvik 虛擬機器例項。Dalvik 被設計成一個裝置可以同時高效地執行多個虛擬系統。 Dalvik 虛擬機器執行 (.dex) 的 Dalvik 可執行檔案,該格式檔案針對小記憶體使用做了優化。同時虛擬機器是基於暫存器的,所有的類都經由JAVA 編譯器編譯,然後通過 SDK 中 的 “ dx ” 工具轉化成 .dex 格式由虛擬機器執行。
    Dalvik 虛擬機器依賴於 linux 核心的一些功能,比如執行緒機制和底層記憶體管理機制。
    4.Linux 核心
    Android 的核心繫統服務依賴於 Linux 2.6 核心,如安全性,記憶體管理,程序管理, 網路協議棧和驅動模型。 Linux 核心也同時作為硬體和軟體棧之間的抽象層。

16.Android 常用控制元件的資訊
單選框 (RadioButton 與 RadioGroup) :
RadioGroup 用於對單選框進行分組,相同組內的單選框只有一個單選框被選中。
事件: setOnCheckedChangeListener() ,處理單選框被選擇事件。把RadioGroup.OnCheckedChangeListener 例項作為引數傳入。
多選框 (CheckBox):
每個多選框都是獨立的,可以通過迭代所有的多選框,然後根據其狀態是否被選中在獲取其值。
事件: setOnCheckChangeListener() 處理多選框被選擇事件。把CompoundButton.OnCheckedChangeListener 例項作為引數傳入
下拉列表框 (Spring) :
Spinner.getItemAtPosition(Spinner.getSelectedItemPosition()); 獲取下拉列表框的值。
事件: setOnItemSelectedListener(), 處理下拉列表框被選擇事件把AdapterView.OnItemSelectedListener 例項作為引數傳入;
拖動條 (SeekBar) :
SeekBar.getProgress() 獲取拖動條當前值
事件 :setOnSeekBarChangeListener() ,處理拖動條值變化事件,把SeekBar.OnSeekBarChangeListener 例項作為引數傳入。
選單 (Menu):
重寫 Activity 的 onCreatOptionMenu(Menu menu) 方法,該方法用於建立選項選單,咋使用者按下手機的 “Menu” 按鈕時就會顯示建立好的選單,在 onCreatOptionMenu(Menu Menu) 方法內部可以呼叫 Menu.add() 方法實現選單的新增。
重寫 Activity 的 onMenuItemSelected() 方法,該方法用於處理選單被選擇事件。
進度對話方塊 (ProgressDialog) :
建立並顯示一個進度對話方塊: ProgressDialog.show(ProgressDialogActivity.this,” 請稍等 ” , “資料正在載入中 ….” , true) ;
設定對話方塊的風格: setProgressStyle()
ProgressDialog.STYLE_SPINNER 旋轉進度條風格 ( 為預設風格 )
ProgressDialog.STYLE_HORIZONTAL 橫向進度條風格

  1. 請介紹下 Android 中常用的五種佈局
    Android 佈局是應用介面開發的重要一環,在 Android 中,共有五種佈局方式,分別是:FrameLayout (框架佈局), LinearLayout (線性佈局),
    AbsoluteLayout (絕對佈局), RelativeLayout (相對佈局), TableLayout (表格佈局)。
    1.FrameLayout
    這個佈局可以看成是牆腳堆東西,有一個四方的矩形的左上角牆腳,我們放了第一個東西,要再放一個,那就在放在原來放的位置的上面,這樣依次的放,會蓋住原來的東西。這個佈局比較簡單,也只能放一點比較簡單的東西。
    2.LinearLayout
    線性佈局,這個東西,從外框上可以理解為一個 div ,他首先是一個一個從上往下羅列在螢幕上。每一個 LinearLayout 裡面又可分為垂直佈局 ( android:orientation=”vertical” )和水平佈局(android:orientation=”horizontal” )。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每一個元素依次向右排列。
    linearLayout 中有一個重要的屬性 android:layout_weight=”1″ ,這個 weight 在垂直佈局時,代表行距;水平的時候代表列寬; weight 值越大就越大。
    3.AbsoluteLayout
    絕對佈局猶如 div 指定了 absolute 屬性,用 X,Y 座標來指定元素的位置 android:layout_x=”20px” android:layout_y=”12px” 這種佈局方式也比較簡單,但是在垂直隨便切換時,往往會出問題,而且多個元素的時候,計算比較麻煩。
    4.RelativeLayout
    相對佈局可以理解為某一個元素為參照物,來定位的佈局方式。主要屬性有:
    相對於某一個元素
    android:layout_below=”@id/aaa” 該元素在 id 為 aaa 的下面
    android:layout_toLeftOf=”@id/bbb” 改元素的左邊是 bbb
    相對於父元素的地方
    android:layout_alignParentLeft=”true” 在父元素左對齊
    android:layout_alignParentRight=”true” 在父元素右對齊
    還可以指定邊距等,具體詳見 API

5.TableLayout
表格佈局類似 Html 裡面的 Table 。每一個 TableLayout 裡面有表格行 TableRow , TableRow 裡面可以具體定義每一個元素,設定他的對齊方式 android:gravity=”” 。
每一個佈局都有自己適合的方式,另外,這五個佈局元素可以相互巢狀應用,做出美觀的介面。

  1. 如何啟用 Service ,如何停用 Service
    Android 中的服務和 windows 中的服務是類似的東西,服務一般沒有使用者操作介面,它運行於系統中不容易被使用者發覺,可以使用它開發如監控之類的程式。服務的開發比較簡單,如下:
    第一步:繼承 Service 類
    public class SMSService extends Service {
    }
    第二步:在 AndroidManifest.xml 檔案中的 節點裡對服務進行配置 :

服務不能自己執行,需要通過呼叫 Context.startService() 或 Context.bindService() 方法啟動服務。這兩個方法都可以啟動 Service ,但是它們的使用場合有所不同。使用 startService() 方法啟用服務,呼叫者與服務之間沒有關連,即使呼叫者退出了,服務仍然執行。使用 bindService() 方法啟用服務,呼叫者與服務繫結在了一起,呼叫者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。

如果打算採用 Context.startService() 方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate() 方法,接著呼叫 onStart() 方法。如果呼叫 startService() 方法前服務已經被建立,多次呼叫 startService() 方法並不會導致多次建立服務,但會導致多次呼叫 onStart() 方法。採用startService() 方法啟動的服務,只能呼叫 Context.stopService() 方法結束服務,服務結束時會呼叫onDestroy() 方法。

如果打算採用 Context.bindService() 方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate() 方法,接著呼叫 onBind() 方法。這個時候呼叫者和服務繫結在一起,呼叫者退出了,系統就會先呼叫服務的 onUnbind() 方法,接著呼叫 onDestroy() 方法。如果呼叫 bindService() 方法前服務已經被繫結,多次呼叫 bindService() 方法並不會導致多次建立服務及繫結 ( 也就是說onCreate() 和 onBind() 方法並不會被多次呼叫 ) 。如果呼叫者希望與正在繫結的服務解除繫結,可以呼叫 unbindService() 方法,呼叫該方法也會導致系統呼叫服務的 onUnbind()–>onDestroy() 方法。
服務常用生命週期回撥方法如下:
onCreate() 該方法在服務被建立時呼叫,該方法只會被呼叫一次,無論呼叫多少次 startService() 或bindService() 方法,服務也只被建立一次。
onDestroy() 該方法在服務被終止時呼叫。

與採用 Context.startService() 方法啟動服務有關的生命週期方法
onStart() 只有採用 Context.startService() 方法啟動服務時才會回撥該方法。該方法在服務開始執行時被呼叫。多次呼叫 startService() 方法儘管不會多次建立服務,但 onStart() 方法會被多次呼叫。

與採用 Context.bindService() 方法啟動服務有關的生命週期方法
onBind() 只有採用 Context.bindService() 方法啟動服務時才會回撥該方法。該方法在呼叫者與服務繫結時被呼叫,當呼叫者與服務已經繫結,多次呼叫 Context.bindService() 方法並不會導致該方法被多次呼叫。
onUnbind() 只有採用 Context.bindService() 方法啟動服務時才會回撥該方法。該方法在呼叫者與服務解除繫結時被呼叫

採用 Context.startService() 方法啟動服務的程式碼如下:
public class HelloActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
……
Button button =(Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent(HelloActivity.this, SMSService.class);
startService(intent);
}});
}
}

採用 Context. bindService() 方法啟動服務的程式碼如下:
public class HelloActivity extends Activity {
ServiceConnection conn = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
}
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
Button button =(Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent(HelloActivity.this, SMSService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
//unbindService(conn);// 解除繫結
}});
}
}

19.ListView 優化
工作原理 :
ListView 針對 List 中每個 item ,要求 adapter “ 給我一個檢視 ” (getView) 。
一個新的檢視被返回並顯示
如果我們有上億個專案要顯示怎麼辦?為每個專案建立一個新檢視? NO! 這不可能!
實際上 Android 為你快取了檢視。
Android 中有個叫做 Recycler 的構件,下圖是他的工作原理:
如果你有 10 億個專案 (item) ,其中只有可見的專案存在記憶體中,其他的在 Recycler 中。
1. ListView 先請求一個 type1 檢視 (getView) 然後請求其他可見的專案。 convertView 在 getView 中是空 (null) 的 。
2. 當 item1 滾出螢幕,並且一個新的專案從螢幕低端上來時, ListView 再請求一個 type1 檢視。convertView 此時不是空值了,它的值是 item1 。你只需設定新的資料然後返回 convertView,不必重新建立一個檢視。

20 廣播接收者生命週期
一個廣播接收者有一個回撥方法: void onReceive(Context curContext , Intent broadcastMsg )。當一個廣播訊息到達接收者是, Android 呼叫它的 onReceive() 方法並傳遞給它包含訊息的 Intent物件。廣播接收者被認為僅當它執行這個方法時是活躍的。當 onReceive() 返回後,它是不活躍的。
有一個活躍的廣播接收者的程序是受保護的,不會被殺死。但是系統可以在任何時候殺死僅有不活躍元件的程序,當佔用的記憶體別的程序需要時。
這帶來一個問題,當一個廣播訊息的響應時費時的,因此應該在獨立的執行緒中做這些事,遠離使用者介面其它元件執行的主執行緒。如果 onReceive() 衍生執行緒然後返回,整個程序,包括新的執行緒,被判定為不活躍的(除非程序中的其它應用程式元件是活躍的),將使它處於被殺的危機。解決這個問題的方法是 onReceive() 啟動一個服務,及時服務做這個工作,因此係統知道程序中有活躍的工作在做。

  1. 設計模式和 IoC( 控制反轉 )
    Android 框架魅力的源泉在於 IoC ,在開發 Android 的過程中你會時刻感受到 IoC 帶來
    的巨大方便,就拿 Activity 來說,下面的函式是框架呼叫自動呼叫的:
    protected void onCreate(Bundle savedInstanceState) ;
    不是程式編寫者主動去呼叫,反而是使用者寫的程式碼被框架呼叫,這也就反轉
    了!當然 IoC 本身的內涵遠遠不止這些,但是從這個例子中也可以窺視出 IoC
    帶來的巨大好處。此類的例子在 Android 隨處可見,例如說資料庫的管理類,
    例如說 Android 中 SAX 的 Handler 的呼叫等。有時候,您甚至需要自己編寫簡
    單的 IoC 實現,上面展示的多執行緒現在就是一個說明。

22.Android 中的長度單位詳解
現在這裡介紹一下 dp 和 sp 。 dp 也就是 dip 。這個和 sp 基本類似。如果設定表示長度、高度等屬性時可以使用 dp 或 sp 。但如果設定字型,需要使用 sp 。 dp 是與密度無關, sp 除了與密度無關外,還與 scale 無關。如果螢幕密度為 160 ,這時 dp 和 sp 和 px 是一樣的。 1dp=1sp=1px ,但如果使用 px 作單位,如果螢幕大小不變(假設還是 3.2 寸),而螢幕密度變成了 320 。那麼原來TextView 的寬度設成 160px ,在密度為 320 的 3.2 寸螢幕裡看要比在密度為 160 的 3.2 寸螢幕上看短了一半。但如果設定成 160dp 或 160sp 的話。系統會自動將 width 屬性值設定成 320px 的。也就是 160 * 320 / 160 。其中 320 / 160 可稱為密
度比例因子。也就是說,如果使用 dp 和 sp ,系統會根據螢幕密度的變化自動
進行轉換。

下面看一下其他單位的含義
px :表示螢幕實際的象素。例如, 320*480 的螢幕在橫向有 320 個象素,
在縱向有 480 個象素。

in :表示英寸,是螢幕的物理尺寸。每英寸等於 2.54 釐米。例如,形容
手機螢幕大小,經常說, 3.2 (英)寸、 3.5 (英)寸、 4 (英)寸就是指這個
單位。這些尺寸是螢幕的對角線長度。如果手機的螢幕是 3.2 英寸,表示手機
的螢幕(可視區域)對角線長度是 3.2*2.54 = 8.128 釐米。讀者可以去量
一量自己的手機螢幕,看和實際的尺寸是否一致。

  1. 4 種 activity 的啟動模式
    standard: 標準模式 ,一呼叫 startActivity() 方法就會產生一個新的例項。
    singleTop : 如果已經有一個例項位於 Activity 棧的頂部時,就不產生新的例項,而只是呼叫 Activity中的 newInstance() 方法。如果不位於棧頂,會產生一個新的例項。
    singleTask : 會在一個新的 task 中產生這個例項,以後每次呼叫都會使用這個,不會去產生新的例項了。
    singleInstance : 這個跟 singleTask 基本上是一樣,只有一個區別:在這個模式下的 Activity 例項所處的 task 中,只能有這個 activity 例項,不能有其他的例項。

  2. 什麼是 ANR 如何避免它 ?
    ANR : Application Not Responding ,五秒
    在 Android 中,活動管理器和視窗管理器這兩個系統服務負責監視應用程式的響應。當出現下列情況時, Android 就會顯示 ANR 對話方塊了:
    對輸入事件 ( 如按鍵、觸控式螢幕事件 ) 的響應超過 5 秒
    意向接受器 (intentReceiver) 超過 10 秒鐘仍未執行完畢
    Android 應用程式完全執行在一個獨立的執行緒中 ( 例如 main) 。這就意味著,任何在主執行緒中執行的,需要消耗大量時間的操作都會引發 ANR 。因為此時,你的應用程式已經沒有機會去響應輸入事件和意向廣播 (Intent broadcast) 。

因此,任何執行在主執行緒中的方法,都要儘可能的只做少量的工作。特別是活動生命週期中的重要方法如 onCreate() 和 onResume() 等更應如此。潛在的比較耗時的操作,如訪問網路和資料庫; 或者是開銷很大的計算,比如改變點陣圖的大小,需要在一個單獨的子執行緒中完成 ( 或者是使用非同步請求,如資料庫操作 ) 。但這並不意味著你的主執行緒需要進入阻塞狀態已等待子執行緒結束 — 也不需要呼叫 Therad.wait() 或者 Thread.sleep() 方法。取而代之的是,主執行緒為子執行緒提供一個控制代碼(Handler) ,讓子執行緒在即將結束的時候呼叫它 (xing: 可以參看 Snake 的例子,這種方法與以前我們所接觸的有所不同 ) 。使用這種方法涉及你的應用程式,能夠保證你的程式對輸入保持良好的響應,從而避免因為輸入事件超過 5 秒鐘不被處理而產生的 ANR 。這種實踐需要應用到所有顯示使用者介面的執行緒,因為他們都面臨著同樣的超時問題。

25.Android Intent 的使用
在一個 Android 應用中,主要是由一些元件組成,( Activity,Service,ContentProvider,etc.) 在這些元件之間的通訊中,由 Intent 協助完成。
正如網上一些人解析所說, Intent 負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述, Android 則根據此 Intent 的描述,負責找到對應的元件,將 Intent 傳遞給呼叫的元件,並完成元件的呼叫。 Intent 在這裡起著實現呼叫者與被呼叫者之間的解耦作用。
Intent 傳遞過程中,要找到目標消費者(另一個 Activity,IntentReceiver 或 Service ),也就是 Intent的響應者,有兩種方法來匹配:
1 ,顯示匹配( Explicit) :
public TestB extents Activity
{
………
};
public class Test extends Activity
{
……
public void switchActivity()
{
Intent i = new Intent(Test.this, TestB.class);
this.startActivity(i);
}
}
程式碼簡潔明瞭,執行了 switchActivity() 函式,就會馬上跳轉到名為 TestB 的 Activity 中。

2 ,隱式匹配 (Implicit):

隱式匹配,首先要匹配 Intent 的幾項值: Action, Category, Data/Type,Component
如果填寫了 Componet 就是上例中的 Test.class) 這就形成了顯示匹配。所以此部分只講前幾種匹配。匹配規則為最大匹配規則,

1 ,如果你填寫了 Action ,如果有一個程式的 Manifest.xml 中的某一個 Activity 的 IntentFilter 段中定義了包含了相同的 Action 那麼這個 Intent 就與這個目標 Action 匹配,如果這個 Filter 段中沒有定義 Type,Category ,那麼這個 Activity 就匹配了。但是如果手機中有兩個以上的程式匹配,那麼就會彈出一個對話可框來提示說明。
Action 的值在 Android 中有很多預定義,如果你想直接轉到你自己定義的 Intent 接收者,你可以在接收者的 IntentFilter 中加入一個自定義的 Action 值(同時要設定 Category 值為”android.intent.category.DEFAULT” ),在你的 Intent 中設定該值為 Intent 的 Action, 就直接能跳轉到你自己的 Intent 接收者中。因為這個 Action 在系統中是唯一的。
2,data/type ,你可以用 Uri 來做為 data, 比如 Uri uri = Uri.parse(http://www.google.com );
Intent i = new Intent(Intent.ACTION_VIEW,uri); 手機的 Intent 分發過程中,會根據http://www.google.com 的 scheme 判斷出資料型別 type
手機的 Brower 則能匹配它,在 Brower 的 Manifest.xml 中的 IntenFilter 中首先有 ACTION_VIEW Action, 也能處理 http: 的 type ,

3 ,至於分類 Category ,一般不要去在 Intent 中設定它,如果你寫 Intent 的接收者,就在Manifest.xml 的 Activity 的 IntentFilter 中包含 android.category.DEFAULT, 這樣所有不設定 Category( Intent.addCategory(String c); )的 Intent 都會與這個 Category 匹配。

4,extras (附加資訊),是其它所有附加資訊的集合。使用 extras 可以為元件提供擴充套件資訊,比如,如果要執行 “ 傳送電子郵件 ” 這個動作,可以將電子郵件的標題、正文等儲存在 extras 裡,傳給電子郵件傳送元件。