代码改变世界

从一个开发人员的角度比较Windows Mobile与Ophone

2009-06-11 15:05  cppguy  阅读(2811)  评论(17编辑  收藏  举报

      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#)的战争要持续烧到了移动平台上 了。

       
 

这里将就两个平台在开发方面所关注的问题进行比较,并不是要得出谁优谁劣的结论,而是能让会其中一个平台的开发人员也能熟悉另一个平台的相关问题。

开发工具   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都需要在这个文件中描述一下。

看一下代码: 

  1. public class HelloWolrd extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.   
  7.         //指定这个Activity的界面布局,如果不指定,运行起来是默认空白的,如何布局后面讲述  
  8.         setContentView(R.layout.main);         
  9.        //这句话就是用来获取layout中设置的界面控件对象的,这个id是在button中指定的  
  10.            android:id="@+id/button_normal"  
  11.         Button btn=(Button)this.findViewById(R.id.button_normal);  
  12.           
  13.         //为btn添加响应函数  
  14.         btn.setOnClickListener(new OnClickListener(){  
  15.   
  16.             public void onClick(View arg0) {  
  17.                 TextView tv=(TextView)this.findeViewbyId(R.id.text);  
  18.                         tv.setText(R.id.hello);  
  19.             }  
  20.               
  21.               
  22.         }  
  23.         );  
  24.     }  
  25. }  
  26.   
  27.  布局文件mani.xml  
  28. <?xml version="1.0" encoding="utf-8"?>  
  29. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  30.     android:orientation="vertical"  
  31.     android:layout_width="fill_parent"  
  32.     android:layout_height="fill_parent"  
  33.     >  
  34. <TextView  android:id="@+id/text"  
  35.     android:layout_width="fill_parent"   
  36.     android:layout_height="wrap_content"   
  37.     android:text="@string/hello"  
  38.     />  
  39.  <Button android:id="@+id/button_normal"  
  40.             android:text="@string/clickme"  
  41.             android:layout_width="wrap_content"  
  42.             android:layout_height="wrap_content" />  
  43. </LinearLayout>  
  44.   
  45.   
  46.   
  47.   
  48.       

点击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技术,各种各样的网络服务,相信移动的世界会越 来越精彩,而对于开发者的我们,多掌握一种技术,可能就是多一个机会。