android面試題(共12章,史上最全)

1章 初識Android 1

1.1 Android歷史 1

Android之父是誰?

答案:Andy Rubin(安迪魯賓)。

1.2 移動操作系統簡介 2

請寫出當前比較流行的幾款移動操作系統與其開發語言。

答案:Windows Mobile / Phone的開發語言是C#C++iOS的開發語言是Objective-CSymbian的開發語言是C++BlackBerry的開發語言是JavaAndroid使用Java作爲主要的應用開發語言,在需要更改Android的底層功能時,需要使用CC++

1.3 Android版本更替 3

現在最新的Android版本叫什麼?

答案:叫做Jelly Bean(果凍豆),也就是4.2版。

1.4 Android系統特性 5

Android系統的特性有很多,請說出四個特性。

答案:顯示佈局、數據存儲、網絡、信息、瀏覽器、編程語言支持、媒體支持、流媒體支持、硬件支持、多點觸控、藍牙、多任務處理、語音功能、無線共享功能、截圖功能、跨平臺、應用程序安全機制。

1.5 Android系統架構 7

請寫出Android系統架構有幾層,分別是哪幾層。

答案:有四層。分別是Linux內核、本地庫和Java運行時環境、應用程序框架、應用程序。

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 應用程序框架爲開發者提供服務。以下是一些核心庫:

  系統  一個從 BSD 繼承來的標準 系統函數庫( libc ) 它是專門爲基於 embedded linux 的設備定製的。

  媒體庫 基於 PacketVideo OpenCORE;該庫支持多種常用的音頻、視頻格式回放和錄製,同時支持靜態圖像文件。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 

  * Surface Manager - 對顯示子系統的管理,並且爲多個應用程序提 供了2D3D圖層的無縫融合。

  * 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 內核也同時作爲硬件和軟件棧之間的抽象層。

1.6 在Windows下搭建Android開發環境 10

       1.6.1 環境搭建步驟 10

       1.6.2 一次性打包下載 16

請寫出整個Android開發環境的搭建過程步驟。

答案:安裝JDK -> 安裝Eclipse -> 下載Android SDK-> Eclipse中安裝並配置ADT

1.7 Android HelloWorld 17

編寫一個簡單的Android開發HelloWorld應用的步驟是什麼。

答案:① 建立項目;② 編寫代碼;③ 建立AVDAndroid模擬器);④ 運行HelloWorld

1.8 Android應用程序框架 23

Android的每一個應用都是一套具有固定框架的程序與代碼集合,裏面包括哪些內容,請說不少於四個。

答案:裏面包括Java源代碼、界面佈局文件、項目配置文件(AndroidManifest.xml)、字符串數據配置文件、主題和樣式(Style)配置文件、圖片資源、菜單佈局文件、自動生成的R.javaApk(可執行的安裝包)文件、庫文件等。

1.9 常用的開發與調試工具介紹 24

Android開發中常用的開發與調試工具有很多,請說出不少於兩個。

答案:adbDDMSAVD ManagerEmulatorLogCatSDK Manager

1.10 Android四大組件簡介 25

請簡要介紹Android的四大組件。

答案:Android系統有四種組件,這四種組件構成了Android應用的框架,然後由Intent聯繫這四種組件。Activity用來顯示Android的程序界面,一個應用往往有多個界面,所以一個應用中會有多個ActivityService沒有界面的後臺服務,會一直運行在後臺。常被用來做數據處理,也可以做一些定時的任務。Broadcast ReceiverAndroid的廣播接收器,在廣播機制中充當廣播的接受者的作用,Android中充滿了各種廣播,所有需要有選擇地接收一些有用的廣播,然後處理這些廣播。Content Provider可直譯爲內容提供者,它是用在不同的應用程序之間共享數據時,可以把一個應用的數據提供給其他的應用使用。

你如何評價Android系統?優缺點。

答案:優點:1、學習的開源性;   

2、軟件兼容性比較好;

   3、軟件發展迅速;

4、界面佈局好。

   缺點:1、版本過多;

2、先有軟件少  3、商務性能差。

AndroidActivity, Intent, Content Provider, Service各有什麼區別。

答案:Activity 活動,是最基本的android應用程序組件。一個活動就是一個單獨的屏幕,每一個活動都被實現爲一個獨立的類,並且從活動基類繼承而來。
Intent 意圖,描述應用想幹什麼。最重要的部分是動作和動作對應的數據。
Content Provider:內容提供器,android應用程序能夠將它們的數據保存到文件、SQLite數據庫中,甚至是任何有效的設備中。當你想將你的應用數據和其他應用共享時,內容提供器就可以發揮作用了。
Service:服務,具有一段較長生命週期且沒有用戶界面的程序。

Manifest.xml文件中主要包括哪些信息?

答案:manifest:根節點,描述了package中所有的內容。
uses-permission:請求你的package正常運作所需賦予的安全許可。
permission 聲明瞭安全許可來限制哪些程序能你package中的組件和功能。
instrumentation:聲明瞭用來測試此package或其他package指令組件的代碼。
application:包含packageapplication級別組件聲明的根節點。
activityActivity是用來與用戶交互的主要工具。
receiverIntentReceiver能使的application獲得數據的改變或者發生的操作,即使它當前不在運行。
serviceService是能在後臺運行任意時間的組件。
providerContentProvider是用來管理持久化數據併發布給其他應用程序使用的組件。

第2章 Activity與Intent 28

2.1 使用Activity 28

2.2 Activity的生命週期 29

2.2.1 生命週期中的各個方法 30

生命週期中有哪幾個方法?

答案:onCreate() onStart()onResume()onPause()onStop()onDestroy()onRestart()




橫豎屏切換時候activity的生命週期

答案:1.不設置Activityandroid:configChanges,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。

2.設置Activityandroid:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次。
3.設置Activityandroid:configChanges="orientation|keyboardHidden",切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法。

2.2.2 Activity的四種基本狀態 31

Activity的四種基本狀態分別是哪些?

答案:運行態(Running)、暫停態(Paused)、停止態(Stopped)、終止態(Destroyed)。

2.2.3 編程測試Activity生命週期 31

2.2.4 Activity之間協同的情況 35

假設Activity A啓動Activity B,請描述其調用過程。

答案:①Activity A執行onPause()方法,它失去焦點;

Activity B依次執行onCreate()onStart()onResume()方法,這時Activity B擁有了焦點;然後,如果Activity A不再被用戶可見,它的onStop()方法將被執行。

請詳細請描述一下在Activity的生命週期中各個方法的調用順序。

答案:① 初次啓動一個Activity時的執行過程是:依次執行了onCreate() onStart() onResume()方法。② 當Activity啓動後,點擊“返回”按鈕,這時Activity的執行順序是:onPause() -> onStop() -> onDestroy()。③ 啓動一個Activity時的執行過程是:依次執行了onCreate() onStart() onResume()方法。④ 在Activity被啓動之後,點擊Home按鈕,這時Activity的執行順序是:onPause() -> onStop()。⑤ 點擊Home按鈕後,系統回到桌面,然後我們再找到這個應用並打開,這時Activity的執行順序是:onRestart() -> onStart() -> onResume()。⑥ 重新啓動一個應用,在它被啓動後,先點擊“撥打電話”按鈕,之後再點擊“返回”按鈕,這時Activity的執行順序是:onPause() -> onStop() -> onRestart() -> onStart() -> onResume()

2.3 Activity的啓動與關閉 35

2.3.1 直接啓動Activity 35

2.3.2 帶返回值啓動Activity 35

2.3.3 關閉Activity 39

請結合文字和代碼來詳細描述Activity的兩種啓動方式。

答案:①直接啓動:首先聲明一個Intent對象用來指定啓動源和啓動目標,接着如果需要則在其中封裝一些數據,然後使用startActivity(Intent)方法將這個Intent對象傳入,即可完成Activity的啓動。關鍵代碼段如下:

Intent intent = new Intent(this, NewActivity.class);

this.startActivity(intent);

如果想啓動多個Activity,則使用startActivities(Intent[])即可。

②帶返回值的啓動:這種方式使用startActivityForResult(Intent intent, int requestCode)方法來實現,並在原Activity中重寫onActivityResult(int requestCode, int resultCode, Intent data) 方法來獲取到返回值,之後通過requestCoderesultCode兩個參數匹配到相應的Activity,然後就可以通過data參數處理返回信息了。

4activity的啓動模式。

答案:standard: 標準模式,一調用startActivity()方法就會產生一個新的實例。 

singleTop: 如果已經有一個實例位於Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的實例。 

singleTask: 會在一個新的task中產生這個實例,以後每次調用都會使用這個,不會去產生新的實例了。 

singleInstance: 這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity實例所處的task中,只能有這個activity實例,不能有其他的實例。

如何退出Activity

答案:對於單一Activity的應用來說,退出很簡單,直接finish()即可。當然,也可以用killProcess()System.exit()這樣的方法。現提供幾個方法,供參考:
1、拋異常強制退出:該方法通過拋異常,使程序Force Close。驗證可以,但是,需要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。
2、記錄打開的Activity:每打開一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
3、發送特定廣播:在需要結束應用時,發送一個特定的廣播,每個Activity收到廣播後,關閉即可。
4、遞歸退出在打開新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞歸關閉。除了第一個,都是想辦法把每一個Activity都結束掉,間接達到目的。但是這樣做同樣不完美。你會發現,如果自己的應用程序對每一個Activity都設置了nosensor,在兩個Activity結束的間隙,sensor可能有效了。但至少,我們的目的達到了,而且沒有影響用戶使用。爲了編程方便,最好定義一個Activity基類,處理這些共通問題。

2.4 Activity的管理——Task與Back Stack 40

2.4.1 Task 40

2.4.2 Back Stack 40

Android系統中,使用什麼對Activity進行管理?

答案:使用Task(作業)和Back StackActivity棧)對Activity進行管理。

2.5 Activity的其他操作 41

請說出一個Activity的其他操作。

答案:改變標題與去掉標題欄、不可見與透明、橫豎屏顯示。

如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?

答案:當你的程序中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B 
這個時候A會執行

Java代碼

public void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    outState.putLong("id", 1234567890);}  

 

完成以後又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回
收的A就要重新調用onCreate()方法,不同於直接啓動的是這回onCreate()裏是帶上參數savedInstanceState,沒被收回的就還是onResume就好了。

savedInstanceState是一個Bundle對象,你基本上可以把他理解爲系統幫你維護的一個Map對象。在onCreate()裏你可能會 用到它,如果正常啓動onCreate就不會有它,所以用的時候要判斷一下是否爲空。

Java代碼

if(savedInstanceState != null){  
     long id = savedInstanceState.getLong("id");  
}  

就像官方的Notepad教程 裏的情況,你正在編輯某一個note,突然被中斷,那麼就把這個noteid記住,再起來的時候就可以根據這個id去把那個note取出來,程序就完整 一些。這也是看你的應用需不需要保存什麼,比如你的界面就是讀取一個列表,那就不需要特殊記住什麼,哦, 沒準你需要記住滾動條的位置...

2.6 使用Intent激活組件 42

三大組件——ActivityServiceBroadcast Receiver都是被什麼激活的?

答案:Intent是一種運行時綁定的消息機制,而三大組件——ActivityServiceBroadcast Receiver都是被消息激活的,這種消息就是Intent

2.7 Intent對象的屬性 43

2.7.1 ComponentName(組件名)及顯式與隱式Intent 43
2.7.2 Action(動作) 44
2.7.3 Data(數據)及內置Intent的使用 45
2.7.4 Category(分類) 46
2.7.5 Extra(額外信息)及Intent數據傳遞 47
2.7.6 Flag(標誌) 48

一個Intent對象包括六個屬性,請一一列舉這六個屬性。

答案:組件名(Component Name)、動作(Action)、數據(Data)、分類(Category)、額外信息(Extra)和標誌(Flags)。

Android Intent的使用

答案:在一個Android應用中,主要是由一些組件組成,(Activity,Service,ContentProvider,etc.)在這些組件之間的通訊中,由Intent協助完成。

正如網上一些人解析所說,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent在這裏起着實現調用者與被調用者之間的解耦作用。

Intent傳遞過程中,要找到目標消費者(另一個Activity,IntentReceiverService),也就是Intent的響應者,有兩種方法來匹配:

1顯示匹配(Explicit) 

[java] view plaincopyprint?

public TestB extents Activity  

{  

 .........  

};  

 public class Test extends Activity  

{  

     ......  

     public void switchActivity()  

     {  

            Intent i = new Intent(Test.this, TestB.class);  

            this.startActivity(i);  

     }  

}  

代碼簡潔明瞭,執行了switchActivity()函數,就會馬上跳轉到名爲TestBActivity中。 

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

1如果你填寫了Action,如果有一個程序的Manifest.xml中的某一個ActivityIntentFilter段中定義了包含了相同的Action那麼這個Intent就與這個目標Action匹配,如果這個Filter段中沒有定義Type,Category,那麼這個Activity就匹配了。但是如果手機中有兩個以上的程序匹配,那麼就會彈出一個對話可框來提示說明。
Action的值在Android中有很多預定義,如果你想直接轉到你自己定義的Intent接收者,你可以在接收者的IntentFilter中加入一個自定義的Action值(同時要設定Category值爲"android.intent.category.DEFAULT"),在你的Intent中設定該值爲IntentAction,就直接能跳轉到你自己的Intent接收者中。因爲這個Action在系統中是唯一的。
2data/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則能匹配它,在BrowerManifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能處理http:type

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

4extras(附加信息),是其它所有附加信息的集合。使用extras可以爲組件提供擴展信息,比如,如果要執行發送電子郵件這個動作,可以將電子郵件的標題、正文等保存在extras裏,傳給電子郵件發送組件。
 

轉載地址:http://blog.csdn.net/itachi85/article/details/7426457

2.8 IntentFilter(Intent過濾器) 48

2.8.1 使用IntentFilter 49

2.8.2 測試IntentFilter 49

爲什麼要引入IntentFilter

答案:對於顯式Intent,它的接受者已被指定,所以系統會自動把這個Intent發給指定的組件。但是對於隱式Intent,由於並沒有指定其組件名屬性,所以系統不知道該把它發給哪個組件名,於是系統就直接將其發出去,算是所有的組件都有權接收,這就需要定義一個組件可以接收到哪些Intent,所以就引入了IntentFilterIntent過濾器)。

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 ,('_'換成'.' < --注意:這個是文章內容不是笑臉)就可以用在描述文件 中了,找找類定義和描述文件中的對應關係就都明白了。 

第3章 Android UI開發基礎 52

3.1 Android UI框架 52

3.1.1 View和ViewGroup 52

請分析ViewViewGroup的關係。

答案:ViewViewGroup的父類。AndroidUI開發使用層次模型來完成,一般都是在一個ViewGroup中嵌套多層ViewGroup,每一層中含有隨意數目的View。我們可以將整個屏幕看做一個ViewGroup,它同時也是一個View,而在這個整體的ViewGroup之中,又有多個ViewGroupView,每個ViewGroup中又可以有多個子ViewGroupView

3.1.2 Android UI開發分類 53

3.2 常用的基本控件(一) 55

3.2.1 TextView 58

請說明TextView繼承自誰和它是用來幹什麼的。

答案:它直接繼承自View,用來向用戶顯示文本並允許用戶編輯它。

請寫出TextView的不少於四個子孫類。

答案:EditTextButtonDigitalClockTextClockCheckedTextViewChronometerCheckBoxRadioButtonSwitch等。

3.2.2 EditText 62

EditText是什麼,及其用處。

答案:EditText繼承自TextView,專門用來獲取用戶輸入的文本信息。由於它是繼承自TextView的,所以可以說EditText就是一個可編輯的TextView

3.2.3 Button 63

Button繼承自什麼類,及其作用。

答案:Button同樣繼承自TextView,它本身還有幾個子孫類,包括CheckBoxRadioButtonSwitchToggleButton等。按鈕在UI開發中用的很多,常用來響應用戶的點擊。

3.3 Android UI佈局 64

3.3.1 LinearLayout——線性佈局 65
3.3.2 RelativeLayout——相對佈局 67
3.3.3 TableLayout——表格佈局 68
3.3.4 FrameLayout——幀佈局 70
3.3.5 AbsoluteLayout——絕對佈局 71

請寫出Android中的五大布局。

答案:LinearLayout線性佈局、RelativeLayout相對佈局、TableLayout表格佈局、FrameLayout幀佈局和AbsoluteLayout絕對佈局。

請介紹下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" 該元素在 idaaa的下面    

    android:layout_toLeftOf="@id/bbb" 改元素的左邊是bbb    

     相對於父元素的地方    

     android:layout_alignParentLeft="true"  在父元素左對齊    

     android:layout_alignParentRight="true" 在父元素右對齊    

     還可以指定邊距等,具體詳見API    

            

5.TableLayout    

     表格佈局類似Html裏面的Table。每一個TableLayout裏面有表格行TableRowTableRow裏面可以具體定義每一個元素,設定他的對齊方式 android:gravity=""     

     每一個佈局都有自己適合的方式,另外,這五個佈局元素可以相互嵌套應用,做出美觀的界面。

3.4 常用的基本控件(二) 71

3.4.1 ImageView和ImageButton 72

請寫出ImageButtonImageView的關係和區別。

答案:ImageButton繼承自ImageView ImageButton用在需要接收用戶點擊的圖片顯示中,而ImageView則一般用來直接顯示圖片。

3.4.2 CheckBox、RadioButton和ToggleButton 75

CheckBoxRadioButtonToggleButton的父類是誰,及它們都是什麼?

答案:這三者全部是Button的子類,都是與處理用戶點擊事件有關的控件。其中,CheckBox是選擇框,RadioButton是單選按鈕,而ToggleButton是雙狀態選擇按鈕。

Android常用控件的信息。

答案:單選框(RadioButtonRadioGroup)

RadioGroup用於對單選框進行分組,相同組內的單選框只有一個單選框被選中。

事件:setOnCheckedChangeListener(),處理單選框被選擇事件。把RadioGroup.OnCheckedChangeListener實例作爲參數傳入。

多選框(CheckBox):

每個多選框都是獨立的,可以通過迭代所有的多選框,然後根據其狀態是否被選中在獲取其值。

事件:setOnCheckChangeListener()處理多選框被選擇事件。把CompoundButton.OnCheckedChangeListener實例作爲參數傳入

下拉列表框(Spring)

Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());獲取下拉列表框的值。

事件:setOnItemSelectedListener(),處理下拉列表框被選擇事件把AdapterView.OnItemSelectedListener實例作爲參數傳入;

拖動條(SeekBar)

SeekBar.getProgress()獲取拖動條當前值

事件:setOnSeekBarChangeListener(),處理拖動條值變化事件,把SeekBar.OnSeekBarChangeListener實例作爲參數傳入。

菜單(Menu):

重寫ActivityonCreatOptionMenu(Menu menu)方法,該方法用於創建選項菜單,咋用戶按下手機的"Menu"按鈕時就會顯示創建好的菜單,在onCreatOptionMenu(Menu Menu)方法內部可以調用Menu.add()方法實現菜單的添加。

重寫ActivityonMenuItemSelected()方法,該方法用於處理菜單被選擇事件。

進度對話框(ProgressDialog)

創建並顯示一個進度對話框:ProgressDialog.show(ProgressDialogActivity.this,"請稍等""數據正在加載中...."true)

設置對話框的風格:setProgressStyle()

ProgressDialog.STYLE_SPINNER  旋轉進度條風格(爲默認風格)

ProgressDialog.STYLE_HORIZONTAL 橫向進度條風格

android:gravityandroid:layout_gravity的區別

答案:LinearLayout有兩個非常相似的屬性:android:gravityandroid:layout_gravity。他們的區別在 於:android:gravity用於設置View組件的對齊方式,而android:layout_gravity用於設置Container組件的 對齊方式。

舉個例子,我們可以通過設置android:gravity="center"來讓EditText中的文字在EditText組件中居中顯示;同 時我們設置EditTextandroid:layout_gravity="right"來讓EditText組件在LinearLayout中居中 顯示。來實踐以下:

正如我們所看到的,在EditText中,其中的文字已經居中顯示了,而EditText組件自己也對齊到了LinearLayout的右側。

[html] view plaincopyprint?

<LinearLayout   

    xmlns:android="http://schemas.android.com/apk/res/android"   

    android:orientation="vertical"   

    android:layout_width="fill_parent"   

    android:layout_height="fill_parent">   

    <EditText   

        android:layout_width="wrap_content"   

        android:gravity="center"   

        android:layout_height="wrap_content"   

        android:text="one"   

        android:layout_gravity="right"/>   

</LinearLayout>  


這兩個屬性也可以用於 Framlayout Textview 等等,表示的意思大同小異。

paddingmargin的區別。

答案:padding填充的意思,指的是view中的contentview邊緣的距離,類似文本中的indent
margin表示的是view的左邊緣與parent view的左邊緣的距離
margin一般用來描述控件間位置關係,而padding一般描述控件內容和控件的位置關係。

簡單,padding是站在父 view的角度描述問題,它規定它裏面的內容必須與這個父view邊界的距離。margin則是站在自己的角度描述問題,規定自己和其他(上下左右)的 view之間的距離,如果同一級只有一個view,那麼它的效果基本上就和padding一樣了。例如我的XML layout代碼如下:

view plaincopy to clipboardprint?

[html] view plaincopyprint?

<?xml version="1.0" encoding="utf-8"?>    

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    

    android:orientation="vertical"    

    android:layout_width="fill_parent"    

    android:layout_height="fill_parent"    

    android:paddingLeft="10dip"    

    android:paddingRight="10dip"    

    android:paddingTop="10dip"    

    android:paddingBottom="10dip"    

    >    

<TextView      

    android:layout_width="wrap_content"     

    android:layout_height="wrap_content"     

    android:background="#FF0000"    

    android:text="@string/hello"    

    android:paddingLeft="50dip"    

    android:paddingRight="50dip"    

    android:paddingTop="50dip"    

    android:paddingBottom="50dip"    

    android:layout_marginBottom="10dip"    

    />    

    <TextView      

    android:layout_width="wrap_content"     

    android:layout_height="wrap_content"     

    android:background="#FF0000"    

    android:text="@string/hello"    

    android:paddingLeft="50dip"    

    android:paddingRight="50dip"    

    android:paddingTop="50dip"    

    android:paddingBottom="50dip"    

    android:layout_marginBottom="10dip"    

    />    

    <TextView      

    android:layout_width="wrap_content"     

    android:layout_height="wrap_content"     

    android:background="#FF0000"    

    android:text="@string/hello"    

    android:paddingLeft="50dip"    

    android:paddingRight="50dip"    

    android:paddingTop="50dip"    

    android:paddingBottom="50dip"    

    android:layout_marginBottom="10dip"    

    />    

    <TextView      

    android:layout_width="wrap_content"     

    android:layout_height="wrap_content"     

    android:background="#FF0000"    

    android:text="@string/hello"    

    android:paddingLeft="50dip"    

    android:paddingRight="50dip"    

    android:paddingTop="50dip"    

    android:paddingBottom="50dip"    

    android:layout_marginBottom="10dip"    

    />    

</LinearLayout>    

 

 那麼我會得到如下的效果,圖上已經很明確的標出來區別咯。

註冊廣播接收者兩種方式的區別。

答案:現在我們就來實現一個簡單的廣播程序。Android提供了兩種註冊廣播接受者的形式,分別是在程序中動態註冊和在xml中指定。他們之間的區別就是作用 的範圍不同,程序動態註冊的接收者只在程序運行過程中有效,而在xml註冊的接收者不管你的程序有沒有啓動有會起作用。

第4章 AdapterView 82

4.1 Adapter簡介 82

請寫出Android中的不少於四個Adapter控件。

答案:ListViewGallerySpinners、自定義Adapter控件和GridView等。

請寫出Android中的不少於四種Adapter對象。

答案:ArrayAdapterSimpleAdapter、自定義AdapterSimpleCursorAdapter

4.2 最常用的AdapterView——ListView 83

4.2.1 ListView的XML屬性 84
4.2.2 爲ListView填充數據 84
4.2.3 響應用戶單擊事件 84
4.2.4 響應用戶長按事件 85

請寫出ListView的特點。

答案:①採用MVC模式將前端顯示和後端數據分離。②該控件不能使用ListView.add或類似方法添加數據,需要指定一個Adapter對象,通過Adapter對象獲得需要顯示的數據,這個Adapter需要實現ListAdapter接口。③爲ListView提供數據的List或數組相當於MVC模式中的M(數據模型Model)。④ListView相當於MVC模式中的V(視圖View)。⑤Adapter對象相當於MVC模式中的C(控制器Control)。

4.3 ArrayAdapter 85

4.4 SimpleAdapter 88

4.5 SimpleCursorAdapter 92

4.6 自定義Adapter 93

請寫出ArrayAdapterSimpleAdapterSimpleCursorAdapter和自定義的Adapter各自的特點。

答案:①ArrayAdapter:最簡單的Adapter,適合於列表項中只含有文本信息的情況,是填充文本列表最簡便的一種方式。②SimpleAdapter:比ArrayAdapter複雜,適合於每一個列表項中含有不同的子控件,比如一個圖片、一串文本和一個按鈕的組合。③SimpleCursorAdapter:專門用來把一個Cursor(遊標)中的數據映射到列表中,Cursor中的每一條數據映射爲列表中的一項。Cursor常用在數據庫查詢中,會把查詢到的若干條記錄放在一個Cursor中。④自定義Adapter:完全自行定義數據的適配方式,靈活性最強,但使用起來比前三個複雜。適合於當前三個Adapter不能滿足需求的情況下。

4.7 ListView的緩存原理 97

請簡單介紹一下ListView的緩存機制。

答案:①如果有幾千、幾萬甚至更多的項時,其中只有可見的項存在於內存中,其它的都在Recycler中,RecyclerAndroid中專門用來處理緩存的組件。②ListView先通過getView()方法請求一個View,然後請求其它可見的ViewconvertViewgetView中是空的(null)。③當列表第一項滾出屏幕,並且一個新的項從屏幕低端上來時,ListView會再請求一個View,這時,convertView已經不是空值了,它的值是滾出屏幕的第一項,之後只需設定新的數據,然後返回convertView即可,而不必重新創建一個View

ListView優化。

答案:工作原理

ListView 針對List中每個item,要求 adapter “給我一個視圖” (getView)

一個新的視圖被返回並顯示

如果我們有上億個項目要顯示怎麼辦?爲每個項目創建一個新視圖?NO!這不可能!

實際上Android爲你緩存了視圖。

Android中有個叫做Recycler的構件,下圖是他的工作原理:

如果你有10億個項目(item),其中只有可見的項目存在內存中,其他的在Recycler中。

1. ListView先請求一個type1視圖(getView)然後請求其他可見的項目。convertViewgetView中是空(null)

2. item1滾出屏幕,並且一個新的項目從屏幕低端上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1。你只需設定新的數據然後返回convertView,不必重新創建一個視圖。

4.8 其他的AdapterView 104

4.8.1 Spinner(選擇列表) 104

4.8.2 Gallery(縮略圖) 109

4.8.3 GridView(網格圖) 112

Spinner(選擇列表)和Gallery(縮略圖)的父類是誰?

答案:他們的父類是AbsSpinner

GridView(網格圖)的父類是誰?

答案:他的父類是AbsListView

第5章 Android UI開發進階 113

5.1 Dialog(對話框) 113

5.1.1 AlertDialog 114

請寫出創建AlertDialog的主要步驟。

答案:①獲得AlertDialog靜態內部類Builder對象並由該類創建對話框;②通過Buidler對象設置對話框樣式及其將要響應事件;③調用Buildercreate()方法創建對話框;④調用AlertDialogshow()方法顯示對話框。

5.1.2 ProgressDialog 119

5.1.3 DatePickerDialog 119

5.1.4 TimePickerDialog 120

Dialog(對話框)是一種顯示於Activity之上的界面元素,是作爲Activity的一部分被創建和顯示的,常用的對話框種類有哪些?

答案:

 

5.2 Menu(菜單) 121

5.2.1 OptionsMenu 122

5.2.2 SubMenu 124

5.2.3 ContextMenu 125

請簡單描述Android中常用的三種菜單類型。

答案:①OptionsMenu(選項菜單):點擊菜單鍵出現,一般在屏幕下方,最多可以有六項,更多的項目可以通過“更多”項找到,帶圖標的單項不會提供子項複選功能,而只能顯示單項的簡明標題,而除六項之外的擴展項不能顯示圖標,且不推薦使用子項複選功能。②SubMenu(子菜單):可以用來擴展基本菜單,它不支持圖標的顯示,且不能嵌套子菜單。③ContextMenu(上下文菜單):當用戶長按屏幕中的某一個界面元素時出現的菜單,它不支持圖標的顯示。

5.3 Toast 128

請寫出創建Toast的一般步驟,並舉一個例子。

答案:①調用Toast的靜態方法makeText();②添加顯示文本和時長,使用Toast.makeText(getApplicationContext(), “顯示文本”顯示時長)方法,其中的顯示時長是一個Int型的常量,有Toast.LENGTH_LONG(長時間)和Toast.LENGTH_SHORT(短時間)兩個可取值;③調用Toastshow()方法顯示提示信息。

舉例:Toast.makeText(this, "Toast信息", Toast.LENGTH_SHORT).show();

5.4 Notification(通知) 129

請寫出創建一個Notification的步驟。

答案:①得到NotificationManager的引用;②初始化一個Notification對象;③設置Notification的參數;④使用NotificationManagernotify(int, Notification)方法發出通知。

5.5 TabHost導航標籤 130

5.5.1 繼承TabActivity實現導航標籤 131
5.5.2 自定義TabHost實現導航標籤 132

請寫出TabHost實現導航的兩種方式。

答案:①繼承TabActivity;②自定義TabHost

5.6 樣式和主題 137

5.6.1 定義和使用樣式 138

Android系統中有提供一些預設的樣式可以使用,如果要產生自定義的樣式,請寫出其步驟。

答案:

 

5.6.2 樣式的繼承 139

爲了繼承樣式,有哪兩種方式可以選擇?

答案:①可以在定義樣式時使用“parent”屬性來繼承樣式,使用這種方式,我們可以繼承一個自己定義好的樣式,也可以繼承一個Android自帶的樣式。②另一種繼承的方式是使用用戶自定義的樣式作爲前綴即可,這種方式只適用於繼承用戶自定義的樣式。

5.6.3 使用主題 139

通過什麼方式可以指定預先定義好的主題?

答案:通過在AndroidManifest.xml中的<application>或者<activity>標籤中指定android:theme屬性即可指定預先定義好的主題。

5.6.4 Selector的使用 140

Android中,外觀設計有哪兩種方式?


第6章 數據存儲 142

6.1 Android數據存儲分類 142

請描述Android中的幾種數據存儲方式。

答案:

 

6.2 使用SharedPreferences 143

6.2.1 SharedPreferences的存儲特徵 143
6.2.2 讀數據 144
6.2.3 寫數據 144

請寫出使用SharedPreferences讀數據時獲得SharedPreferences對象的兩種方法。

答案:①getSharedPreferences():如果一個Activity需要使用到多個SharedPreferences文件,則使用這個方法,它的第一個參數就是SharedPreferences文件的名稱。②getPreferences():如果一個Activity只需使用一個SharedPreferences文件,則使用這個方法,該方法無需傳入名稱參數。

6.3 使用內部存儲 151

6.3.1 寫數據 151
6.3.2 讀數據 152
6.3.3 存儲緩存數據 152
6.3.4 其他有用的方法 152

請寫出從內部存儲中讀取一個文件的三個步驟。

答案:①調用openFileInput()方法並傳入要讀的文件的名稱作爲參數,它會返回一個FileInputStream對象。②調用該對象的read()方法讀取字節數據。③最後,調用其close()方法關閉輸入流。

6.4 使用外部存儲 153

6.4.1 檢查存儲介質的可用性 153
6.4.2 使用應用程序特有的外部存儲 154
6.4.3 使用公用的外部存儲 154
6.4.4 使用外部緩存 156

請寫出外部緩存和內部緩存的三點不同。

答案:①系統不會總是監控外部緩存的空間使用情況,不會自動刪除一些不用的文件。②外部緩存並不總是可用的,當用戶將外部存儲設備安裝在PC上或移除它之後,就會變得不可用。③外部緩存中的文件沒有安全性,所有的應用程序都可以讀寫這些文件。

6.5 使用SQLite數據庫 157

6.5.1 SQLite數據類型 157
6.5.2 關係數據類型 158
6.5.3 數據庫的鍵 158
6.5.4 重要的SQL語句 159
6.5.5 在Android中使用SQLite 160
6.5.6 SimpleCursorAdapter的使用 167

請寫出在Android中,訪問SQLite數據庫的兩種方式。

答案:①擴展SQLiteOpenHelper類提供數據訪問接口。②擴展ContentProvider類來提供數據訪問接口。

如何將SQLite數據庫(dictionary.db文件)apk文件一起發佈

答案:可以將dictionary.db文件複製到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。可以將dictionary.db文件複製到res aw目錄中

6.6 使用網絡存儲 168

怎樣對數據進行網絡存儲?

答案:將數據通過網絡存儲到遠程,一般可以採用Socket(點對點間的TCPUDP連接)或HTTPGETPUTPOSTDELETE請求)兩種方式將數據通過不同的網絡協議傳送到目標端(一般是一個網絡服務器),並在目標端的存儲設備中保存數據,之後想讀取數據時,再以相同的協議向目標端發送獲取數據的請求,等目標端收到請求後,就會將要獲取的數據通過網絡從目標端傳回本機設備。

6.7 使用ContentProvider共享數據 168

6.7.1 訪問ContentProvider提供的內容 169
6.7.2 Content URI 169
6.7.3 實現ContentProvider類 170

應用程序使用ContentResolver對象訪問ContentProvider提供的數據,它提供“CRUD”,請一一解釋“CRUD”是什麼。

答案:①Create(創建)②retrieve(恢復)③update(更新)④delete(刪除)。

如何將打開res aw目錄中的數據庫文件

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

談談android數據存儲方式。

答案:Android提供了5種方式存儲數據:
1)使用SharedPreferences存儲數據;它是Android提供的用來存儲一些簡單配置信息的一種機制,採用了XML格式將數據存儲到設備中。只能在同一個包內使用,不能在不同的包之間使用。
2)文件存儲數據;文件存儲方式是一種較常用的方法,在Android中讀取/寫入文件的方法,與Java中實現I/O的程序是完全一樣的,提供了openFileInput()openFileOutput()方法來讀取設備上的文件。
3SQLite數據庫存儲數據;SQLiteAndroid所帶的一個標準的數據庫,它支持SQL語句,它是一個輕量級的嵌入式數據庫。
4)使用ContentProvider存儲數據;主要用於應用程序之間進行數據交換,從而能夠讓其他的應用保存或讀取此Content Provider的各種數據類型。
5)網絡存儲數據;通過網絡上提供給我們的存儲空間來上傳(存儲)和下載(獲取)我們存儲在網絡空間中的數據信息。

第7章 Service與廣播機制 175

7.1 Service簡介 175

請寫出Service的四個特點。

答案:①沒有用戶界面。②比Activity 的優先級高,不會輕易被Android系統終止。③即使Service被系統終止,在系統資源恢復後Service也將自動恢復運行狀態。④可用於進程間通信(Inter Process CommunicationIPC),解決兩個不同Android應用程序進程之間的調用和通訊問題。

7.2 Service的兩種使用方式 176

Service的使用方式有哪幾種?

答案:Android中,Service有兩種不同的使用方式,一種是以啓動方式使用ServiceStarted Service),另一種是以綁定方式使用ServiceBound Service)。

7.3 以啓動方式使用Service 176

7.3.1 生命週期 176
7.3.2 實現自己的Service類 177
7.3.3 啓動Service 178
7.3.4 停止Service 179

請簡單描述被啓動的ServiceonCreate()onStart()onDestroy()這三個生命週期關鍵點。

答案:①onCreate()事件回調函數: Service的生命週期開始,完成Service的初始化工作。②onStart()事件回調函數:活動生命週期開始,但沒有與之對應的“停止”函數,因此可以近似認爲活動生命週期也是以onDestroy()標誌結束。③onDestroy()事件回調函數: Service的生命週期結束,釋放Service所有佔用的資源。

7.4 以綁定方式使用Service 179

7.4.1 生命週期 179
7.4.2 實現自己的Service類 180
7.4.3 綁定Service 180
7.4.4 解綁Service 181

請描述綁定式Service的五個特點。

答案:①通過服務鏈接(Connection)或直接獲取Service中狀態和數據信息。②服務鏈接能夠獲取到Service對象,因此綁定Service的組件可以調用在Service中實現的函數。③使用Service的組件通過Context.bindService()建立服務鏈接,通過Context.unbindService()停止服務鏈接。④如果在綁定過程中Service沒有啓動,Context.bindService()會自動啓動Service。⑤同一個Service可以綁定多個服務鏈接,這樣可以同時爲多個不同的組件提供服務。

7.5 兩種Service的選擇 181

請描述兩種Service的選擇?

答案:以啓動方式使用Service時,使用startService()方法的目的是回調onStart()方法,onCreate() 方法是在Service不存在的時候調用的,如果Service存在,那麼startService()將跳過onCreate() 方法,例如之前調用了bindService,那麼ServiceonCreate方法已經調用了。

以綁定方式使用Service時,使用bindService()方法的目的是回調onBind()方法,它的作用是在Service和調用者之間建立一個橋樑,當調用者結束時,Service也會結束,而不負責更多的工作,例如一個連接服務器的操作。

綜上,一般會把要在應用程序被關閉後仍然需要執行的操作實現爲一個啓動式的Service,而將一些執行特定功能、執行週期短或在應用程序關閉後將要停止的操作實現爲綁定式的Service

如何啓用Service,如何停用Service 

答案:Android中的服務和windows中的服務是類似的東西,服務一般沒有用戶操作界面,它運行於系統中不容易被用戶發覺,可以使用它開發如監控之類的程序。服務的開發比較簡單,如下:

第一步:繼承Service

public class SMSService extends Service {

}

第二步:在AndroidManifest.xml文件中的<application>節點裏對服務進行配置:

<service android:name=".SMSService" />

 

服務不能自己運行,需要通過調用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()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用

[java] view plaincopyprint?

採用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);//解除綁定  

          }});         

    }  

}  

7.6 Android廣播機制 182

7.6.1 收發廣播 182
7.6.2 系統自帶的廣播 188
7.6.3 廣播的分類 188

請描述在註冊BroadcastReceiver時,Android提供的兩種方法。

答案:①在Java代碼中調用registerReceiver()方法動態註冊非常駐型BroadcastReceiver。②在AndroidManifest.xml文件中使用<receiver>標籤靜態註冊常駐型BroadcastReceiver

7.6.4 廣播接收器的生命週期 189

Service的最小代碼集並不能完成任何實際的功能,需要重寫onCreate()onStart()onDestroy()三個方法,才能使Service具有實際意義。請寫出這三個方法的調用情況。

答案:①Android系統在創建Service時,會自動調用onCreate() 完成必要的初始化工作。②在Service沒有必要再存在時,系統會自動調用onDestroy(),釋放所有佔用的資源。③通過Context.startService(Intent)啓動Service時,onStart()則會被系統調用,Intent會傳遞給Service一些重要的參數。

廣播接收者生命週期

答案:一個廣播接收者有一個回調方法:void onReceive(Context curContext, Intent broadcastMsg)。當一個廣播消息到達接收者是,Android調用它的onReceive()方法並傳遞給它包含消息的Intent對象。廣播接收者被認爲僅當它執行這個方法時是活躍的。當onReceive()返回後,它是不活躍的。

有一個活躍的廣播接收者的進程是受保護的,不會被殺死。但是系統可以在任何時候殺死僅有不活躍組件的進程,當佔用的內存別的進程需要時。

這帶來一個問題,當一個廣播消息的響應時費時的,因此應該在獨立的線程中做這些事,遠離用戶界面其它組件運行的主線程。如果onReceive()衍生線程然後返回,整個進程,包括新的線程,被判定爲不活躍的(除非進程中的其它應用程序組件是活躍的),將使它處於被殺的危機。解決這個問題的方法是onReceive()啓動一個服務,及時服務做這個工作,因此係統知道進程中有活躍的工作在做。

AIDL的全稱是什麼?如何工作?能處理哪些類型的數據?

答案:AIDL全稱Android Interface Definition LanguageAndRoid接口描述語言)是一種藉口描述語言編譯器可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程跨界對象訪問的目的.AIDLIPC的機制和COMCORBA類似是基於接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關類.; 2. 調用aidl產生的class.理論上參數可以傳遞基本數據類型和String, 還有就是Bundle的派生類不過在Eclipse,目前的ADT不支持Bundle做爲參數,
具體實現步驟如下:

1、創建AIDL文件在這個文件裏面定義接口該接口定義了可供客戶端訪問的方法和屬性。

2、編譯AIDL文件Ant的話可能需要手動使用Eclipse plugin的話,可以根據adil文件自動生產java文件並編譯不需要人爲介入.

3、在Java文件中實現AIDL中定義的接口編譯器會根據AIDL接口產生一個JAVA接口。這個接口有一個名爲Stub的內部抽象類,它繼承擴展了接口並實現了遠程調用需要的幾個方法。接下來就需要自己去實現自定義的幾個接口了.
4、向客戶端提供接口ITaskBinder, 如果寫的是service,擴展該Service並重載onBind ()方法來返回一個實現上述接口的類的實例。
5、在服務器端回調客戶端的函數前提是當客戶端獲取的IBinder接口的時候,要去註冊回調函數只有這樣服務器端才知道該調用那些函數

AIDL語法很簡單,可以用來聲明一個帶一個或多個方法的接口,也可以傳遞參數和返回值。 由於遠程調用的需要這些參數和返回值並不是任何類型.下面是些AIDL支持的數據類型:

1. 不需要import聲明的簡單Java編程語言類型(int,boolean)

2. String, CharSequence不需要特殊聲明

3. List, MapParcelables類型這些類型內所包含的數據成員也只能是簡單數據類型, String等其他比支持的類型.

(另外我沒嘗試Parcelables, Eclipse+ADT下編譯不過或許以後會有所支持).

實現接口時有幾個原則:

.拋出的異常不要返回給調用者跨進程拋異常處理是不可取的.

.IPC調用是同步的。如果你知道一個IPC服務需要超過幾毫秒的時間才能完成地話,你應該避免在Activity的主線程中調用。也就是IPC調用會掛起應用程序導致界面失去響應這種情況應該考慮單起一個線程來處理.

.不能在AIDL接口中聲明靜態屬性。

IPC的調用步驟:

1. 聲明一個接口類型的變量,該接口類型在.aidl文件中定義。

2. 實現ServiceConnection

3. 調用ApplicationContext.bindService(),並在ServiceConnection實現中進行傳遞.

4. ServiceConnection.onServiceConnected()實現中,你會接收一個IBinder實例(被調用的Service). 調用

YourInterfaceName.Stub.asInterface((IBinder)service)將參數轉換爲YourInterface類型。

5. 調用接口中定義的方法。你總要檢測到DeadObjectException異常,該異常在連接斷開時被拋出。它只會被遠程方法拋出。

6. 斷開連接,調用接口實例中的ApplicationContext.unbindService()
參考:http://buaadallas.blog.51cto.com/399160/372090

談談對Android NDK的理解。

答案:NDK 全稱: Native Development Kit 

2.誤解 
    誤解一: NDK 發佈之前, Android 不支持進行 C 開發 
    Google 中搜索 “NDK” ,很多 “Android 終於可以使用 C++ 開發 ” 之類的標題,這是一種對 Android 平臺編程方式的誤解.其實, Android 平臺從誕生起,就已經支持 C . C++ 開發.衆所周知, Android  SDK 基於 Java 實現,這意味着基於 Android SDK 進行開發的第三方應用都必須使用 Java 語言.但這並不等同於 “ 第三方應用只能使用 Java” . Android SDK 首次發佈時, Google 就宣稱其虛擬機 Dalvik 支持 JNI 編程方式,也就是第三方應用完全可以通過 JNI 調用自己的 C 動態庫,即在 Android 平臺上, “Java+C” 的編程方式是一直都可以實現的.

 當然這種誤解的產生是有根源的:Android SDK 文檔裏,找不到任何 JNI 方面的幫助.即使第三方應用開發者使用 JNI 完成了自己的 C 動態鏈接庫( so )開發,但是 so 如何和應用程序一起打包成 apk 併發布?這裏面也存在技術障礙.我曾經花了不少時間,安裝交叉編譯器創建 so ,並通過 asset (資源)方式,實現捆綁 so 發佈.但這種方式只能屬於取巧的方式,並非官方支持.所以, NDK 出來之前,我們將 “Java+C” 的開發模式稱之爲灰色模式,即官方既不聲明 “ 支持這種方式 ” ,也不聲明 “ 不支持這種方式 ” .

誤解二:有了 NDK ,我們可以使用純 C 開發 Android 應用 
 Android SDK採用 Java 語言發佈,把衆多的 C 開發人員排除在第三方應用開發外( 注意:我們所有討論都是基於“ 第三方應用開發 ” , Android 系統基於 Linux ,系統級別的開發肯定是支持 C 語言的.NDK 的發佈,許多人會誤以爲,類似於 Symbian . WM , Android 平臺上終於可以使用純 C . C++ 開發第三方應用了!其實不然, NDK 文檔明確說明: it is not a good way .因爲 NDK 並沒有提供各種系統事件處理支持,也沒有提供應用程序生命週期維護.此外,在本次發佈的 NDK ,應用程序 UI 方面的 API 也沒有提供.至少目前來說,使用純 C . C++ 開發一個完整應用的條件還不完備.
   1.NDK 是一系列工具的集合.

NDK提供了一系列的工具,幫助開發者快速開發 C (或 C++ )的動態庫,並能自動將 so  java 應用一起打包成 apk .這些工具對開發者的幫助是巨大的
NDK集成了交叉編譯器,並提供了相應的 mk 文件隔離 CPU .平臺. ABI 等差異,開發人員只需要簡單修改 mk 文件(指出 “ 哪些文件需要編譯 ” . “ 編譯特性要求 ” 等),就可以創建出 NDK可以自動地將 so  Java 應用一起打包,極大地減輕了開發人員的打包工作
   2.NDK 提供了一份穩定.功能有限的 API 頭文件聲明.

 Google明確聲明該 API 是穩定的,在後續所有版本中都穩定支持當前發佈的 API .從該版本的 NDK 中看出,這些 API 支持的功能非常有限,包含有: C 標準庫( libc .標準數學庫( libm .壓縮庫( libz . Log 庫( liblog .

3.NDK 帶來什麼 
1.NDK 的發佈,使 “Java+C” 的開發方式終於轉正,成爲官方支持的開發方式.

使用NDK ,我們可以將要求高性能的應用邏輯使用 C 開發,從而提高應用程序的執行效率
使用NDK ,我們可以將需要保密的應用邏輯使用 C 開發.畢竟, Java 包都是可以反編譯的
NDK促使專業 so 組件商的出現.(樂觀猜想,要視乎 Android 用戶的數量) 
    2.NDK 將是 Android 平臺支持 C 開發的開端. NDK提供了的開發工具集合,使開發人員可以便捷地開發.發佈 C 組件.同時, Google承諾在 NDK 後續版本中提高 “ 可調式 ” 能力,即提供遠程的 gdb 工具,使我們可以便捷地調試 C 源碼.在支持 Android 平臺 C 開發,我們能感覺到 Google 花費了很大精力,我們有理由憧憬 “C 組件支持 ” 只是 Google Android 平臺上開發的開端.畢竟, C 程序員仍然是碼農陣營中的絕對主力,將這部分人排除在 Android 應用開發之外,顯然是不利於 Android 平臺繁榮昌盛的

8 進程與多線程 190

8.1 Android進程管理機制 190

8.2 Android進程的分類及優先級劃分 191

請一一簡述Android中的五類進程。

答案:①前臺進程(Foreground process):用來處理用戶正在進行的工作的進程。②可見進程( Visible process):這種進程並不包含任何前臺組件,但是包含仍然被用戶可見的組件。③服務進程(Service process):其中運行着使用startService()方法啓動的Service,並且沒有變爲更高的兩個級別的進程。④後臺進程(Background process):處理後臺事務的進程,比如其中運行着執行了onStop()方法而處於停止態的Activity等。⑤空進程(Empty process):不包含任何活動的應用程序組件的進程。

8.3 Android的“UI線程模型” 192

如果在新開的工作線程中更新了UI,而又因爲只能在UI線程中更新UI,所以Android提供了三種方式來解決這個問題。請寫出這三種解決方式。

答案:①使其他線程嘗試訪問UI線程,並委託後者更新UI。②在線程間進行通信,讓想更新UI的其他線程給UI線程發送消息,UI線程根據消息更新UI。③使用Android提供的AsyncTask

8.4 Android線程間通信 195

8.4.1 線程間通信模型 196
8.4.2 Message 196
8.4.3 MessageQueue 197
8.4.4 Handler 197

請簡述Handler的概念。

答案:Handler對象可以發送和處理與一個線程的消息隊列相關聯的MessageRunnable對象。每一個Handler的實例都與一個獨立的線程及其消息隊列相關聯。當一個新的Handler對象被創建,它就會被綁定到創建它的線程的消息隊列之上,從這一刻開始,這個Handler對象便會將MessageRunnable對象發送給它所綁定的消息隊列,並且在這些對象離開隊列後,處理他們。

handler機制的原理。

答案:andriod提供了 Handler  Looper 來滿足線程間的通信。Handler 先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)

  1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裏的Message Queue(消息隊列)

 2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到Message Queue;或者接收LooperMessage Queue取出)所送來的消息。

  3) Message Queue(消息隊列):用來存放線程放入的消息。

  4)線程:UI thread 通常就是main thread,而Android啓動程序時會替它建立一個Message Queue

8.4.5 Looper 200

請解釋下在單線程模型中MessageHandlerMessage QueueLooper之間的關係。

答案:Message Queue(消息隊列):用來存放通過Handler發佈的消息,通常附屬於某一個創建它的線程,可以通過Looper.myQueue()得到當前線程的消息隊列。

Handler:可以發佈或者處理一個消息或者操作一個Runnable,通過Handler發佈消息,消息將只會發送到與它關聯的消息隊列,然也只能處理該消息隊列中的消息。

Looper:是Handler和消息隊列之間通訊橋樑,程序組件首先通過Handler把消息傳遞給LooperLooper把消息放入隊列。Looper也把消息隊列裏的消息廣播給所有的。

HandlerHandler接受到消息後調用handleMessage進行處理。

Message:消息的類型,在Handler類中的handleMessage方法中得到單個的消息進行處理。

8.5 使用AsyncTask簡化多線程開發 201

8.6 進程間通信(IPC) 203

請解釋什麼是進程(Process)與線程(Thread)。

答案:①進程是操作系統結構的基礎,是計算機中正在運行的程序實例,它可以被分配給處理機並被處理機執行。通俗地說,就是一個正在運行的應用程序實體。②線程是進程中某個單一順序的控制流,它也被稱爲輕量級進程(Lightweight Process),它是處理機調度的基本單位。

請分析說明進程與線程的四點區別。

答案:①地址空間和數據資源:進程間相互獨立;同一進程的各線程間共享,但某進程內的線程在其它進程不可見。②通信:進程間通信需要專門的機制;線程間可以直接讀寫全局變量來進行通信,不過需要同步和互斥手段的輔助,以保證數據的一致性。③調度和切換:線程上下文切換比進程上下文切換要快得多。④在多線程OS中,進程不是一個可執行的實體。

android中線程與線程,進程與進程之間如何通信

答案:1、一個 Android 程序開始運行時,會單獨啓動一個Process 默認情況下,所有這個程序中的Activity或者Service都會跑在這個Process。默認情況下,一個Android程序也只有一個Process,但一個Process下卻可以有許多個Thread

2、一個 Android 程序開始運行時,就有一個主線程Main Thread被創建。該線程主要負責UI界面的顯示、更新和控件交互,所以又叫UI Thread 一個Android程序創建之初,一個Process呈現的是單線程模型--Main Thread,所有的任務都在一個線程中運行。所以,Main Thread所調用的每一個函數,其耗時應該越短越好。而對於比較費時的工作,應該設法交給子線程去做,以避免阻塞主線程(主線程被阻塞,會導致程序假死 現象)。 

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


第9章  Android網絡通信 204

9.1  Android網絡通信分類 204

Android中使用什麼方式進行網絡通信?

答案:Android使用HTTPSocket兩種方式進行網絡通信,其中,HTTP方式又包括HttpClientHttpURLConnection兩種編程方式。

9.2  獲取網絡狀態 204

Android中,可以使用ConnectivityManager類來獲取當前設備的網絡狀態,這個類的主要作用有哪些?

答案:

 

9.3  使用WebView訪問Web頁面 205

Android中使用什麼來顯示web頁面的view,是如何實現的,除了顯示web頁面,它還包含哪些功能?

答案:Webview是用於顯示web頁面的View,在Activity中,WebView可以使用任何一個瀏覽器簡易地顯示一些Web內容,它使用Webkit繪圖引擎去顯示頁面。它除了顯示Web頁面,還包含轉到上一頁、轉到下一頁、放大縮小和文字搜索等功能。

9.4  HTTP協議簡介 209

9.4.1  HTTP連接 209
9.4.2  HTTP的工作方式 209
9.4.3  HTTP請求 210
9.4.4  HTTP請求方法 210
9.4.5  HTTP響應和狀態碼 211

HTTP協議的基礎上,Android中提供了兩種HTTP通信的編程方式,請寫出這兩種編程方式。

答案:①直接通信的HttpURLConnection接口。②附加了用戶登錄等SessionCookie信息的HttpClient接口。

9.5  Android HTTP通信 212

9.5.1  使用HttpURLConnection接口 212
9.5.2  使用HttpClient接口 228
9.5.3  ssion的處理 237
9.5.4  文件上傳 246

Session就是一種保存上下文信息的機制,它通過SessionID來區分不同的客戶。請簡單描述它的三種保存Session ID的方式。

答案:①使用Cookie:保存session id的方式可以採用Cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給服務器。②URL重寫:由於Cookie可以被人爲的禁止,必須有其它的機制以便在Cookie被禁止時仍然能夠把Session ID傳遞迴服務器,經常採用的一種技術叫做URL重寫,就是把Session ID附加在URL路徑的後面,附加的方式也有兩種,一種是作爲URL路徑的附加信息,另一種是作爲查詢字符串附加在URL後面。網絡在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個Session ID。③表單隱藏字段:另一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把Session ID傳遞迴服務器。

9.6  Android Socket通信 249

9.6.1  TCP Socket 249
9.6.2  UDP Socket 251

請解釋什麼叫TCPUDP

答案:①TCP叫傳輸控制協議,它是一種可靠的連接,即有服務器和客戶端,只有當雙方建立好連接後,才能互相發送數據。(TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。)②UDP叫用戶數據報協議,它是一種不可靠的連接,即發送發在沒有建立好連接的情況下,就可以直接向目標主機發送數據。(UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。)

請簡析TCPUDP的區別。

答案:http://blog.sina.com.cn/s/blog_493309600100clrw.html

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。

請請寫出GETPOST方法主要的三點區別。

答案:①POST請求可以向服務器傳送數據,而且數據放在HTML HEADER內一起傳送到服務端URL地址,數據對用戶不可見。而GET是把參數數據隊列加到提交的URL中,值和表單內各個字段一一對應,例如(http://www.baidu.com/s?w=%C4&inputT=2710)。②GET傳送的數據量較小,不能大於2KBPOST傳送的數據量較大,一般被默認爲不受限制。但理論上,IIS4中最大量爲80KBIIS5中爲100KB。③GET安全性非常低,POST安全性較高

第10章  多媒體、圖形圖像處理和動畫 253

10.1  Android多媒體基礎 253

10.1.1  基本類 253

Android框架中用來播放音視頻的類是什麼?

答案:

 

10.1.2  權限聲明 254

爲了能在應用中使用MediaPlayer做音視頻開發,在哪兩種情況下需要加入相應的權限聲明?

答案:


10.1.3  Android多媒體核心——OpenCore 254

請問OpenCore軟件層次在宏觀上分成幾個層次,簡要介紹每一層。

答案:四層。①OSCLOperating System Compatibility Library (操作系統兼容庫),包含了一些操作系統底層的操作,爲了更好地在不同操作系統移植。包含了基本數據類型、配置、字符串工具、IO、錯誤處理、線程等內容,類似一個基礎的C++庫。②PVMFPacketVideo Multimedia Framework(PV多媒體框架),在框架內實現一個文件解析(parser)和組成(composer)、編解碼的NODE,也可以繼承其通用的接口,在用戶層實現一些NODE。③PVPlayer EnginePVPlayer引擎。④PVAuthor EnginePVAuthor引擎。

10.1.4  MediaPlayer類 255

MediaPlayer類的作用是什麼?

答案:MediaPlayer類用來播放多媒體文件。

10.2  音頻播放 257

10.2.1  播放本地資源 257
10.2.2  播放內部資源 257
10.2.3  播放網絡資源 258
10.2.4  一個簡單的音樂播放器實例 258

MediaPlayer對象可以通過很簡單的設置來獲取、解碼和播放音視頻資源,它可以支持哪幾種不同的多媒體來源?

答案:

 

10.3  視頻播放 263

10.3.1  使用MediaPlayer和SurfaceView 263

請簡述通過SurfaceViewMediaPlayer結合的方式實現視頻播放功能的步驟。

答案:①創建MediaPlayer對象,並設置加載的視頻文件(setDataSource())。②在界面佈局文件中定義SurfaceView控件。③通過MediaPlayer.setDisplay(SurfaceHolder sh)來指定視頻畫面輸出到SurfaceView之上。④通過MediaPlayer的其他一些方法用於播放視頻。

10.3.2  直接使用VideoView 268

10.4  實現拍照功能 269

10.4.1  使用系統自帶的拍照應用 269
10.4.2  自行開發拍照功能 270

Android中怎麼實現拍照功能?

答案:Android中,使用Camera類中的API實現拍照功能。

10.5  使用MediaRecorder錄製音頻和視頻 276

10.5.1  MediaRecorder的生命週期 276
10.5.2  常用方法 276
10.5.3  使用MediaRecorder錄音 277
10.5.4  使用MediaRecorder錄製視頻 282

請簡述使用MediaRecorder實現錄音的步驟。

答案:①初始化一個新的MediaRecorder的對象,以下所有方法都是該由對象調用的;②調用setAudioSource()設置音頻來源,一般都使用MediaRecorder.AudioSource.MIC;③使用setOutputFormat()設置輸出格式;④使用setOutputFile()設置輸出文件名;⑤使用setAudioEncoder()設置音頻編碼器;⑥調用prepare()使之處於已準備狀態;⑦調用start()開始錄音;⑧調用stop()停止錄音;⑨當使用完MediaRecorder對象後,調用MediaRecorder.release()釋放它。

10.6  自定義View 288

請簡述使用自定義View執行onMeasure()方法的步驟。

答案:①重寫的onMeasure()方法會被調用,高度和寬度參數同時也會牽涉到(widthMeasureSpec heighMeasureSpec,兩個整形參數),同時還要考慮產品屏幕的尺寸限制。②組件要通過onMeasure()計算得到必要的測量長度和寬度,用來顯示組件。另外它可以實現一些規格以外的功能,像是滑動、滾動、裁剪等等。③一旦高度和寬度計算出來之後,必須調用setMeasuredDimension(int width, int height),否則就會導致系統異常。

View, surfaceView, GLSurfaceView有什麼區別。

答案:view是最基礎的,必須在UI主線程內更新畫面,速度較慢。
SurfaceView view的子類,類似使用雙緩機制,在新的線程中更新畫面所以刷新界面速度比view快。

GLSurfaceView SurfaceView的子類,opengl 專用的。

10.7  圖形圖像處理 294

10.7.1  Canvas(畫布) 294
10.7.2  Paint(畫筆) 295
10.7.3  Bitmap(位圖) 300
10.7.4  Matrix(矩陣) 304

請寫出獲取位圖的幾種方法。

答案:①通過BitmapFactory的各種靜態方法。②通過Drawable對象。③通過資源(Resources)。

Android提供了多種處理圖形圖像的工具類,加上自定義View技術,幾乎可以完成任何的圖形圖像處理,請說出不少於兩個處理圖形圖像的工具類。

答案:有Canvas(畫布)、Paint(畫筆)、Bitmap(位圖)、ViewFlipper(動畫)等等,另外也可以使用OpenGL去設計2D3D的圖形或動畫,這也是通常用來開發Android遊戲的類庫。

10.8  Android動畫開發入門 307

10.8.1  ViewAnimator 307
10.8.2  逐幀動畫 309
10.8.3  補間動畫 309

Android中有哪幾種動畫?

答案:逐幀動畫和補間動畫。

android中的動畫有哪幾類,它們的特點和區別是什麼?

答案:兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

第11章  4.0版本新特性 313

11.1  Android 4.0版本簡介 313
11.2  ActionBar 314

請簡要介紹ActionBar

答案:ActionBar(動作條)是在3.0版中加入Android API庫的,它用於支持幾種新的動作。最重要的改進是,爲了提供更好的用戶體驗,當應用運行在小屏幕設備上,系統提供了對ActionBar的大小和配置的優雅的管理。ActionBar美化了MenuTabHost導航等界面樣式,顯得更加流暢和美觀。就算是使用原來的API開發菜單或Tab導航,在4.x版本的設備上也會自動變爲ActionBar的樣式,但是,用了ActionBarAPI開發的應用,可能無法運行在1.x2.x的設備上。

11.2.1  添加和移除ActionBar 314
11.2.2  使用分離的ActionBar 314
11.2.3  ActionBar的五大用途 315

請描述ActionBar的五大用途。

答案:①使用應用程序圖標做導航。②提供導航標籤。③提供下拉列表導航。④爲菜單添加動作視圖(Action View)。⑤爲菜單添加ActionProvider

11.2.4  用途一:使用應用程序圖標做導航 315
11.2.5  用途二:提供導航標籤 316

請描述使用ActionBar實現導航標籤功能的三個步驟。

答案:①實現ActionBar.TabListener接口,重寫其中的幾個回調方法以響應用戶切換導航標籤的操作。②對於每一個想要添加的導航標籤,實例化一個ActionBar.Tab對象,並調用setTabListener()setText()setIcon()方法分別設置該標籤的標籤切換事件監聽器、標題和圖標。③調用addTab()將初始化好的導航標籤添加到ActionBar中。

11.2.6  用途三:提供下拉列表導航 321

ActionBar提供了一種內置的下拉列表,請描述使用ActionBar設計下拉列表導航的步驟。

答案:①創建一個SpinnerAdapter,提供內容。②實現ActionBar.OnNavigationListener接口,處理用戶對列表項的選擇事件。③創建ActionBar,並設置爲下拉列表導航模式。④給這個下拉列表設置處理用戶選擇的回調處理。

11.2.7  用途四:爲菜單添加動作控件 321

11.2.8  用途五:爲菜單添加ActionProvider 322
11.2.9  ActionBar的樣式 322

11.3  Fragment 323

11.3.1  Fragment的生命週期 324
請簡要描述Fragment的生命週期


11.3.2  管理Fragment——FragmentManager 325
11.3.3  操作Fragment——FragmentTransaction 325

11.4  GridLayout 326

11.5  其他的新特性或改動 327
11.6  Android 4.0之後的設計原則 330

相機應用現在可以使用Android的臉部識別API,請寫出實現該功能的步驟。

參考答案:①通過調用setFaceDetectionListener()註冊Camera.FaceDetectionListener。②然後調用startFaceDetection()開始面部識別。③onFaceDetection()方法會返回一個Camera.Face對象數組,包含Rect:顯示臉部輪廓以及Point:眼睛和嘴等。

12章  位置與地圖 331

12.1  位置服務 331

12.1.1  獲取位置信息 332
12.1.2  定位最佳策略 335
12.1.3  常用定位案例 338
12.1.4  調試位置數據 338

12.2  谷歌地圖 339

12.2.1  獲得MapAPI密鑰 339
12.2.2  GooglePlayServiceSDK 342
12.2.3  怎樣添加地圖功能 344
12.2.4  設置地圖 347

android.location包中的LocationManagerLocationProviderLocationListenerCriteria這四個是關於定位功能比較重要的類,請一一簡介這四個類。

答案:①LocationManager:本類提供訪問定位服務的功能,也提供獲取最佳定位提供者的功能。另外,臨近警報功能(前面所說的那種功能)也可以藉助該類來實現。②LocationProvider:該類是定位提供者的抽象類。定位提供者具備週期性報告設備地理位置的功能。③LocationListener:提供定位信息發生改變時的回調功能。必須事先在定位管理器中註冊監聽器對象。④Criteria:該類使得應用能夠通過在LocationProvider中設置的屬性來選擇合適的定位提供者。

請簡述獲取用戶位置的流程。

答案:①啓動應用。②開始從滿足條件的定位提供者上獲取位置信息的更新③維護一個位置信息的最佳估算,而過濾掉新的而且不夠精確的。④停止監聽獲取位置信息。⑤採用最新最好的位置。

在用戶設備上的Google Play服務APK一般有四種狀況,請描述這四種情況。

答案:①Google Play Store 應用的當前版本已經安裝,最近的Google Play服務APK也已經被下載。②Google Play Store 應用的當前版本已經安裝,但最近的Google Play服務APK還沒有被下載。③有一箇舊的Google Play Store應用,它不會主動下載Google Play服務更新。④Google Play服務APK無效或者處於關閉狀態,一般這是由於用戶過去卸載或關閉了它。

Google Map Android API提供了四種類型的地圖,請簡單介紹這幾種類型的地圖。

答案:①normal:典型的路線圖,其顯示道路、某些人造的以及重要的自然特徵,例如河流等。公路和特徵的標籤也是可見的。②Hybrid:在路線圖上增加了衛星照片數據,公路和特徵的標籤也是可見的。③Satellite:衛星照片數據,公路和特徵的標籤是不可見的。④Terrain:地形數據。該地圖包含的顏色、輪廓線和標籤、透視陰影。某些道路和標籤也是可見的。⑤none:沒有圖塊。該地圖將呈現爲一個空的網格沒有圖塊的加載。

請寫出添加折線的五個步驟。

答案:①實例化新的PolylineOptions對象。②設置的LatLng對象,用PolylineOptions.add()方法添加點。③根據需要設置其他的屬性。④調用GoogleMap.addPolyLine添加一個折線所指定的地圖PolylineOptions。⑤折線顯示在地圖上。

根據自己的理解描述下Android數字簽名。

答案:(1)所有的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序
(2)Android程序包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證
(3)如果要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。
(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。如果程序已經安裝在系統中,即使證書過期也不會影響程序的正常功能。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章