EasySymbian——手机应用开发入门(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-07 17:48:52

点击下载

作者:赵希哲司维宋昱鹏(编著)

出版社:出版服务编辑部

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

EasySymbian——手机应用开发入门

EasySymbian——手机应用开发入门试读:

前言

P R E F A C E

为什么是Symbian?

尽管国内外经济形势都面临着严峻的考验,但智能手机市场仍然呈现出了增长的态势,仅2008年全球智能手机销量就达到1.65亿部。正是比较良好的市场前景,促使各大厂商都加大了对智能手机研发的投入,甚至一些其他领域的公司也把触角伸向了智能手机市场,推出iPhone的Apple和推出Android的Google就是其中典型。

作为当前智能手机市场份额第一的Symbian操作系统,目前正是在火热的移动开发领域中最受关注的技术方向。2008年诺基亚从三星等股东手中收购了全部剩余的Symbian股份,并宣布成立Symbian基金会,计划在2010年初开放Symbian源代码。开源后的Symbian将提供统一的GUI平台,使原先不生产Symbian手机的厂商也可推出基于开源代码的Symbian手机产品。

智能手机产品良好的市场表现以及Symbian开源带来的商业机会,都在不断地刺激对Symbian研发人员的需求。另一方面,诺基亚于日前正式推出了OVI Store,为Symbian开发人员提供了更方便地获取利润的途径,可以预期,在相当长的一段时间内从事Symbian开发的技术人员在劳动力市场上将会具备很强的竞争力。正是这样的形势,使得越来越多的开发人员希望了解Symbian开发技术,进入这个充满机会的领域。为了帮助大家更快更轻松地进入Symbian开发世界,我们编写了本书。

为什么选择本书?

以笔者的个人经验,当前市面上可以买到的Symbian资料有两个特点,一是知识体系比较全面,二是文字表述非常专业化。这样的书籍用作开发人员日常工作时所参考的手册非常适合,但是对于Symbian开发初学者来说,就显得不够浅显。如果把英文原版的开发类书籍和中文书籍进行比较,原版书的内容反而更容易理解。为什么呢?这是因为英文书里对技术问题的表述,能用简单语言说明白的就尽量不堆砌大量的专业词汇,能用短句说明白的就避免使用长句。比起中文书籍来,学术色彩可能淡了许多,但可读性却强了不少。现在国内采用轻松的文字来说明比较专业或复杂的问题也逐渐成为一种时尚,本书的作者们怀着三颗激动而又忐忑的心,希望能用轻松的语言给大家介绍Symbian开发的基础知识,帮助初学者尽快入门。把复杂的事情变得简单是一种很强大的能力,我们很努力地希望做到这点。尽管本书内容算不上有多复杂,疏漏之处仍在所难免,恳请各位读者批评指正。

许多Symbian开发书籍在讲解关键知识点时,会采用一些比较类似的例程来进行介绍,比如几乎所有的Symbian开发类书籍在介绍“活动对象”知识点时,都使用一个定时器程序。这样的例程被太多地使用,以至于一些读者误以为定时器是使用活动对象的一个必要条件,未写程序自己就先糊涂了。这种情况笔者在招聘面试的时候不止一次地遇到。我们希望能够更清楚地对这些知识点进行阐述,因而会举一些不同于其他书籍,但又能够帮助读者理解的例子。这是我们写作时对自己的一点期望。

不少开发人员反映Symbian开发门槛较高,笔者认为,国内Symbian入门级的书籍对初学者不太友好是让大家对Symbian望而生畏的一个重要原因。就我们从事Symbian开发这几年得到的经验来看,Symbian开发远远没有大家想象的那么复杂。笔者周围就不乏这样的应届毕业生,他们在比较系统的培训帮助下,一般在3周之内就可以对Symbian开发有一个基础的掌握。世上无难事,只怕有心人,更何况Symbian并不那么难。如果这本书能让一些读者迅速地进入Symbian开发者的行列,我们将感到无比欣慰。

本书讲什么?

本书作者主要从事Symbian方面的开发工作,还负责部分新员工招聘、培训等工作。基于这些积累的经验,本书将初学者应该学习和重视的内容分为10章进行介绍:

第1章 从零开始。主要介绍Symbian的历史及发展,本书内容的组织方式、开发环境的搭建以及Symbian开发常用的一些网络资源等。另外还对本书所用开源程序代码的下载、使用等方面进行了简单的说明。

第2章 程序架构介绍。首先对Symbian应用程序设计的基本原则进行介绍,然后对书中所使用的游戏程序架构作一个简单的说明,最后概括介绍Symbian程序的编码规范。

第3章 工程结构和视图切换。主要对Symbian应用程序的工程结构以及使用较多的视图切换架构进行了介绍。

第4章 描述符、数组和文件。主要讲解描述符、数组以及文件操作等基础知识。

第5章 异常处理。对Symbian特有的异常处理机制进行了讲解,包括两阶段构造、清除栈等内容。

第6章 事件响应。简单介绍了Symbian事件的产生、传递和分发的基本过程,并举例说明了一些常见事件的处理。

第7章 控件。主要基于S60对一些典型控件的使用进行了说明,包括一些基本的控件接口、资源文件等。

第8章 多媒体。主要对图片的绘制、音乐的播放以及多媒体框架等知识点进行了讲解。

第9章 活动对象。对Symbian特有的异步多任务处理机制——活动对象进行了讲解,包括活动对象的原理、使用方法以及一些注意事项等。

第10章 测试与打包。介绍一些常用的辅助开发工具,Symbian应用程序的打包、证书以及签名等方面的内容。

另有附录,提供手机按键名称图、Symbian本地化语言代码列表、常见错误代码列表、Symbian程序调试技巧以及常用术语表。

书中设计了一个EasyBounce触摸屏弹球游戏的开源项目,作为讲解内容的支持程序,读者可以通过不断完善或者变通这个程序开发出自己的“产品”。需要说明的是,在介绍某些知识点时我们引用了其代码来辅助讲解,它只是为内容的阐述服务。

本书适合你吗?

这是一本写给Symbian初学者的书,笔者假定本书的读者具有C++的基础知识,但没有太多的开发经验。如果您属于下面人群中的某一类,那么恭喜,本书很适合您阅读。

1.已工作并且希望进入Symbian开发领域的程序员。

2.从事移动互联网应用开发、移动增值服务等开发工作的技术人员。

3.希望自己开发Symbian软件并通过软件商店或手机社区发布的发烧友。

4.Symbian技术培训学校的学员。

5.希望成为Symbian开源社区的贡献者的程序员。

6.对Symbian开发感兴趣的在校学生。

7.寻找浅显易懂的Symbian教材的老师们。

社区支持

本书涉及的所有代码可通过以下路径下载:

http://EasyBounce.googlecode.com/

www.easymbian.com由本书作者创建,目的是为大家提供一个开放的讨论社区,欢迎“灌水拍砖”。本书的勘误或更新也会及时发布到该网站,读者在使用本书时遇到的问题可以在讨论区里同作者进行交流。

另有以下网站对Symbian开发者具有非常重要的作用:

www.forum.nokia.com

www.symbian.org

www.newlc.com

有关本书内容的探讨,读者可以通过邮件联系3位作者:

赵希哲:cedric.zh@gmail.com

司维:siwei0000@hotmail.com

宋昱鹏:songyupeng@gmail.com

由于时间仓促,书中难免有缺点和疑误之处,恳请读者给予批评和指正,以利于我们修正和进步。关于本书的任何建议和意见,可发邮件反馈至qingxiaoqin@ptpress.com.cn。

致谢

本书能够得以问世,需要感谢人民邮电出版社编辑老师的热情支持,他们的耐心和帮助为我们能够顺利完成书稿起到重要的推动作用。

最需要感谢的是购买本书的读者,您的支持才是我们最大的动力。

2009年8月1日

作者第1章从零开始

唯初太始,道立于一,

造分天地,化成万物。——《说文解字》1.1 Symbian那些事儿

当前的智能手机其实就是一部小型计算机[1],因为它也是由CPU、内存、I/O设备等构成的,其中会运行一个操作系统,在操作系统之上再运行各种应用程序,比如电话本、记事本等。我们所熟悉的Symbian,指的就是运行在手机上的操作系统。本书向大家介绍的就是如何开发在Symbian操作系统上运行的应用程序。编程是这本书的主题,不过先简单地对产业背景进行一些介绍,或许会有助于大家了解这个行业。对于编程以外的信息不感兴趣的读者,可以跳过本章第一节。

手机持有率不断提高,使得电信网络和嵌入式设备快速的技术升级一直在不断刺激市场需求,因而手机软件研发近几年也同时成为一个比较受关注的领域。从操作系统层面看,目前正是一个群雄并起、各显神通的时代。与Windows一统PC天下不同,尽管Symbian在手机操作系统市场居于统治地位[2],然而,其他主流的操作系统也有着非常不错的市场表现,并以各自的特色形成了独特的竞争力。这些操作系统主要有Windows Mobile、Android、iPhone以及Linux系统等。

Windows Mobile是微软推出的嵌入式操作系统,因为其操作习惯与PC上安装的Windows接近,并且兼容PC Windows上的Office文档格式,所以对用户有不小的吸引力。Android是Google在Linux上建立的手机软件平台,其中内置了一些Google的服务,如GMail等,得到了许多厂商和运营商的支持,不过截至目前市场上的Android手机并不是很多,许多厂商的Android手机仍处于研发阶段。iPhone是Apple推出的手机产品,在市场上有极大的影响力,其MAC风格的界面提升了用户对于手机产品界面美观程度的期望,并迫使其他厂商加快了推出触摸屏手机的进度。在此之外,许多厂商都有自己的基于Linux操作系统的移动设备产品,如诺基亚的Maemon、爱立信的ACCESS Linux Platform等;也有一些厂商联合起来组建了Linux手机平台联盟,比如LiMo、LiPS等。Linux手机平台的特点和Linux操作系统的特点一脉相承,那就是标准繁多、各自为战。1.1.1 Symbian的历史

下面该我们的主角Symbian出场了。1980年,英国成立了一家名叫Psion的公司,为PDA设备开发了一个名叫EPOC的操作系统。EPOC的全称为a New Epoch for Personal Convenience,意思是希望用户使用嵌入式设备就像吃奶酪一样简单。这个名字展现了当年的技术人员对于美好未来的无限憧憬。EPOC系统在一开始就支持无线通信硬件和应用处理硬件并存[3],这样的设计似乎是专为多年后的智能手机而准备的,因此Symbian从诞生的那天起就注定了要引领一个时代。其实在早期,EPOC系统的PDA产品也一直在欧洲享有盛誉。

1998年,诺基亚、摩托罗拉等公司和Psion一起组建了新公司Symbian。2004年,诺基亚、西门子、索尼爱立信、松下、三星与原来的Psion公司进行了股权重组,从此大名鼎鼎的Symbian由诺基亚绝对控股。Symbian成立的初衷是对抗微软,避免在手机操作系统领域出现Windows一统江湖,各厂商不得不支付昂贵的操作系统费用的情况。后来摩托罗拉曾经退出Symbian阵营,转而尝试Windows Mobile和Linux,但索尼爱立信、三星等股东一直与诺基亚一起不断在市场上推出基于Symbian的智能手机,使得Symbian手机的市场占有率一直牢牢占据着第一的位置,并且其占有率不断提升。2008年,随着iPhone的上市、Google Android平台的推出,移动通信终端市场的运作模式以及消费者的需求都发生了很大的变化,诺基亚也因势而动,收购了Symbian其他股东的所有股份,然后于2009年初宣布成立Symbian基金会,采用开源的模式运作Symbian,并计划于2010年初发布第一个开源的Symbian代码版本。1.1.2 Symbian的现状

目前,基于Symbian平台推出产品的厂商主要是诺基亚和索尼爱立信,这两家厂商分别在Symbian操作系统之上开发了自己的GUI平台:诺基亚产品主要使用S60平台,索尼爱立信则使用UIQ,二者提供了不同的界面风格和差异化的应用程序集合。S60平台其实也不仅仅是诺基亚在使用,其他手机生产厂商如三星等,也都有基于S60平台的手机产品,不过这些厂商都需要向诺基亚支付一定的授权使用费。由于S60手机的出货量远大于UIQ[4],现有的参考书籍一般也都以S60作为学习Symbian的平台,所以本书也将基于S60为大家介绍Symbian应用程序开发(基于UIQ的开发其实大同小异,本书不作赘述)。

S60或UIQ是厂商为了提供更具特色的界面风格和应用集合而开发的GUI平台,以S60为例,它同Symbian的关系如图1-1所示。图1-1 S60和Symbian的关系

我们平常看到的S60手机,里面运行的都是Symbian操作系统,而用户打开的各种手机上自带的程序,比如电话本、短信、媒体播放器等,其实都是图1-1中“Application”的那一部分。这些标准的Application以及第三方开发的程序(大部分是我们需要通过sis包安装的),都是在UI Framework也就是S60的应用程序框架下开发和运行的,而这些应用程序和应用程序框架,都运行在Symbian操作系统之上。1.1.3 Symbian的未来

Symbian的开源,将给许多研发实力相对较弱的制造商提供推出Symbian终端的机会。不妨想象一下,以山寨手机的价格,享受堪比诺基亚手机的功能,这对消费者来说,具有多大的吸引力!而将S60、UIQ和MOAPS整合成一个共同的平台,也将为第三方应用程序开发者们减少程序移植的工作,使得应用程序只需要一个版本即可在所有的手机上运行。届时,庞大的用户群体和完全开源的代码,将吸引充满热情和技术能力的开源社区贡献者充分发挥他们无穷的创造力,为Symbian手机用户提供更多优秀的应用。这些应用将使得Symbian终端对用户产生更强的吸引力,终端生产厂商从而也会投入更多的资源推出Symbian产品,不断巩固和发展Symbian用户群体,形成良性的产业环境。当然,跟Linux等成熟的开源社区相比,Symbian还是一个初生的婴儿,要走的路还很远。其开源之路也可能会遇到各种意想不到的困难,不过我们相信,通过各方的努力,Symbian将会有一个非常美好的前景。1.2 本书的Readme

本书的读者只要具备最基本的C++基础知识,能够使用指针,能够编写简单的面向对象的程序就行,至于STL编程、C++对象模型、智能指针、RTTI(运行时类型识别)等相对“高级”一些的知识,本书并未深入涉及。一些初学者把移动开发看成一件非常有技术难度的事情,不敢涉足其中。其实开发Symbian程序与开发其他平台的程序相比,并无太大区别,只要我们利用好基础知识,认真学习、加强练习就一定能很快掌握。1.2.1 内容的组织方式

许多Symbian开发类书籍都有一个共同的“特点”,那就是写得像学术专著,虽然优点很明显——内容全面、结构严谨,但许多初学者往往是看了几章以后依然不知道怎样才能写出可以运行的程序,不知道看到的内容对自己将来开发Symbian应用程序有什么帮助,各种语言甚至是API的细节堆积在一起,越看“头越大”,记也记不住,用也用不了,最后要么是怀疑自己愚钝,要么是慨叹Symbian复杂。其实学习某一特定平台的软件开发(如MFC、Symbian等),不外乎这几个要素:

首先当然是准备好开发环境,并大概熟悉最主要的编译、调试等基本操作;然后还需要了解平台特定的机制,比如异常处理机制、内存管理机制、应用程序框架等;了解一些基本的API,写一个小程序试一下,同时弄清楚该平台的帮助手册或其他文档都有哪些内容,大概怎样使用。

剩下的就是在实践中,用到什么学什么,逐步提高了。笔者在学习Symbian之初也遇到过上述困难,为了让读者少走弯路,笔者结合自己的实践体会和经验,想通过一种比较实际的方式来介绍Symbian开发,让读者把精力放在最重要的环节上,每一个知识点都尽可能动手实践,在实践中学习,从而向“知行合一”的牛人境界迈出宝贵的第一步。

再者,程序员最大的乐趣就在于自己的开发成果能够被人使用。为了让大家在学习的过程中享受这种乐趣,笔者设计了一个简单的开源游戏项目——触摸屏弹球游戏,供大家学习参考。这样读者跟随本书的进度,对大部分知识点都可以参照这个小项目的代码去理解,等学完了全书,自己基本上能照猫画虎地写出一个有意思的小游戏,自豪地show给朋友们看了。这个游戏程序的完整代码,我们也放在了网上。当然,一个小游戏不可能涵盖所有必要的知识点,所以书中也有很多游戏程序以外的例程,代码同样可以在网上下载。

讲到这里,大家应该大概了解我们的思路了,那就是从零开始讲解Symbian开发的必要知识点,结合游戏程序来举例并提供一些练习。为了能保证达到预期的效果,我们写作的时候给自己提出了一些期望:

绝不假设读者对于Symbian或其他的软件开发平台有什么样的了解,避免无关的信息干扰读者的学习;

尽量选择关键的知识点进行介绍,绝不试图把这本书写成手册。因为任何一个软件开发平台,都有无数的API,先了解基本机制,其他的用到再去学才是真正的王道,一次把所有这些东西呈现给初学者并不是个好主意;

在每个“必要”的知识点以外,都尽量进行一定的扩展,让学有余力的读者能够了解一些更多更深入的内容。1.2.2 怎样使用本书

我们在许多章节中都把弹球程序代码(或者其他例程的代码)和知识点的介绍结合在一起,建议大家在看书的过程中动手试一试这些代码,最好对我们给出的代码进行一些修改,看看不同的情况下程序会表现出什么样的行为。我们也为每一章都提供了各自的代码版本,分别对应各章的内容,便于大家参考。

另外,书中提供的小游戏代码在很多时候是为了说明知识点而写,并不一定是最简练高效的代码,而且为了避免因文害义,本书也没有把小游戏程序的所有代码和功能都列出来一一讲解。欢迎对游戏程序感兴趣的读者和我们交流,在程序的设计和实现等各方面给予批评指正。1.2.3 利用好网上的资源

我们为弹球游戏在Google Code上建立了一个开源项目,它的代码以及扩展知识点练习的代码,都可通过以下路径下载:

http://EasyBounce.googlecode.com/

学完本书后,如果有兴趣,大家也可以参与我们这个小小的开源项目,继续完善和扩充这个小游戏,让它变得更好玩!

这个开源项目的代码库结构是这样的:

trunk里面的代码是我们用于后续开发的版本,随着后续开发的进行,这个版本会脱离本书的内容范围。

branches里面用来保存各个分支,比如对本书的每一章,都会有一个对应的代码分支版本,供读者参考。前面给出的下载路径里的代码,都可以在这里面找到。

Tag里面是开发工程中作的一些标记,大家可以不用太关心。

另外,以下站点也有Symbian开发者常用的一些资源,列出来供大家参考:

http://www.forum.nokia.com:这就是大名鼎鼎的诺基亚论坛,对Symbian开发人员来说毫无疑问是很重要的网站。上面有关于S60的各种SDK、文档、示例程序以及许多可用于自学的电子课件;有问题了可以去问混迹于此的高手,不会用的API也可以去查,没事干还可以参加各种编程竞赛活动。

http://developer.symbian.com:这也叫做SDN,内容的组织和诺基亚论坛有些相似,不过它主要提供和Symbian本身相关的内容。有一个很重要的东西就是Symbian在线帮助文档,查找API十分方便。

http://www.newlc.com:一个非常著名的嵌入式开发者社区,有很多业界的新闻以及技术文档。

http://www.symbianfoundation.org:这是Symbian开源基金会的网站,有Symbian的开源代码和各种工具、文档等,相信对大家会很有帮助。1.3 一个有趣的触摸屏游戏

2008年诺基亚推出了第一款触摸屏S60手机5800XPress Music,基于 S60 5.0版,后续的许多触摸屏产品如N97等,也都基于此平台开发,所以我们的弹球游戏也定位到这个平台上。S60 5.0和以前的S60版本相比,最显著的一个特点就是增加了对触摸屏的支持。读完了本书的第6章,你就会发现,其实对于程序员来讲,让自己的程序支持触摸屏,是多么容易的一件事。

下面是我们要开发的弹球游戏的基本功能说明,大家可以把它看成是一份简单的需求文档。1.3.1 游戏的需求说明【介绍】

该软件是一款基于S60 5.0平台的触摸屏弹球游戏,可以记录玩家姓名和分数,显示得分排行榜,并可设置游戏难度;可以运行在基于S60 5.0平台的触摸屏手机上。

此游戏已在Nokia 5800 XPressMusic Phone上测试通过。【功能需求】

1.主界面显示(1)主界面为打开程序时呈现给用户的第一个界面(MainView)。(2)另有以下两种情况,程序切换到此界面:

用户从游戏界面返回;

用户从排行榜返回。(3)用户用触笔单击按钮,程序进入相应界面。(4)用户选择“Option”命令,程序弹出菜单,显示“About”菜单项。(5)用户选择“About”菜单项时,程序弹出对话框,显示作者和版权信息。(6)用户选择右软键“Exit”命令,程序关闭。

2.游戏界面显示(1)用户从主界面点击Start按钮时,程序弹出对话框提示用户选择游戏难度。(2)用户选择难度后进入游戏,此时游戏处于未开始状态。(3)用户通过选项菜单里的“start”命令来开始游戏。(4)此界面的显示元素主要有3种:小球、背景、线。(5)游戏开始后,用户可通过键盘OK键暂停和恢复游戏(如果目标硬件具有键盘)。(6)游戏结束时,如果成绩可以进入排行榜,则弹出输入框要求用户输入玩家姓名,用于保存得分记录。(7)玩家姓名输入完成后,用户点击OK按钮,游戏进入排行榜界面。

3.排行榜界面显示(1)用户从主界面点击Rank按钮时,程序进入排行榜界面。(2)此界面显示程序保存的玩家得分记录,按分数高低进行排序。(3)排行榜最多保存10条记录,超出后,删除成绩最低的记录。

4.游戏逻辑(1)用户用触笔在此界面上从一点拖动到另一点,两点之间会显示一条线。(2)若小球在下降过程中接触到用户所设置的线,则会被线弹起,弹起的方向为小球与线相撞的镜面反射方向。(3)小球弹起的加速度与小球与线接触时的速度成正比。(4)小球自由运动的时候,受到向下的恒定加速度。(5)小球接触到屏幕最下方,则游戏结束。(6)小球向上运动的距离,作为用户的分数进行记录。【非功能性需求】(1)屏幕大小发生变化时,程序的界面显示自动根据新的屏幕大小进行布局。程序部分界面效果如图1-2所示。(2)游戏界面支持系统皮肤。图1-2 程序部分界面效果示意1.3.2 小项目的开发过程

一般来说,一个小项目的开发过程可以相对简单一些,确定好需求,搭建好开发运行环境,架构师确定了设计方案,就可以进入紧张的编码阶段,一个模块一个模块地写,一边写一边自己测试,等写得差不多了,就可以请专职的测试人员来帮忙发现程序里的Bug!

对应到本书里,大家可以认为第1章的背景介绍、需求分析等就是项目经理在为大家开会打气,介绍项目内容;然后就是配置管理员来帮大家搭建开发环境,熟悉工具的使用;紧接着第2章就是架构师来阐述程序的设计方案,以及模块的划分;再接下来,就是分别实现各模块的工作了;最终测试通过后再进行打包发布,一个小项目就圆满结束了。本书的章节基本上也是按照这个顺序安排的,便于大家由浅入深逐步了解Symbian应用程序开发所涉及的方方面面。1.4 搭建全免费的开发环境

先说句题外话,很多人喜欢把Windows XP安装到C盘下,然后把各种软件安装到D盘,这样的做法本身没什么问题。不过在搭建Symbian开发环境的时候,我们的建议是尽量避免修改安装过程当中的默认设置。安装开发环境为的是学习Symbian开发,如果在对开发环境还不熟悉的时候就去做个性化的配置,容易引起一些意外,比如代码编译不通过等,让大家搞不清楚是自己代码写得有问题还是环境配置有问题,会严重干扰学习。所以建议大家尽量在C盘保留足够的空间,以便能按默认的设置顺利安装所需的开发环境。

前面已经提到,我们采用S60平台来学习和开发Symbian应用,需要以下几样东西,为了避免大家遇到不必要的问题,请尽量按照顺序安装。它们之间的关系如图1-3所示。图1-3 Symbian开发环境

图1-3中,阴影部分表示需要进行安装的软件或环境,共4项,分别是JRE、ActivePerl、S60 SDK以及Carbide.c++;虚线白色的框表示的则是逻辑上的概念;箭头表示环境之间的依赖关系。比如Carbide.c++本身就是基于Eclipse开发的,安装了Carbide.c++就不需要安装Eclipse了,我们把它画出来只是为了逻辑上的完整。而Eclispe是需要运行在Java环境下的,因此我们需要安装JRE。同样的,S60 SDK需要用Perl脚本来进行一些build等工作,所以我们也需要安装一个Perl的环境。需要指出的是,目前诺基亚官方提供的S60 SDK只能运行在Windows环境下,Linux/UNIX环境下暂时还不支持S60开发。1.4.1 SDK

安装S60的SDK之前需要做一些安装准备工作。

STEP01 安装JRE,如图1-4所示。JRE是Jave Runtime Environment的简称,前面提到过,我们的程序跟Java一点关系都没有,安装它纯粹是为后面其他的工具做准备。

STEP02 安装ActivePerl,如图1-5所示。这是一个Perl脚本的运行环境,虽然build很多地方其实跟它相关,不过对于一般的程序员来讲,可以忽略它的存在,只是别忘了把它安装上就行。另外就是必须安装5.6.1.635这个版本,旧版本肯定不行,而比635新的版本修改了某些库,但S60 SDK仍然在使用5.6.1.635的库,导致了目前这种稍微有些尴尬的状况。大家如果感兴趣可以和他人探讨一下这个问题,此处不做赘述。

提醒注意

安装ActivePerl的时候,默认的安装路径是D盘,这个安装路径是可以改的,可以不和SDK以及工程文件放在同一盘符下,如图1-6所示。图1-4 安装JRE图1-5 安装ActivePerl图1-6 选择ActivePerl的安装路径

STEP03 安装SDK可以去诺基亚论坛下载,只需一直单击Next按钮即可完成安装。图1-7 安装S60 SDK

理论上讲,现在我们已经可以进行所有的开发活动了,不过都是基于命令行的,用起来会让人痛苦万分。因此我们还需要安装一个图形界面的集成开发环境(IDE,Integrated Development Environment)来摆脱讨厌的命令行。1.4.2 IDE

一般来说开发Symbian C++程序可选择的IDE包括CodeWarrior、Carbide.c++和Carbide.vs。CodeWarrior已经过时并且不再更新,而Carbide.vs适合那些忠实于微软Visual Studio开发环境的开发者。而基于Eclipse的Carbide.c++是诺基亚为Symbian C++开发量身打造的工具,这个功能无比强大的IDE仍然是免费的,可以在诺基亚论坛上下载,其安装界面如图1-8所示。图1-8 安装Carbide.c++1.4.3 帮助文档

安装S60 5.0的SDK后,帮助文档可以通过执行“Help->Help Contents”命令打开,如图1-9所示。这个帮助文档包含了对Carbide的使用帮助,Symbian C++以及Symbian API、S60 API乃至一些程序示例等,内容还是很丰富的。不过读者用多了会发现,至少到目前为止, Symbian和S60提供的帮助文档与微软的MFC、.NET开发文档相比较,还是有很多不足,比如对于API的使用说明不够详细、示例程序偏少、文档内容查找不方便等。实事求是讲,Symbian在帮助文档上的欠缺确实给程序员带来了不少挑战,不过好在有“万能”的互联网。网络上有许多无私地把自己的技术积累分享出来的大虾们,我们基本上还是能够找到足够的帮助。笔者也希望Symbian开源后,在文档的完善程度和易用性上能够有所改进。图1-9 在Carbide里打开帮助文档1.4.4 代码管理

熟悉SVN使用的读者可以跳过这一小节。本书里涉及的游戏程序代码以及其他一些例程、练习等代码都可以在前面提到的Google Code上找到,而Google Code使用SVN作为代码管理工具,推荐大家在平时写练习程序的时候使用这个代码管理工具。Windows上有很多SVN的客户端,笔者使用的是TortoiseSVN,安装后我们可以随便找一个文件夹,然后打开鼠标右键快捷菜单,就能看到Tortoise的操作命令了,如图1-10所示。

TortoiseSVN的使用也很简单。下面简单介绍Checkout、Update和Commit这3种最常用的操作。

Checkout,也就是签出代码。要先打开我们想要存放代码的目录,比如“C:\Symbian\Carbide\workspace\”,然后在鼠标右键快捷菜单里选择“SVN Checkout”命令,此时会弹出Checkout对话框,如图1-11所示。填入代码库的路径,比如图中EasyBounce程序进行后续开发的代码路径,此时“Check out directory”文本框中会自动填写成当前所在的目录。然后单击OK按钮,再输入我们在Google Code上获取的用户名和密码就大功告成了。图1-10 鼠标右键快捷菜单中的TortoiseSVN命令图1-11 Checkout对话框

当代码库里的代码发生变化时,就需要更新本地的代码,此时选中要更新的代码文件夹,选择鼠标右键快捷菜单中的“SVN Update”命令即可,够简单吧!

Commit,也就是签入代码,就是把本地所做的修改同步到代码库里面去。这个操作同样十分简单,只需要在鼠标右键快捷菜单中选择“SVM Commit”命令就可以了。不过需要注意的是,每次在Commit之前,都应该先进行一次更新。如果本地所做的修改和代码库里的最新代码有冲突(因为别人也可能在修改同一个文件),在更新的时候,Tortoise会提示发生了冲突,这样可以避免我们强行Commit时把代码库里的代码搞乱。

Google Code上的代码默认只有Checkout和Update的权限,如果你想参与到EasyBounce程序后续的开发活动当中来,需要先经授权后才可以Commit代码。上面介绍的都是使用已经存在的代码库,如果你想在自己的电脑上建立代码库,就需要安装SVN服务器软件,并作一些简单的配置。同样SVN服务器也有图形化的管理工具可供使用,此处不再赘述。1.5 更多关于Symbian开发环境的事1.5.1 SDK简介

使用前述的默认安装方法,我们可以在“C:\S60\devices”路径下找到安装以后的SDK。进入SDK目录后,会看到一些带有Example字样的文件夹,比如Examples、S60CppExamples等,这些文件夹里都是示例程序,包含了应用程序框架、网络通信、多媒体等各个方面,大家在写程序的时候可以参考。在学习本书各章节的时候,也可以到这里来找一些相关的例程看一看。

与Examples同级的有一个文件夹叫做epoc32,这个目录其实才是SDK的核心,我们写程序要用到的库文件、头文件,运行在Windows上的模拟器,以及用来编译程序的一些命令行工具等都在这个文件夹里面。表1-1是对epoc32中一些主要的文件夹进行简要的说明。其实对大部分程序员来说,这部分内容并不需要多深入地了解,可以在需要的时候查阅就行。表1-1 epoc32文件夹说明续表

与epoc同级的目录下有一个data文件夹,其中存放了一些模拟器的配置文件。在其根目录下,有一个文件叫做epoc.ini,其中引用了各种不同屏幕的配置文件。根据各配置项的名字能够比较容易地理解其含义,大家可以尝试进行一些修改,比如手机模拟器的默认内存大小等。这些配置项一般情况下是用不到的,只是在一些特殊的情况下才会用得到。

另外,从SDK的一些目录名中可以发现,S60现在还支持widget的开发。widget是一种用.xml描述界面,用JavaScript实现程序逻辑的应用程序,运行在手机里的Web Run-time之上。因为widget可以方便地使用网络上服务器的服务以及手机本地的功能(如导航等),所以可以实现一些很有趣的应用。有兴趣的读者可以到诺基亚论坛上找一些相关的资料去了解。1.5.2 IDE功能简介

Eclipse 是现在非常主流的 IDE,其强大而实用的功能可帮助程序员提高工作效率。Carbide.c++继承了Eclipse的强大,并且额外提供了一些针对Symbian开发的工具和特性。这里我们举几个例子简单介绍一下。如果想从IDE上获得更多的效率提升,可以多看看Carbide的帮助文档。

1.重构功能

IDE的“重构”功能,并不能自动地把设计和代码都混乱的工程变得各方面都趋于完美,它只是给我们的重构工作提供一些方便。比如在一个工程里,你想修改一个标识符的名称,就需要在它的声明和所有的调用里都进行修改,当使用该标识符的文件很多的时候,这就是一项非常麻烦的工作。这时,我们就可以使用IDE提供的重构工具。首先选中这个标识符,在鼠标右键快捷菜单中选择“Refactor->Rename”命令,如图1-12所示。图1-12 Carbide的重构工具

随即弹出一个对话框(如图1-13所示),在“Rename to”文本框中填写标识符新的名称,在下栏中选择修改范围,即可选修改所有工程、单个工程、源代码、注释和宏定义等。选择后单击Preview按钮可以帮我们了解这个修改涉及哪些文件。图1-13 重命名对话框

预览界面如图1-14所示,它列出了这次标识符名称变化所需要修改的所有地方。确认无误后,单击OK按钮即可。图1-14 查看重命名可能影响到的代码

2.代码模板

如果使用Carbide向导生成工程、文件或类,得到的代码都会符合一定的规则,这就是代码模板的作用。我们可以选择“Window->Preferences”菜单命令打开设置界面,如图1-15所示,通过搜索“code”关键词找到设置代码模板的地方,图中显示的就是设置每个文件开头的注释格式,格式里的“${file_name}”、“${date}”是变量,生成文件后被实际的值所替代。其他内容如函数体代码、构造函数注释等都可以在此自定义格式。图1-15 配置代码模板

3.快捷键

表1-2列出了Carbide.c++常用的一些快捷键,喜欢键盘操作的读者可以参考。

除了表1-2列出的常用快捷键,其他快捷键可以按Ctrl+Shift+L键查看。表1-2 Carbide.c++快捷键及其作用续表1.6 小结

本章主要介绍的是一些行业背景知识,以及书中内容的组织、开发环境的搭建和使用等,阅读的时候不费什么脑筋,随着阅读的逐步深入大家将不断加深自己对Symbian平台的理解。阅读编程类的书籍切忌死记硬背,这一章尤其如此,许多工具大家只要知道在哪里能找到就可以了,用到时能快速找到才是比较好的状态。

[1].我们可以通过这样的类比去理解手机,但现在市场上的手机硬件和PC还是有很大的不同,正是这些不同导致手机软件开发被普遍归入嵌入式软件开发这个领域。

[2].根据市场调查机构2008年发布的统计数据,运行Symbian操作系统的手机约占据了40%~50%的市场份额。

[3].当前基于Symbian的许多智能手机都具有一个通用CPU和一个专用的基带处理器。

[4].据调查显示,2006年第4季度S60手机市场占有率约为53.5%,UIQ以及其他Symbian平台约占17.4%。第2章程序架构介绍

凡兵,制必先定,

制先定则士不乱,

士不乱则形乃明。——《尉缭子·制谈》

程序的需求在第1章中已经讲得比较明确了,现在让我们开始考虑程序的结构。要从零开始逐步开发完成一个应用程序,应该从何处着手呢?有没有一些方法或原则,可以指导我们有计划地创建应用程序呢?

有!本章我们就将介绍一些Symbian应用程序通用的设计原则。在这些原则的指引下,我们可以从模糊到具体,由粗到细,逐步描绘出我们的程序结构,并设计出一个结构方案。2.1 Symbian应用程序设计原则

这里将介绍两个Symbian应用程序通用的设计原则,它们可以帮助我们更方便地创建清晰、健壮和简洁的程序结构,使得之后的开发过程变得比较简单,并且易于维护。2.1.1 程序界面与逻辑分离原则

提到图形界面应用程序,我们首先可能会想到MVC的结构,以模型来封装数据和业务逻辑及相关的操作,再用视图来观察并显示数据来增加程序的结构性。MVC本身的结构比较复杂,我们这里不作详细介绍,其主要思想就是程序的界面和逻辑分离的原则,这是我们所关心的。这个原则把程序的界面和逻辑部分分成两个相对比较独立的模块,这样我们可以专注于开发逻辑部分或是界面部分,让开发工作变得简单,同时清晰的结构使得代码管理起来更加有效,且易于维护。此外,模块独立使逻辑部分具有更好的可移植性,我们甚至可以在使用同一个逻辑模块的情况下,完全地更换一个程序界面。下面我们来看一下这个原则的具体内容。

逻辑模块一般包含程序用到的数据、操作这些数据的算法、程序用到的文件和网络等资源。开发逻辑模块时,我们应该考虑怎么来存储程序的状态,使用什么样的数据结构更加方便、效率更高?程序都用到了哪些资源?什么时候创建和销毁这些资源?有多个使用者的时候允不允许资源共享?什么样的资源管理方法会比较有效和安全?怎样封装?对外提供哪些接口让其他模块更加方便地使用这些资源?当用户对数据或是资源进行了操作之后,什么样的算法能更加方便高效地实现这些操作。

界面模块和逻辑模块大不相同,这部分通常会比较复杂,代码量也更大,主要提供两个功能——显示数据和响应用户的操作。界面应该能够准确地显示逻辑部分的数据,应用程序的当前状态,同时还要保持对数据的观察,及时反映数据的变化。在界面设计时,还有一个重要的问题就是界面设计要美观,这属于美工的范围,这里就不具体介绍了。界面的另外一个功能,就是响应用户的操作,界面向用户提供了操作数据的方法,它把用户的操作传递给模型部分,使用户可以通过界面间接地实现对数据的操作。用户友好的界面能让人使用起来很舒服,能更方便地操作数据。

我们可以通过把模型和界面以某种方式组合到一起来构建应用程序,比如使用层次结构把界面放置于模型的上面。当用户打开程序后,界面会把当前的数据呈现给用户;当用户操作时,界面负责把这些操作传递给下层的模型,这些操作的执行引起了数据的变化,而界面观察到之后,又及时地把这些变化展示给用户。这样在模型和界面的相互作用过程中,用户就可以查询当前数据,对数据进行修改并看到修改后的结果。2.1.2 观察者设计模式的运用

Symbian和S60的代码里面大量运用了一些常见的设计模式,特别是观察者模式随处可见。在系统比较复杂的情况下,我们在设计时会从中抽象出很多个类,并且相互之间会有依赖关系,这么多类之间怎样保持数据的一致性呢?答案就是使用观察者设计模式。在观察者模式中,涉及两个重要的角色,如果两个对象之间有依赖关系,一个对象中数据的变化会引起另外一个对象的变化,我们把前者称作观察对象,后者称为观察者。观察对象内部保有一个观察者的引用,这个引用是观察者根据自己的兴趣注册上去的。

观察者对哪个对象内部的数据比较关心,就可以把自己注册到哪个对象上。当观察对象内部有数据发生变化时,就通知观察者,它并不需要知道这个观察者到底是哪个对象,内部有哪些数据,具体长什么“样子”。这样就把两者之间的关系和在通信中各自的责任分工明确;观察者监听观察对象的变化,并作出相应的改变。

使用观察者模式的好处就在于把两个存在依赖关系的对象进行解耦合,使得观察对象和观察者可以相对独立地设计和随着需要变化而变化,而且每一个都可以复用。在Symbian和S60的代码里,经常会有控件或是数据库的观察者,当控件或数据库的状态发生变化时,就会通知观察者去做出相应变化。比如第7章里我们介绍到的列表框控件,开发者如果想对用户点击或拖动列表框的事件做出响应的话,一般会实现一个列表框事件观察者接口,在创建列表框时,把观察者接口的一个实例注册进去,这样每次当用户在列表框上有所动作时,观察者都能够监听到事件,然后就可以根据事件的类型和开发者的兴趣去进行处理了。2.1.3 良好的应用程序行为

为了保证我们的应用程序足够健壮,开发时我们应用注意一些问题。(1)为了保证数据的完整性,每次保存数据前我们都应该检查磁盘是否已被占满。不论是向数据库写数据,还是直接往磁盘写文件,如果不充分考虑磁盘满的情况,极有可能造成数据丢失,甚至数据不一致等严重的后果。(2)程序要善始善终。程序初次创建时可能不会有太多的问题,但是当程序运行一段时间之后,其中的数据会比较复杂,程序可能进入了某些不是期望中的状态;再加上退出的情况比较复杂,可能是用户显式的正常退出,或被用户强行关闭或意外掉电,甚至可能在内存不足或其他非常状态下被操作系统给关闭掉。因此程序退出前一定要考虑各种可能的情况,保存好数据,并释放当前所拥有的各个资源。(3)对于资源,一定要做到使用完就释放和清理。因为手机和个人电脑的使用习惯不一样,用户经常会一个月甚至更长时间不关机,这样程序里的每一处没有释放的资源都可能经过日积月累,最后导致“千里之堤,毁于蚁穴”的灾难性后果,这个问题我们在第5章会专门介绍。(4)对于活动对象,RunL里应该处理尽量少的事件,从而快速地释放程序控件权,让其他的活动对象能够更快速地响应。这样不仅自己显得比较“绅士”,使操作系统的实时性更好,而且也是Symbian OS对于程序的基本要求。如果一个活动对象长久地占用程序控制权,可能会造成程序里某些请求没有在规定的时间内得到响应,从而造成程序错误。如果这样的问题发生在操作系统内部,系统为了保证实时性会尝试杀死程序并报告错误,严重时可能导致整个系统实时调度算法失效,操作系统发生严重错误并崩溃,具体内容请参考第9章活动对象的介绍。2.2 简洁的设计方案2.2.1 程序模块结构

前面介绍了Symbian应用程序设计原则,现在就让我们来应用这些原则构建程序。首先根据界面与逻辑分离原则,我们应该把程序划分成两个比较大的模块,一个是界面相关的部分,负责在手机屏幕上绘制游戏和接收用户的操作;另一个是逻辑相关的部分,就是游戏引擎,游戏内部状态和运行机制策略都在这部分。此外,由于逻辑部分并不关心界面相关的部分,为了做到独立性,逻辑部分的游戏模型和界面部分会有各自的游戏空间场景,并且这两个的大小是无关的。

这样在把逻辑部分的场景显示到界面的场景上时就可能发生错误,比如高度不一样、位置出现偏差等,为此我们在两个模块中间增加了一个转换模块,负责在界面显示转换和逻辑部分的模型空间之间相互转换,消除彼些间的差异,保证各个元素之间的位置相对性。游戏程序结构示意图如图2-1所示。但是考虑到本书主要面向入门读者,而且转换模块代码比较少,我们的程序里并没有把它独立出来,而是分拆开之后分别放到了界面和逻辑模块里面。图2-1 EasyBounce游戏程序结构示意2.2.2 界面模块

界面模块使用了S60的应用程序框架,是一个比较典型的视图切换结构。界面模块分为3部分,MainView是程序主界面,GameView是运行游戏时的视图,而RankView用于显示游戏排名,可参见第1章图1-2所示的画面。其中每个视图中都有一个容器控件,它的作用在第3章讲应用程序框架时会介绍。游戏视图里面的容器控件,不仅容纳了小球控件CEikImage,还实现了MGameObserver接口,用于从游戏引擎接收事件。游戏界面模块类示意如图2-2所示。图2-2 EasyBounce游戏界面模块类图

提醒注意

如果读者不是特别熟悉UML图,建议本章内容最好结合代码来看,或者跳过本章后面的部分,开始下一章节的学习,等需要看本书配带的EasyBounce程序时再学习本章。2.2.3 逻辑模块

逻辑模块中包含两个子模块游戏引擎和计分模块。游戏引擎用于运行游戏逻辑;计分模块主要用于维护用户的数据和保存管理游戏排名,它同界面模块类似实现一个引擎的接口,用来从引擎接收当前用户的游戏事件,并根据这些事件来计算用户的得分。游戏引擎里有小球和3条线,其中1条是用户画上去的弹绳,另外2条是游戏空间的左边界和右边界,小球撞上后都会发生弹性碰撞,如图2-3所示。

游戏引擎是一个状态机,分为4个状态:New、Over、Paused、Started,它们之间的转换关系如图2-4所示。图2-3 EasyBounce游戏引擎类图图2-4 EasyBounce游戏引擎状态转换图2.2.4 碰撞原理

当用户进入到游戏界面时,这时候会新建一个游戏引擎,并设置为New状态。接着进行游戏的初始化,设置加速度、小球的大小和位置、弹绳的位置等,并进入Started状态。在Started状态正常进行游戏时,引擎会根据加速度计算小球的速度,并根据原来的位置计算出新的位置。如果当前位置与弹绳相撞,假定都是完全弹性碰撞,就把小球的速度对弹绳的垂线做对称,其示意如图2-5所示。图2-5 EasyBounce游戏碰撞示意图2.2.5 重要的游戏行为

游戏视图提供暂停菜单,当用户单击时游戏暂停,切换到Paused状态,再次点击时恢复到Started状态运行。当用户失败后进入Over状态,否则继续从Started状态切换到自身运行。

当游戏正常运行时,一个正常的流程是,引擎从Started状态切换到自身,并计算新的数据,然后通知MGameObserver当前游戏状态发生了变化。在这里MGameObserver其实就是游戏视图的容器控件CEasyBounceGameContainer,接下来MGameObserver会从引擎当中查询数据并更新视图,过程如图2-6所示。图2-6 EasyBounce游戏视图更新序列图

如果用户发现小球快要落地,往屏幕上画线并把小球弹起来的过程是怎么实现的呢?用户通过屏幕和控件交互划线后,CEasyBounceGameContainer类会把用户画线的起始点从屏幕坐标转换成游戏引擎内的空间坐标(这部分功能本应该属于转换模块),之后发出一个画线命令,而接收者就是游戏引擎,这样一条线就画在了引擎中。而引擎又会通知控件游戏状态发生了变化,控件取得数据后又在屏幕上绘制了出来,过程如图2-7所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载