對於Andriod的開發者來說,相信Java語言是第一選擇,可是對於.Net開發者來說,要想利用C#在Andriod平台上開發,Mono提供了相應的開發平台來實現,Mono for Andriod就是專門為.Net開發者設計的Andriod手機端開發平台。
Mono for Andriod官方文檔:http://docs.xamarin.com/android
Mono for Andriod完全綁定於Andriod Java API,因此,在您安裝Mono for Andriod時,必須先安裝JDK以及Andriod SDK,這樣才能夠順利進行開發。
Mono for Andriod可與Java、C/C++進行交互操作,也就是說Mono for Andriod可以直接調用Java,C,C++的類庫。
Mono for Android的應用程序是以.Net BCL為基礎,BCL即Base Class Library,它提供了XML, Database, Serialization, IO, String, and Networking等等支持。它的集成開發環境是MonoDevelop或者Visual Studio都可以。
移動跨平台支持,例如Mono for Andriod和MonoTouch(C#版IOS開發平台)可以共用一套后台的公共代碼,當然相信未來也受用於Windows Phone 7。
Mono for Andriod是構建於Mono之上,Mono是一個基於.NET ECMA標准的.Net Framework的開源版本,可運行於Linux, UNIX, FreeBSD, Mac OSX等等。
當您編譯一個Mono for Andriod應用程序的時候,主要包括三個步驟:
1. 源產生,作為預編譯階段,aresgen.exe運行資源目錄,例如Resource.Designer.cs,UI File,Images等資源文件
2. 編譯成托管的.Net或者Mono應用程序集
3. Andriod安裝包的創建:生成apk文件,通過mandroid.exe工具進行打包
Mono for Andriod安裝
目前支持在Windows以及Mac下的安裝,這里以Windows為例:
您也可以參考它的安裝文檔:http://docs.xamarin.com/android/getting_started/installation/Installation_for_Windows
這里我選擇的是企業版的安裝文件setup.exe
運行之,首先它會監測你的計算機是否已經安裝了相關的准備,包括JDK(據說目前不支持Java 7,沒有試過,因為計算機已經安裝了JDK 6)、Andriod SDK、MonoDevelop 3.0.2、Mono Andriod Tool等等,建議這里講Andriod SDK中的所有版本全部安裝,便於調試不同版本的應用程序。
全部安裝好了之后,可以在MonoAndriod的Framework的程序集路徑C:\Program Files\Reference Assemblies\Microsoft\Framework\MonoAndroid中看到:
另外在目錄中,還可以發現mono.android.jar,說明mono也支持Jar包的調用。
在我的本地已經安裝了Andriod所有版本的mono.andriod包
現在,不管在您的Monodevelop還是VS中,都可以打開一個AVD Manager的窗口,在該窗口中你可以設置本地的模擬器以及啟動它:
通過Start按鈕,就可以打開相應的Andriod模擬器。
Mono for Andriod的試用版本可以在任意的模擬器上供你開發學習,如果你需要發布、部署到真實設備中,或者發布到App Store中,就需要購買相應版權,企業版一般授權費用$999,專業版一般授權費用$399,詳見:https://store.xamarin.com/
在開發Mono for Andriod應用程序之前,首先必須要先了解一下Mono for Andriod的構成:
Mono for Andriod的BCL是以Silverlight和Client .NET3.5程序集為基礎,它包括了豐富的程序集:
1. Base Class Library
主要包括mscrolib.dll,System.dll,System.Core.dll,System.Data.dll,System.Json.dll,System.Runtime.Serialization.dll,
System.ServiceModel.dll,System.ServiceModel.Web.dll,System.Transactions.dll,System.Web.Services.dll,
System.Xml.dll,System.Xml.Linq.dll等等
2. Mono for Android Framework
主要包括Mono.Android.dll,Mono.Andriod.dll作為Andriod開發中最核心的部分,它直接和Andriod API進行綁定
3. Mono Libraries
主要包括Mono.xml.dll,Mono.Security.dll,Mono.Data.Tds.dll,Mono.Data.Sqlite.dll,
Mono.CompilerServices.SymbolWriter.dll等等
另外在MonoAndriod的Framework中還可以看到一個OpenTK.dll,它是OpenGL/OpenAL的封裝,通過它可以設計3D的模型,在Andriod游戲開發中相當有用。
Activity與Activity生命周期
Activities作為Andriod應用程序的基礎組件,不管是在mono還是非mono下,這個概念是相同的。
在Andriod操作系統中使用優先級棧來管理activities在設備中的運行,而Activity 的生命周期是交給系統統一管理,在android中,Activity擁有四種基本狀態:
1. Active/Runing:一個新Activity啟動入棧后,它在屏幕最前端,處於棧的最頂端,此時它處於可見並可和用戶交互的激活狀態。
2. Paused:當Activity被另一個透明或者Dialog樣式的Activity覆蓋時的狀態。此時它依然與窗口管理器保持連接,系統繼續維護其內部狀態,所以它仍然可見,但它已經失去了焦點故不可與用戶交互。
3. Stopped:當Activity被另外一個Activity覆蓋、失去焦點並不可見時處於Stopped狀態。
4. Killed:Activity被系統殺死回收或者沒有被啟動時處於Killed狀態。
當一個Activity 實例被創建、銷毀或者啟動另外一個Activity時,它在這四種狀態之間進行轉換,這種轉換的發生依賴於用戶程序的動作,下圖說明了 Activity 在不同狀態間轉換的時機和條件(參考文章:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/):
Android 是通過一種 Activity 棧的方式來管理 Activity 的,一個 Activity 的實例的狀態決定它在棧中的位置。處於前台的 Activity 總是在棧的頂端,當前台的 Activity 因為異常或其它原因被銷毀時,處於棧第二層的 Activity 將被激活,上浮到棧頂。當新的 Activity 啟動入棧時,原 Activity 會被壓入到棧的第二層。一個 Activity 在棧中的位置變化反映了它在不同狀態間的轉換。Activity 的狀態與它在棧中的位置關系如下圖所示:
如上所示,除了最頂層即處在 Active 狀態的 Activity 外,其它的 Activity 都有可能在系統內存不足時被回收,一個 Activity 的實例越是處在棧的底層,它被系統回收的可能性越大。系統負責管理棧中 Activity 的實例,它根據 Activity 所處的狀態來改變其在棧中的位置。
Activity生命周期調用順序:
參考MonoAndriod的一段代碼:
public class Activity1 : Activity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Use UI created in Main.axml
SetContentView(Resource.Layout.Main);
var aButton = FindViewById<Button> (Resource.Id.aButton);
var aLabel = FindViewById<TextView> (Resource.Id.helloLabel);
aButton.Click += (sender, e) => {aLabel.Text = " Hello from the button ";};
}
}
所有的活動頁面基本是基於Activity來實現(當然andriod 3.0版本之上還可以通過Fragment的UI組件來實現),通過OnCreate完成Activity的首次構建。
具體Activity生命周期還可以參考官方文檔:http://docs.xamarin.com/android/tutorials/Activity_Lifecycle
Activity之間的數據通信是通過使用Intent類來實現,在官方的Demo中大量使用Intent類,不同的Intent類型實現了不同的功能,這個在后面的文章中我會具體在作出介紹。
最后,通過一個示例的介紹來看看怎樣創建一個Mono for Andriod應用程序,(以VS為例):
當你安裝好Mono for Andriod的一切之后,我們可以在VS的新建項目中看到:
新建一個Andriod項目,在解決方案中我們看到產生一系列的目錄以及文件:
Asserts包含應用程序需要在其中任何類型的文件,這里包含的文件通過Asserts類就可以進行訪問,其中需要設定相關文件的生成操作為AndriodAsset:
您可以通過代碼來訪問文件的內容,例如:
Resources包含應用程序資源,如字符串和圖像,以及聲明性XML(Andriod XML)的用戶界面(這里統一放在Layout中)定義。這些資源是通過生成Resources類進行訪問,同樣需要設定文件的生成操作:
Values中的String.xml作為本地的資源字符串文件進行配置,例如:
< resources >
< string name ="helloButtonText" >Say Hello </ string >
< string name ="helloLabelText" >Hello Mono for Android </ string >
</ resources >
通過代碼訪問:
aLabel.SetText(Resource.String.helloLabelText);
var aButton = new Button ( this);
aButton.SetText(Resource.String.helloButtonText);
Activity1.cs就是新建的一個繼承於Activity類的實現,通過這個類可以編寫頁面的相關邏輯。
Mono for Andriod最終將Code以及Resources文件等等編譯執行打包成為.apk文件,如下圖所示:
編寫代碼:
public class Activity1 : Activity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView(Resource.Layout.Main);
var aButton = FindViewById<Button> (Resource.Id.aButton);
var aLabel = FindViewById<TextView> (Resource.Id.helloLabel);
aButton.Click += (sender, e) => {aLabel.Text = " Hi, Leepy! ";};
}
}
以及Main.axml:
< LinearLayout
xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent" >
< TextView
android:id ="@+id/helloLabel"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="@string/helloLabelText" />
< Button
android:id ="@+id/aButton"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="@string/helloButtonText" />
</ LinearLayout >
具體實現的說明我會在下篇具體介紹
現在要運行應用程序,先開啟一個Andriod 2.2版本的模擬器:
調試執行程序
選擇剛剛啟動的模擬器,(注:應用程序在首次加載時,首先會將相關的mono Assembles 和 mono for andriod framework包安裝到模擬器中,打包的apk文件也會安裝到模擬器中,這個過程要等待幾分鍾)
點擊“Say Hello”按鈕,在TextView控件中顯示“Li,Leepy”。
本篇到這里就先結束咯,下一篇我會着重介紹Mono for Andriod的相關特性,以及相關API的使用和實踐。















