文章目錄
- 開發工具 Visual Studio 和 Eclipse
- 介面風格比較
- 系統核心對象比較
- 總結:
從一個開發人員的角度比較Windows Mobile與Ophone分類: 熱點報道 推薦者:keyan| 14 個評論
Windows Mobile在經曆過最初的Wince系列,pockect pc和smartphone兩種版本,到微軟最新的Windows Mobile 6.5,Windows Mobile憑藉與案頭平台良好的相容性已經微軟在移動領域的不斷努力,在智能手機作業系統中已經佔據了接近15%的市場份額。微軟所推崇的 Windows Mobile下的基於.net compact framework也越來越成為開發微軟平台的首選。微軟的曾經的.net戰略從一定意義上來說,在移動開發上得到了實現。
OPhone作為基於Android開源平台的移動作業系統,在開發上沿用了Android的開發特性和環境,而Java是首選的開發語言。比較有 意思的是,微軟的.net戰略在企業級開發上最大的對手是J2EE,而在移動作業系統中,除了諾基亞的Symbian由於手機的高佔有率而在移動作業系統 的高份額外,Windows Moible與Android是未來兩個有希望與Symbian三分天下的作業系統,這樣似乎java與.net(C#)的戰爭要持續燒到了移動平台上 了。
Windows Mobile與Ophone
這裡將就兩個平台在開發方面所關注的問題進行比較,並不是要得出誰優誰劣的結論,而是能讓會其中一個平台的開發人員也能熟悉另一個平台的相關問題。
開發工具 Visual Studio 和 Eclipse
Windows Mobile的主流開發工具肯定是Visual Studio了,Android是Eclipse。兩個都是大名鼎鼎的整合式開發環境,並代表了兩個不同的陣營:.net 和JAVA,根據筆者在移動開發上 的使用經驗,從以下幾個方面來比較。
開發環境的成本和搭建,Windows Mobile當然只能在windows平台下開發,不管你用盜版還是正版,xp是必須的,然後再安裝VSTS(visul studio team suite),這一套動輒就好幾萬,當然你也可以使用180天試用版本,過半年再重裝次系統,這也比較划算,裝完之後再從微軟官網上下載最新的 windows mobile SDK,最好再裝一個中文版的Emulator image,這樣windows mobile的環境就基本搭建起來了。 相比之下,OPhone完全是免費的,作業系統可以選擇windows和Linux,這裡推薦用ubuntu。安裝JDK,然後下載相關平台的 Eclipse,安裝adt,從SDN下載OPhone的SDK,這個過程可以參照OPhone提供startup文檔。
對行動程式碼的調試跟蹤,無論是模擬器還是真實裝置,Visual Studio 2008+ ActiveSync比 Eclipse+ADB要好用很多,微軟在調試器的可視化 易用性上都有很優秀,相比來說,google為Eclipse開發的ADT plugin,一方面可能是Eclipse自身的局限,另一方面Android開發剛剛起步,在對整合開發調試上應該還有很多的空間來提升。另外,同步工 具ActiveSync其本身並不單是一個開發的輔助軟體,而是一個真正意義的同步工具,它會自動偵測連接埠,設定虛擬IP,同步電腦資料,這樣只要把手機 連到電腦上,ActiveSync圈圈變綠,就可以直接把軟體 部署到手機上進行調試,而Android還要手動做上面的事情,不太方便。
模擬裝置(模擬器)比較,從啟動速度,效能上,兩個都差不多,windows mobile區分了smartphone和pocketpc,而android可以通過設定emulator 的skin參數,可以獲得不同皮膚,不同機型的模擬器,比起苦苦等微軟發布新一個版本的模擬器,在Android的開源聯盟努力下在模擬器的多樣性肯定會 更豐富。
GUI開發 從一個HelloWorld開始
1:先說Android,當我們使用嚮導建立了一個新的Android工程之後,在包瀏覽中可以看到以下的檔案。
我們要編輯的檔案分布在 src和res下,包括HelloWorld.java和 main.xml , strings.xml.
這個HelloWorld就繼承自Activity(Android Framework裡面最重要的一個類, 我們簡單地理解為它是一個UI的容器,直接跟使用者打交道最前端的類。對於Windows mobile了的程式員來講,簡單的理解就是 Activity+View=Form.
還有一個R.java,這個類是系統根據res檔案夾中的內容自動為你產生的,大家不要修改它.我們先講一下res檔案夾,在這一點上,wm和 Anroid很相似,res是resources的縮寫,顧名思義,你程式中所需要的文字,圖片,布局檔案等等資源都是放在這個檔案夾下面的,你現在看到 這個檔案夾下面有
drawable – 這個是放圖片的
layout – 這個是放布局檔案的
values – 下面放字串(strings.xml ),顏色(colors.xml ),數組(arrays.xml )
Android 幫我們把這些資源都管理起來,內容資源化的作用是很明顯的,做國際化方便了,使用同一個資源的時候也方便也更節省空間的(全域的引用),res檔案夾中內容變化,R.java都會重新編譯同步更新,所以這個類不需要你去手動更新了。
最後是AndroidManifest.xml. 你每次添加一個Acivity都需要在這個檔案中描述一下。
看一下代碼:
view plaincopy to clipboardprint?
public class HelloWolrd extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//指定這個Activity的介面布局,如果不指定,運行起來是預設空白的,如何布局後面講述
setContentView(R.layout.main);
//這句話就是用來擷取layout中設定的介面控制項對象的,這個id是在button中指定的
android:id=”@+id/button_normal”
Button btn=(Button)this.findViewById(R.id.button_normal);
//為btn添加響應函數
btn.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
TextView tv=(TextView)this.findeViewbyId(R.id.text);
tv.setText(R.id.hello);
}
}
);
}
}
布局檔案mani.xml
<?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”
>
<TextView android:id=”@+id/text”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/hello”
/>
<Button android:id=”@+id/button_normal”
android:text=”@string/clickme”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” />
</LinearLayout>public class HelloWolrd extends Activity {
/** Called when the activity is first created. */
@Override public void onCreate(Bundle savedInstanceState)
{ super.onCreate(savedInstanceState);
//指定這個Activity的介面布局,如果不指定,運行起來是預設空白的,如何布局後面講述
setContentView(R.layout.main);
//這句話就是用來擷取layout中設定的介面控制項對象的,這個id是在button中指定的
android:id="@+id/button_normal"
Button btn=(Button)this.findViewById(R.id.button_normal);
//為btn添加響應函數
btn.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0) {
TextView tv=(TextView)this.findeViewbyId(R.id.text);
tv.setText(R.id.hello);
} } );
}
}
布局檔案mani.xml
<?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" >
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button android:id="@+id/button_normal"
android:text="@string/clickme"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</pre>
2:再來看一下Windows Mobile
建立一個裝置應用程式項目
“Hello World”,如
:
<img alt=”" src=”http://www.omsdn.net/uploads/Image/5.5.jpg” height=”314″ width=”469″ />
螢幕左側出現了一個可編輯的設計介面,我們要設計HelloWorld的介面,只需要從工具箱裡拖拽一個button和一個lable。比起Android來,微軟因為其強大的整合工具,讓可視化的介面變成變得非常簡單,所見即所得 (WYSIWYG)。
為button添加響應函數,雙擊button,在Click事件中些如下代碼:
view plain
copy to clipboard
print
?
this.label1.Text = “Hello World”;
this.label1.Text = “Hello World”;
點擊F5,直接 運行就可以了。
總結:做一個相同功能的HelloWolrd例子,Android需要修改修改三個檔案,寫18行代碼,而WindowsMobile只需要拖拽兩下,寫一行代碼。 無疑,WindowsMobile在GUI開發上快速的多。
介面風格比較windows mobile 到了最新的6.5,介面上終於有了不小的改觀,記得從6.1開始,對基礎控制項的繪製和渲染都有增強,但是要開發一個足夠絢麗的介面,就像Pointui這 種應用,難度還是很大的,因為大部分介面都要用GDI來自己繪製,因為微軟提供的基礎控制項數量很有限,包括著名的 opennetcf庫,在樣式的支援上基本沒有,所以自訂控制項成為擺脫平庸UI的唯一方法。
這裡還想要告訴大家的是微軟一個齷齪的行為:如果我們想要對Button這個控制項稍微的擴充一下,加上一點點我們自已的東東。結果是很麻煩,很麻 煩。究其原因是:微軟不是用GDI中的Graphics的函數進行繪製這些基本控制項,實際上MS還是用的老辦法,就象古老的C++程式一樣,這樣基 於.net來做這件事情,唯一的方法就是捕獲winproc訊息,很不爽,而微軟為什麼要這麼做呢,是為了避免咱們侵犯人家的外觀專利。
反觀Android,在View的支援上不但提供了樣式功能豐富的經典控制項,而且允許靈活的擴充基礎控制項,不談別的,就一個簡單的例子,就說一下彈出對話方塊吧,如果我想在這個對話方塊中加入進度條,:
這是OPhone的一個基本控制項,而如果在Windows mobile來實現的話,MessageBox肯定是不能擴充的,那麼只能從頭寫一個,單是做一個背景透明的半表單就很麻煩。所以在 WindowsMobile的應用程式裡,第三方的應用UI體驗常常是良莠不齊,而且MFC的,ATL的,.netComactFramework的,技 術混雜。歸其原因是一方面微軟用PC綁架了手機,.net平台做了一下裁剪就直接用了,可是,移動平台的UI與PC還是有很大區別的,另一方面就是不夠開放。
系統核心對象比較1:Form與Activity,View
做過Windows案頭編程的都會對Form有瞭解,Form 是應用程式中所顯示的任何視窗的表示形式,即使一個Dialog也是對Form的一種派生。Form同時是一個容器,可包容其他繼承自Control類的其他控制項.
Windows Mobile下的Form的概念與案頭端是一致的。任何我們看到的介面都是一個包含在 Form中的布局。
而android中Activity,他相當於MVC模式中的Controler,它會與使用者去互動,並對這些互動進行處理,我們可以通過調用 setContentView()來給Activity設定介面布局,Android的這種設計實現了介面設計和邏輯功能設計的真正分離,對View的高 度抽象,也讓介面具有高度擴充性,可以設計出更加豐富的介面體驗。
2:Android中特有的Intent
Intent提供了一個在不同應用的代碼之間進行晚綁定 的機制。它主要被用來啟動 Activity,還有服務等,它提供了應用中不同Activity之間,不同應用之間的通訊方式,這既能對應用間的模組相互解耦,也讓應用程式互相之間 發揮共同的效力,這一點在windows mobile下是很難做到的,Form之間通常是依賴關係,耦合性很大,而一個應用要調用其他應用的某個功能,除非引用後者開放的類庫,幾乎沒有什麼好的 辦法可以做到。
3:ContentProvider和ADO.net
兩者的設計目的有些相似,都是為了抽象資料訪問層,ADO.net中有個很重要的概念:DataSet,我們可以通過各種資料來源來填充 DataSet,其實DataSet本質上就是一個記憶體中的資料庫,有資料表,支援Sql查詢,它支援多種資料來源,如:sql資料庫,xml,文字檔 等。
相比起來,ContentProvider為我們提供了更大的靈活性,Content Provider用於將各個應用程式的資料進行共用,Content Provider是一個類,執行一套標準的方法,讓其他的應用程式儲存和擷取Content Provider所處理的資料. 如果比較ADO.net和ContentProvider的話,ADO.net的資料訪問模組是程式層級的,其他應用很難共用到既有應用對資料的加工處 理,二ContentProvier通過一個唯一的ContentURI定位Provider,所有應用就可以通過構造ContentValues來對資料來源進行操作。
總結:對開發人員來說,windows mobile與Android在體系架構上有很大不同,但在開發語言上,物件導向等方面,只要熟悉一下,兩者之間的相互遷移並不難。
對於Mobile OS來說,不同於案頭作業系統,這必將有一場慘烈的淘汰賽,究竟是一家獨大,還是三國分離,還是不同程度的整合,都是一個問號。未來的移動世界,網路肯定是永恒的主題,不同的作業系統也在這個方面做整合,互連網在不斷嵌入到手機平台中,移動搜尋,Widget技術,各種各樣的網路服務,相信移動的世界會越 來越精彩,而對於開發人員的我們,多掌握一種技術,可能就是多一個機會。