1、 目录1 绪论21.1 背景21.2 Android的崛起21.3 国内外研究现状31.4 项目研究的主要内容41.5 本章小结42 Android的开发环境42.1 Android操作系统42.2 Android开发环境42.3 Android开发环境变量的配置52.3.1 JDK的配置52.3.2 SDK的配置62.4 Eclipse的配置62.5 本章小结73 Android应用程序核心73.1 应用程序基础73.2 应用程序组件83.2.1 Acitivity83.2.2 Service93.2.3 BroadcastReciver103.2.4 ContentProvider123.
2、3 本章小结124 项目相设计134.1 研究目的134.2 需求分析134.3 游戏界面设置134.3.1 等登陆界面134.3.2 游戏主界面144.3.3 玩家升级Pk与做任务的界面144.3.4 购买物品与地产的界面144.3.5 玩家之间的聊天界面与发送系统消息与世界消息的界面154.4 游戏体系设计155 计代码的实现165.1客户端与服务器的交互165.2用户与用户之间聊天的实现175.3 挑战列表的实现226 结论30致 谢311 绪论1.1 背景3G(第三代数字通讯技术)正离我们的生活越来越近,它的到来必将掀起一阵无线通讯的新浪潮,3G是向未来个人通信演进的一个重要发展阶段,
3、具有里程碑和划时代的意义。说到3G不能不谈到Android,1Android是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统。它包括一个操作系统,中间件和一些重要的应用程序。它采用软件堆层(Software Stack,又名软件叠层)的架构,主要分为三部分。底层以Linux内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Library和Dalvik虚拟机,由C+开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。不存在任何以往阻碍移动产业创新的专有权障碍,号称是首个为移动终端打造的真正开放
4、和完整的移动软件。这里,可以把android看作是一个类似于windows的操作系统。学习android平台下的软件开发正如以前学习windows平台下的软件开发一样。1在国内,android的前景十分广阔,国内很多的厂商和运营商也纷纷加入了android阵营,包括中国移动,中国联通,华为通讯,联想等大企业。同时android应用的范围不仅仅在手机,国内一些厂家也陆续推出了采用android系统的MID产品,比较著名的包括由Rockchip和蓝魔推出的同时具备高清播放和智能系统的音悦汇W7,我们可以预见android也将会被广泛应用在国产智能上网设备上,将进一步扩大Andorid系统的应用范围
5、。1.2 Android的崛起【2】Android操作系统是Google最具杀伤力的武器之一。苹果以其天才的创新,使得iphone在全球迅速拥有了数百万忠实粉丝,而Android作为第一个完整的,开放,免费的手机平台,使开发者在为其开发程序时拥有更大的自由。与Windows,Symbian等厂商不同的是,Android操作系统免费向开发人员提供,这样可节省近三成的成本,得到了众多厂商和开发者的拥护。【2】最早进入Android市场的宏达已经陆续在一年内推出了G1,Magic,Hero,Tatto等4款手机,三星也在2010年推出了Galaxyi7500,连摩托罗拉也推出了新款Android手机
6、Cliq,中国移动也以Android为基础开发了Ophone平台。这些发展证明Android已成为只能手机市场的重要发展趋势。32010年是android平台飞速发展的一年。据报道显示,2011年8月Android已占据了全球智能手机市场的半壁江山;而作为世界上零售领域最庞大的智能手机卖家苹果公司,也以其iOS操作系统控制了五分之一的市场。换言之,Android和iOS加起来在全球智能手机市场上占据了三分之二的绝大多数市场份额。Android已经在智能手机操作系统上占据着主导地位。这不难解释,毕竟这样一个完全免费并开放源代码的平台对于许多制造商来说都极具吸引力。包括HTC、Samsung、Ac
7、er、Sony Ericsson、LG、Motorola等等一系列厂商都对其投入了极大地关注和合作。3因此,2011年6月Google宣称其每天激活50万Android设备,我们对这一消息并不会感到十分吃惊。这一数据虽然也包括平板电脑在内,但即便是这样,它也仍然非常可观。它不仅仅显示了Android在制造商和消费者间的普及度,同时还标志着智能手机正在成为如今社会不可缺少的一部分。Andy是一个有远见的人,早在2003年他就看到了Android2005年的起步和被Google的收购,也看到了系统的进步和新的机型的快速的发布。所有的这一切都让我们相信,Android走向世界第一移动操作系统的宝座的
8、步伐是势不可挡的,Android可能真的会继续带着我们走向移动设备梦想的彼岸。1.3 国内外研究现状Android 包括操作系统、用户界面和应用程序 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。Google与开放手机联盟合作开发了 Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达电和 T-Mobile 在内的 30 多家技术和无线应用的领军企业组成。Google通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。【4】Android 作为谷歌企业战
9、略的重要组成部分,将进一步推进随时随地为每个人提供信息这一企业目标的实现。我们发现,全球为数众多的移动电话用户从未使用过任何基于 Android 的电话。谷歌的目标是让(移动通讯)不依赖于设备甚至平台。出于这个目的,Android 将补充,而不会替代谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商结成合作伙伴,开发既有用又有吸引力的移动服务,并推广这些产品。【4】开放手机联盟的成立和 Android 的推出是对现状的重大改变,在带来初步效益之前,还需要不小的耐心和高昂的投入。但是,谷歌也在不断努力,让这些服务变得更好,同时也将添加更有吸引力的特性、应用和服务。1.4 项目
10、研究的主要内容此游戏主要用到了Android用来画图的API,主类继承view类,重写其onDraw()方法并另起一个线程对主UI线程更新,实现整个游戏的动态效果。其中自己写了很多算法来实现一些炫酷的效果。游戏主体框架的构思,分为8大部分: com.hkdg.animation用来存放游戏中所用到的对ani动画的初始化及播放的类。 com.hkdg.game主要用来存放从服务器解析过来的数据,也包括读取的本地数据。 com.hkdg.game.Music用来存放游戏中音乐,音效的初始化及播放的类。 com.hkdg.game.Object游戏中所用到的所有实体类存放在此。 com.hkdg.g
11、ame.View游戏UI由若干自定义View组成,所有的View类存放于此。 com.hkdg.GameEngine此包中主要存放的是一个继承了View的类,它另起了一个线程用来绘制界面,并同时更新主UI线程。 com.hkdg.Main这是一个存放着几个Activity的包,游戏中为数不多的几个activity都存放于此。 com.hkdg.tools这是一个存放着工具类的工具包。1.5 本章小结本章主要对Android的发展历程以及对本游戏内容进行了简单的阐述,为Android开发者提供一个参考。2 Android的开发环境2.1 Android操作系统目前只支持XP(32-bit)、Vi
12、sta(32/64-bit)、Mac OS X 10.4.8或更新版本(x86),Linux(只在Linux Ubuntu Dapper Drake上面做过测试)。 系统XP sp2/sp3 32bit 来做讲解,其他系统的可以google一下差异,反正都大同小异的。2.2 Android开发环境建议使用eclipse进行开发,当然,eclipse版本要在3.3以上,这是官方说法,3.3以下我也没测过,3.3 (Europa)、3.4 (Ganymede) 都可以java版本或者EE版本也都没问题的,可以到eclipse官方下载最新版本。因为开发是基于java的,所以jdk是少不了的,jdk要
13、求是5.0或者6.0,我还是用5.0比较多,可以到sun官方下载。2.3 Android开发环境变量的配置2.3.1 JDK的配置首先要到sun官方下载jdk,注意的是下载jdk而不是下载jre,因为jre是提供java的运行环境而不是开发环境。sun官方网站是: 下载后安装是下的解压包那就解压到某目录,例如解压到是C:Program FilesJavajdk1.5.0_14 右键点击我的电脑 - 属性 - 高级,点击下面的环境变量,在下面的“系统变量”处选择新建在变量名处输入 JAVA_HOME变量值中输入刚才的目录,比如C:Program FilesJavajdk1.5.0_14 。效果如
14、图2-1所示:图2-3-1-1 进入环境变量确定后再新建一个变量名为classpath,变量值为 %JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/tools.jar , 确定后找到PATH的变量,双击或点击编辑,在变量值最前面加上%JAVA_HOME%/bin; 注意里面的是,确定、确定、确定后即可。具体如下图2-2所示图2-3-1-2 环境变量的配置然后开始 - 运行 cmd,输入java或者javac看看有没有效果,如果出来一大堆其它的东西,那就好了,如果出现类似xxx不是内部或者是外部命令之类的,那就说明你的设置有问题,看看那里出问题然后加以改正。2.3.2
15、 SDK的配置因为我们要开发的android应用程序,所以下的sdk是Google那里下载,地址在 以后更新后估计地址会变,所以大家可以从 然后同样要设置环境变量,同jdk设置,新建一个SDK_HOME,值为D:SDKandroid-sdk-windows-1.5_r3android-sdk-windows-1.5_r3 ,然后找到path,在前面加上%SDK_HOME%tools; 就OK了。和jdk一样,我们也可以测试一下环境变量是否设置成功,cmd窗口中输入android,出现一堆东西,就完成了。2.4 Eclipse的配置当然,以上都搞定后,还不能马上用eclipse开发android
16、应用程序,还必须添加eclipse插件才行,幸好这步骤非常轻松,打开eclipse后,点击菜单栏的help - install new software. 然后点击Add会出来一个Add Site的窗口,这里Name输入android(自己取个就是了),location中输入插件的网络地址: https:/dl- DDMS 和 Android Development Tools都选中,finish就可以了,可能有段时间会去计算插件占用资源情况,慢慢等会。完成后会提示重启eclipse来加载插件,ok重启,就可以用了。2.5 本章小结本章将主要介绍如何构建Android开发环境,包括获取Andr
17、oid SDK、Eclipse以及进行Android Eclipse插件设置等。3 Android应用程序核心3.1 应用程序基础Android的应用程序全部都是用Java编程语言所写的。编译后的Java代码包括应用程序要求的任何数据和资源文件,是通过aapt工具捆绑成一个Android包,归档文件是以.apk为后缀。这个文件是分发应用程序和安装到移动设备的中介或者是工具,用户下载这个文件到他们自己的设备上。一个.apk文件中的所有代码就会被认为是一个应用程序。 aapt是Android Asset Packaging Tool的首写字母的缩写,这个工具包是含在SDK的tools/目录下的。查
18、看、创建、更新与zip兼容的归档文件(zip、jar、apk)。它也能将资源文件编译成二进制包。 虽然你可能不会经常直接使用appt,但构建脚本(build scripts)和IDE插件会使用这个工具打包成apk文件,构成一个Android的应用程序。 下面是更详细的使用细节,5首先打开一个终端,进入tools/目录下,运行命令: Linux或Mac操作系统:./aapt ,如果是Windows:aapt.exe 。在这里注意的是:tools/目录指的是android SDK目录下的/platforms/android-X/tools/。在很多的方面,每个Android的应用程序是生活在它自己
19、的世界。默认的情况下,任何一个应用程序是运行在它自己的Linux进程中。而当应用程序中的任何代码需要被执行时候,Android将启动进程;当它不再需要和系统资源不会被其他应用程序所请求时,Android就会关闭这个进程。每一个应用程序都有自己的Java虚拟机(VM),所以应用程序的代码是独立于其他所有的应用程序代码的运行。在默认情况下,每一个应用程序分配一个唯一的Linux用户ID。权限被设置为每一个应用程序的文件仅对用户和应用程序自己本身可见。虽然有一些方法也可以暴露他们给其他应用程序。也有可能的是设置两个应用程序共享一个用户ID,这种情况下,他们能够看到对方的文件。为了节省系统资源的占用,
20、具有相同ID的应用程序最好可以安排在同一个Linux进程中,共享同一个VM。53.2 应用程序组件3.2.1 AcitivityActivity是Android组件中最基本也是最为常见的组件,在一个Android应用中,一个Activity通常就是一个单独的屏幕。当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:void onCreate(Bundle savedInstanceState)void onStart()void onRestart()void onResume()void onPause()void onStop()void onDestroy(
21、)【6】下图为Activity的生命周期图示:图3-2-1 Activity的生命周期图示6在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用onSaveInstanceState ()方法保存的状态信息。onStart :该方法的触发表示所属活动将被展现给用户。onResume :当一个活动和用户发生交互的时候,触发该方法。onPause :当一个正在前台运行的活动因为
22、其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。onStop :当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。onR
23、estart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。onDestroy :当活动销毁的时候,触发该方法。和onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。3.2.2 ServiceService是一种长生命周期,没有用户界面的程序。Service是android 系统中的一种组件,它跟Activity的级别差
24、不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service的启动有两种方式:context.startService()和context.bindService()。【7】使用context.startService() 启动Service是会经历:context.startService() -onCreate()- onStart()-Service running context.stopService() | -onDestroy() -Service stop如果Service还没有运行,则android先调用onCreate()然后调用onStart();如
25、果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 所以调用startService的生命周期为:onCreate - onStart(可多次调用) - onDestroy 使用使用context.bindService()启动Service会经历: context.bindService()-onC
26、reate()-onBind()-Service running onUnbind() -onDestroy() -Service stop onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind-onDestroy相应退出。所以调用bindService的生命周期为:onCreate - onBind(只一次,不可多次绑定) - onUnbind - onDestory。在
27、Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。【7】3.2.3 BroadcastReciverBrodcastReciver是为了实现系统广播而提供的组件。在android下,要想接受广播信息,那么这个广播接收
28、器就得我们自己来实现了,我们可以继承BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写BroadcastReceiver里面的onReceiver方法,当来广播的时候我们要干什么,这就要我们自己来实现。具体的代码:public class SmsBroadCastReceiver extends BroadcastReceiver Override public void onReceive(Context context, Intent intent) Bundle bundle = intent.getExtras(); /这里写你要做的事情 我们
29、可以把广播接收器注册到系统里面,可以让系统知道我们有个广播接收器。这里有两种,一种是代码动态注册:/生成广播处理 smsBroadCastReceiver = new SmsBroadCastReceiver(); /实例化过滤器并设置要过滤的广播 IntentFilter intentFilter = new IntentFilter(android.provider.Telephony.SMS_RECEIVED); /注册广播 BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, intentFilter
30、); /onDestroy要注销广播 调用unregisterReceiver(.)函数; 一种是在AndroidManifest.xml中配置广播 两种注册类型的区别是:1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。3.2.4 ContentProviderContentProvider可以实现不同组件之间的数据共享。ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
31、1、ContentProvider使用表的形式来组织数据 无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格2、ContentProvider提供的方法 query:查询 insert:插入 update:更新 delete:删除 getType:得到数据类型 onCreate:创建数据时调用的回调函数3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中二、ContentProvide
32、r的内部原理自定义一个ContentProvider,来实现内部原理步骤:1、定义一个CONTENT_URI常量(里面的字符串必须是唯一)Public static final Uri CONTENT_URI = Uri.parse(content:/com.WangWeiDa.MyContentprovider);如果有子表,URI为:Public static final Uri CONTENT_URI = Uri.parse(content:/com.WangWeiDa.MyContentProvider/users);2、定义一个类,继承ContentProviderPublic cl
33、ass MyContentProvider extends ContentProvider3.3 本章小结本章将会详细叙述Android的应用程序所包括的基本组件,还有这些组件之间的沟通方式Intent(除了Contentprovider),同时讲解一下Android应用程序的生命周期(Activity)这是其他智能收与Android手机平台最显著不同的地方。最后将介绍在Android的应用程序中如何利用下载外部资源。4 项目相设计4.1 研究目的(1) 了解Android网络游戏的设计,开发过程和后期的项目维护;(2) 了解smartFoxServer的使用和其API的使用;(3) 能够更加
34、熟练的使用开发软件与真机调试4.2 需求分析通过与多位玩家进行全面深入地探讨和分析,并完成江湖行-风云再现市场的前期调查后,提出了游戏需求分析说明书。此需求分析说明书对江湖行-风云再现游戏做了全面细致的用户需求分析,明确所要开发的游戏软件应具有的功能、性能与界面,使系统分析人员及软件开发人员能清楚地了解玩家的需求,并在此基础上进一步提出概要设计说明书和完成后续设计与开发工作。本说明书的预期读者为客户、业务或需求分析人员、测试人员、用户文档编写者、项目管理人员。4.3 游戏界面设置江湖行-风云再现这款Android系统下的手机网络游戏,简单易于操作,交互性好,界面美观布局清晰,大致分为5个部分:
35、4.3.1 等登陆界面登陆界面主要是实现玩家的登陆,注册,及修改资料功能4.3.2 游戏主界面游戏主界面主要是对游戏的整体画面与游戏功能绘制4.3.3 玩家升级Pk与做任务的界面玩家主要是通过与别的玩家pK和做任务来升级 4.3.4 购买物品与地产的界面玩家可以通过在武器店购买装备来提升自己的战斗力,也可以在黑点里花钱买元宝和恢复血,能力和气,玩家可以在生意那里购买地产来赚得额外的银两 4.3.5 玩家之间的聊天界面与发送系统消息与世界消息的界面主要是实现玩家之间的聊天与在系统频道和世界频道发送要显示的消息 4.4 游戏体系设计此软件主要针对客户端设计的,由于玩家的登陆,将玩家信息存进服务器,
36、通过smartFoxServer来进行客户端与服务器的交互,具体实现是客户端发出请求指令并传送相关信息,服务器发出回复指令并返回对应信息给用户。将玩家的消息,在游戏界面上显示给玩家看,玩家可以选择不同的操作,来向服务器发出不同的指令,服务器根据玩家发来的不同指令对应着不同的接口,然后相应的的给予回复。5 计代码的实现5.1客户端与服务器的交互通过smartFoxServer来进行交互的,用户发出请求指令和信息,服务器响应发出回复指令和信息public SmartFox sfsClient;public void initSmartFox() /服务器的初始化和销毁sfsClient = new
37、 SmartFox(true);sfsClient.setDebug(false); sfsClient.addEventListener(SFSEvent.CONNECTION,this); sfsClient.addEventListener(SFSEvent.CONNECTION_LOST, this);sfsClient.addEventListener(SFSEvent.LOGIN, this);sfsClient.addEventListener(SFSEvent.ROOM_JOIN, this);sfsClient.addEventListener(SFSEvent.EXTENS
38、ION_RESPONSE, this);public void destroy() if (sfsClient != null) sfsClient.removeEventListener(SFSEvent.CONNECTION, this);sfsClient.removeEventListener(SFSEvent.CONNECTION_LOST, this);sfsClient.removeEventListener(SFSEvent.LOGIN, this);sfsClient.removeEventListener(SFSEvent.ROOM_JOIN, this);sfsClien
39、t.removeEventListener(SFSEvent.HANDSHAKE, this);sfsClient.disconnect();客户端向服务器发送请求指令实现的方法(买物品的请求)Public void requestBuyProduct(int productID,int productType)ISFSObject params = new SFSObject();params.putLong(Keys.PLAYER.PLAYERID, GameData.roleData.id);params.putInt(Keys.PRODUCTID, productID);params.
40、putInt(Keys.TYPE, productType);sfsClient.send(new ExtensionRequest(SRequest.NdBuyProduct,params);game.gameView.sleep(200);服务器响应客户端发出指令实现的方法public void responsePickUpEveryDay()/获取游戏币ISFSObject io = NdObj.getSFSObject(SResponse.UPDATE_PLAYER);String tip = io.getUtfString(Keys.HINT);GameData.roleData.l
41、ogin+;if(tip.length() 0)game.gameView.loadProgress.sendMessage(LoadProgress.ShowText, tip);GameData.roleData.totalGold = io.getLong(Keys.PLAYER.GOLD);SFSConnect.isGetLogin = false;5.2用户与用户之间聊天的实现本段代码主要是实现用户与用户之间的聊天功能以及聊天内容的绘制,用户发送信息给其他用户时,系统先调用发送信息指令向服务器发送请求,并将用户的信息以及用户的个人信息保存在本地,服务器接受到指令后,根据用户信息的内容
42、(主要是对方ID)将发出响应指令给对方,本地保存的信息也一并发给对方。public class PersonChatView private Vector letters=new Vector();private int screenH;private int onTouchY;private Bitmap inputWindow;private Bitmap sendIcon;private GamePlay game;private CRect inputRect = new CRect();private CRect sendRect = new CRect();private CRect contentRect = new CRect();private lon