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开始
我们要编辑的文件分布在 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都需要在这个文件中描述一下。
看一下代码:
- 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>