无线点菜系统

更新时间:2024-05-15 19:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

论文题目: 基于Android的无线点菜系统

摘要

安卓是一种基于LINUX平台的开源手机操作系统,由操作系统、中间件、用户界面、应用软件组成,是首个为移动终端打造的真正的开放和完整的软件平台。Android平台以其方便的硬件交互能力、优秀的内存管理能力和丰富的界面控件赢得了广大发者的青睐。 传统的酒店点菜需要定制纸质的菜单,还需要专业的点菜人员,造成不必要的资源浪费。本设计针对于高级酒店的需求,利用安卓系统的终端完成点菜过程。点菜客户端,在安卓系统架构上利用其自带的开发组件如Activity,Intent等编写程序,完成显示菜品、提供选择菜品功能,终端的画面清新,加入适当的图片多媒体技术将菜品以一种高雅现代的方式展现给顾客,适中的高清液晶触摸屏及人性化的界面设计,既满足了顾客浏览的便利性与自助点菜的需求,又无声地提高了酒店的现代化形象及档次。在通信部分,我们选择安卓系统支持的socket通信将点菜信息发送到厨房服务器端,整个过程实现智能、无纸、节省人力等众多优点。融合了传统菜谱与现代信息化无线点菜于一体,为用户创造最佳的电子体验。

【关键词】Android、Java、Eclipse、xml 【论文类型】应用型

目录

1、绪论 ...................................................................................................................................................... 4

1、1 引言 .................................................................................................................................................... 4 1、2 课题研究背景与现状 ........................................................................................................................ 4 1、3 主要研究内容 .................................................................................................................................... 4

1、3、1 Android界面风格设计 ................................................................................................................... 5 1、3、2 数据库设计 ..................................................................................................................................... 5 1、3、3 Socket通信设计 .............................................................................................................................. 5 1、4 论文组织与安排 ........................................................................................................................................ 5

2、 Java语言介绍 .................................................................................................................................... 6

2、1 JAVA语言概述 .................................................................................................................................. 6 2、2 JAVA语言基本语法 .......................................................................................................................... 6

3、 Android平台介绍 .............................................................................................................................. 9

3、1 安卓历史及介绍 ................................................................................................................................ 9 3、2 安卓发展及现状 ................................................................................................................................ 9 3、3 安卓版本介绍及支持 ........................................................................................................................ 9 3、4 安卓系统构架 .................................................................................................................................. 14 3、5 安卓组件介绍 ................................................................................................................................... 18

3、5、1 Activity .......................................................................................................................................... 18 3、5、2 Service ........................................................................................................................................... 19 3、5、3 BroadcastReceiver ......................................................................................................................... 20 3、5、4 Content Provider ............................................................................................................................ 20

4、 基于Android 的无线点菜系统的实现 ..........................................................................................22

4、1 界面设计 ........................................................................................................................................... 22

4、1、1 xml控件介绍 ................................................................................................................................ 22 4、1、2 本设计借助view类中的控件 ...................................................................................................... 22 4、1、3 本设计中涉及的控件.................................................................................................................... 23 4、1、4 本设计编写的主要*.xml文件 ..................................................................................................... 23

4、2 数据库设计 ....................................................................................................................................... 23 4、3 SOCKET通信设计 ............................................................................................................................ 24

4、3、1 Socket的概念................................................................................................................................ 24 4、3、2 套接字类型 ................................................................................................................................... 24

4、4 系统与上位机调试 ........................................................................................................................... 25

5、 总结与展望 ......................................................................................................................................26 致谢 ..........................................................................................................................................................27 参考文献 ..................................................................................................................................................28

1、绪论

1、1 引言

Android一词的本义指“机器人”,是一种以Linux为基础的开放源码操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件,主要使用于便携设备。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。

1、2 课题研究背景与现状

传统的酒店点菜需要定制纸质的菜单,还需要专业的点菜人员,造成不必要的资源浪费。本设计Android点菜是一款融合传统菜谱与无线点菜信息化于一体的电子点菜设备,是餐饮业的一项重大革新。他的画面清新,加入适当的图片多媒体技术将菜品以一种高雅现代的方式展现给顾客, 适中的高清液晶触摸屏及人性化的界面设计,既满足了顾客浏览的便利性与自助点菜的需求,又无声的提高了酒店的现代化形象及档次;产品无论从外 观、尺寸、重量都比同类产品更具优势,更接近与传统菜谱,是能够让餐厅真正放心作为菜谱使用的一款电子菜谱;实时的菜品更新功能及海量的信息展示功能,不再需要花费资源浪费在专门点菜的服务人员上,使餐厅节省了大量的人力、菜谱、菜牌、手工单等各项高昂的、没完没了的制作费用,解决了传统菜谱短时间内就出现脏、乱、差的问题;电子菜谱,实现了餐厅无纸化的操作,提升了酒店的档次及形象。

1、3 主要研究内容

本次设计主要研究了三个方向的问题:Android基本界面的设计、数据库设计和Socket通信设计。

1、3、1 Android界面风格设计

界面风格设计主要是设计用户界面,力求使用户使用起来简单方便,易于学习,便于操作。

本次设计的界面部分主要分为以下几个:

(1)登陆界面:用于用户登录点菜系统。不同用户拥有不同的权限,可以对系统进行相应的操作。

(2)系统点菜主界面:让用户可以自由选择所想要点的菜。分为套餐、特色菜、菜谱和酒水四个列表。

(3)菜品介绍界面:让客户完整了解所选菜品有关信息。

(4)数据库界面:完成对菜品的增删改查功能,同时显示菜单。方便修改和统计。 (5)绘图界面:根据一段时间的统计,了解客户最喜爱的几种菜品。 (6)Socket通信界面:将点好的菜单发送给上位机,使后台清楚客户需求。

1、3、2 数据库设计

数据库记录的客户所点菜品的信息,Socket通信时也需要从中提取数据进行通信。实现数据库的功能是本设计能实现的一个重要保障。

数据库部分分为以下几个部分:Data.java 、DataBaseSystem.java 、mydb.java 、 userdio.java 。同时根据需要,为了实现绘图和界面显示,配合编写了以下程序:GameView.java、Quxian.java、StaticInterface.java、database.xml和staticinterface.xml。

1、3、3 Socket通信设计

Socket通信部分主要实现了Android手持客户端与服务器的通信。这一部分为此设计的最核心部分,只有客户端和服务器端能够实现通信,才意味着整个设计基本完成。

Socket通信部分程序主要体现在configure.java中。

1、4 论文组织与安排

本文共分为5章,第一章是绪论,主要叙述了本文了研究背景和现状以及本文主要的研究内容。第二章和第三章分别介绍了设计所需的Java语言和Android平台。第四章具体介绍本安卓点菜系统设计的具体编译和开发。第五章对整个设计过程进行了总结和展望。

2、Java语言介绍

Android开发所用的语言是Java语言,所以再详细介绍设计之前有必要首先介绍一下Java语言。

2、1 Java语言概述

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

编程语言的风格十分接近C、C++语言。Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java SE 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

2、2 Java语言基本语法

Java作为一种独立的编程语言,包括一些基本的语法概念: final类:为防止他人从你的类上派生新类,此类是不可扩展的。 动态调用比静态调用花费的时间要长。

多态类:在java中,对象变量是多态的。而java中不支持多重继承。 抽象类:规定一个或多个抽象方法的类本身必须定义为abstract。 例:public abstract string getDescripition

Java中的每一个类都是从Object类扩展而来的。 object类中的equal和toString方法。

equal用于测试一个对象是否同另一个对象相等。

toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示。

(toString 方法是一个很重要的方法)

通用编程:任何类类型的所有值都可以同object类型的变量来代替。 封装:就是把数据和行为结合起在一个包中)并对对象使用者隐藏数据的实现过程,一个对象中的数据叫他的实例字段(instance field)。

重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载。编译器必须挑选出调用哪个方法。

数组列表:ArrayList动态数组列表,是一个类库,定义在java.util包中,可自动调节数组的大小。

class类 object类中的getclass方法返回class类型的一个实例,程序启动时包含在main方法的类会被加载,虚拟机要加载他需要的所有类,每一个加载的类都要加载它需要的类。 Java与C/C++的差异

熟悉C语言和C++语言的读者一定想搞清楚这个问题,实际上,Java确实是从C语言和C++语言继承了许多成份,甚至可以将Java看成是类C语言发展和衍生的产物。比如Java语言的变量声明,操作符形式,参数传递,流程控制等方面和C语言,C++语言完全相同.尽管如此,Java和C语言,C++语言又有许多差别,主要表现在如下几个方面:

1) Java中对内存的分配是动态的,它采用面向对象的机制,采用运算符new为每个对象分配内存空间,而且,实际内存还会随程序运行情况而改变。程序运行中 Java系统自动对内存进行扫描,对长期不用的空间作为”垃圾”进行收集,使得系统资源得到更充分地利用.按照这种机制,程序员不必关注内存管理问题,这使Java程序的编写变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。而C语言通过malloc()和free()这两个库函数来分别实现分配内存和释放内存空间的,C++语言中则通过运算符new和delete来分配和释放内存。在C和C++这种机制中,程序员必须非常仔细地处理内存的使用问题。一方面,如果对己释放的内存再作释放或者对未曾分配的内存作释放,都会造成死机;而另一方面,如果对长期不用的或不再使用的内存不释放,则会浪费系统资源,甚至因此造成资源枯竭。

2) Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量的功能。

3) Java不用goto语句,而是用try-catch-finally异常处理语句来代替goto语句处理出错的功能。

4) Java不支持头文件,而C和C++语言中都用头文件来定义类的原型,全局变量,库函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。 5) Java不支持宏定义,而是使用关键字final来定义常量,在C++中则采用宏定义来实现常量定义,这不利于程序的可读性。

6) Java对每种数据类型都分配固定长度。比如,在Java中,int类型总是32位的,而在C和C++中,对于不同的平台,同一个数据类型分配不同的字节数,同样是int类型,在PC机中为二字节即16位,而在VAX-11中,则为32位.这使得C语言造成不可移植性,而Java则具有跨平台性(平台无关性)。

7) 类型转换不同。在C和C++中,可通过指针进行任意的类型转换,常常带来不安全性,而在Java中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换。

8) 结构和联合的处理。在C和C++中,结构和联合的所有成员均为公有,这就带来了安全性问题,而在Java中根本就不包含结构和联合,所有的内容都封装在类里面。

9) Java不再使用指针。指针是C和C++中最灵活,也最容易产生错误的数据类型.由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性。而Java对指针进行完全地控制,程序员不能直接进行任何指针操作。

10)避免平台依赖。Java语言编写的类库可以在其它平台的Java应用程序中使用,而不像C++语言必须依赖于Windows平台。

3、Android平台介绍

3、1 安卓历史及介绍

Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)

在1886年发表的科幻小说《未来夏娃》中。他将外表像人的机器起名为Android。 - 安卓最早由高科技Andy Rubin公司研发,Andy Rubin创立了两个手机操作系统公司:Danger和Android。Danger 5亿美元卖给微软,今年成为了Kin,Android4千万美元卖给Google。

Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。

3、2 安卓发展及现状

2008年9月22日,美国运营商德国T-Mobile在纽约正式发布第一款Android手机——T-Mobile G1。该款手机为台湾宏达电(HTC)代工制造,是世界上第一部使用Android操作系统的手机,支持WCDMA/HSPA网络,理论下载速率 7.2Mbps,并支持Wi-Fi。2009年10月28日正式发布了Android 2.0 智能手机操作系统。2010年1月7日,Google在其美国总部正式向外界发布了旗下首款合作品牌手机Nexus One(HTC G5),并同时开始对外发售。2010年5月20日,Android 2.2“冻酸奶”(Froyo)的SDK发布。市场份额增至17.7 10年12月6日,Android 2.3“姜饼”(Gingerbread)的SDK发布。 2011年2月22日,Android 3.0“蜂巢”(Honeycomb)的SDK发布。2011年5月,谷歌宣布将推出“冰激凌三明治”,此时Android的市场份额已达22.2%。2011年7月,Android 3.2的SDK发布。2011年8月15日,谷歌125亿美元收购摩托罗拉移动,将Android系统又推向新的高潮。

3、3 安卓版本介绍及支持

Android在正式发行之前,最开始拥有两个内部测试版本,并且以著名的机器人名称来对其进行命名,它们分别是:阿童木(Android Beta),发条机器人(Android 1.0)。后来由于涉及到版权问题,谷歌将其命名规则变更为用甜点作为它们系统版

本的代号的命名方法。甜点命名法开始于 Android 1.5 发布的时候。作为每个版本代表的甜点的尺寸越变越大,然后按照26个字母数序:纸杯蛋糕(Android 1.5),甜甜圈(Android 1.6),松饼(Android 2.0/2.1),冻酸奶(Android 2.2),姜饼(Android 2.3),蜂巢(Android 3.0),冰激凌三明治(Android 4.0),根据最新消息新一代Android版本将命名为果冻豆(Jelly Bean)。 Android1.1 2008年9月发布的Android第一版 Android 1.5 Cupcake(纸杯蛋糕)

2009年4月30日,官方1.5版本(Cupcake 纸杯蛋糕)的Android发布。主要的更新如下:

1)拍摄/播放影片,并支持上传到Youtube 2)支持立体声蓝牙耳机,同时改善自动配对性能

3)最新的采用WebKit技术的浏览器,支持复制/贴上和页面中搜索 4)GPS性能大大提高 5)提供屏幕虚拟键盘

6)主屏幕增加音乐播放器和相框widgets 7)应用程序自动随着手机旋转

8)短信、Gmail、日历,浏览器的用户接口大幅改进,如Gmail可以批量删除邮 件

9)相机启动速度加快,拍摄图片可以直接上传到Picasa 10)来电照片显示

Android 1.6Donut(甜甜圈)

2009年9月15日,1.6(Donut 甜甜圈)版本软件开发工具包发布。 主要的更新如下:

1)重新设计的Android Market手势 2)支持CDMA网络

3)文字转语音系统(Text-to-Speech) 4)快速搜索框 5)全新的拍照接口 6)查看应用程序耗电

7)支持虚拟私人网络(VPN) 8)支持更多的屏幕分辨率

9)支持OpenCore2媒体引擎

10)新增面向视觉或听觉困难人群的易用性插件 Android2.0/2.0.1/2.1Eclair(松饼)

2009年10月26日,2.0(Eclair 松饼)版本软件开发工具包发布。 主要的更新如下: 1)优化硬件速度 2)\程序 3)支持更多的屏幕分辨率 4)改良的用户界面

5)新的浏览器的用户接口和支持HTML5 6)新的联系人名单

7)更好的白色/黑色背景比率 8)改进Google Maps3.1.2 9)支持Microsoft Exchange 10)支持内置相机闪光灯 11)支持数码变焦 12)改进的虚拟键盘 13)支持蓝牙2.1 14)支持动态桌面的设计 Android 2.2/2.2.1Froyo(冻酸奶)

2010年5月20日,2.2(Froyo 冻酸奶)版本软件开发工具包发布。主要的更新如下:

1)整体性能大幅度的提升 2)3G网络共享功能。 3)Flash的支持。 4)App2sd功能。 5)全新的软件商店。

6)更多的Web应用API接口的开发。 Android 2.3Gingerbread(姜饼)

2010年12月7日,2.3(Gingerbread 姜饼)版本软件开发工具包发布。主要的更新如下:

1)增加了新的垃圾回收和优化处理事件

2)原生代码可直接存取输入和感应器事件、EGL/OpenGLES、OpenSL ES 3)新的管理窗口和生命周期的框架

4)支持VP8和WebM视频格式,提供AAC和AMR宽频编码,提供了新的音频效果器

5)支持前置摄像头、SIP/VOIP和NFC(近场通讯) 6)简化界面、速度提升 7)更快更直观的文字输入 8)一键文字选择和复制/粘帖 9)改进的电源管理系统 10)新的应用管理方式

Android 3.0Honeycomb(蜂巢)

2011年2月2日,3.0(Honeycomb 蜂巢)版本主要更新如下: 1)优化针对平板

2)全新设计的UI增强网页浏览功能 3)n-app purchases功能 Android 3.1Honeycomb(蜂巢)

2011年5月11日在Google I/O开发者大会宣布发布,版本主要更新如下: Honeycomb蜂巢(改进3.0BUG) 1)经过优化的Gmail电子邮箱 2)全面支持GoogleMaps

3)将Android手机系统跟平板系统再次合并从而方便开发者 4)任务管理器可滚动,支持USB 输入设备(键盘、鼠标等) 5)支持Google TV.可以支持XBOX 360无线手柄

6)widget支持的变化,能更加容易的定制屏幕widget插件 Android 3.2Honeycomb(蜂巢)

2011年7月13日发布,版本更新如下: 1)支持7英寸设备

2)引入了应用显示缩放功能

Android 4.0 Ice Cream Sandwich(冰激凌三明治)

2011年10月19日在香港发布,4.0(Ice Cream Sandwich 冰激凌三明治)版本主要更新如下: 1)全新的ui

2)全新的Chrome Lite浏览器,有离线阅读,16标签页,隐身浏览模式等 3)截图功能

4)更强大的图片编辑功能

5)自带照片应用堪比Instagram,可以加滤镜、加相框,进行360度全景拍摄,照片还能根据地点来排序

6)Gmail加入手势、离线搜索功能,UI更强大

7)新功能People:以联系人照片为核心,界面偏重滑动而非点击,集成了Twitter、Linkedin、Google+等通讯工具。有望支持用户自定义添加第三方服务 8)新增流量管理工具,可具体查看每个应用产生的流量 9)正在运行的程序可以像电脑一样的互相切换 10)人脸识别功能,同时前置摄像头可以进行面部解锁 11)系统优化、速度更快

12)支持虚拟按键,手机可以不再拥有任何按键 13)更直观的程序文件夹 14)平板电脑和智能手机通用 15)支持更大的分辨率

16)专为双核处理器编写的优化驱动 17)全新的Linux内核 18)增强的复制粘贴功能 19)语音功能 20)全新通知栏

21)更加丰富的数据传输功能 22)更多的感应器支持 23)语音识别的键盘

24)全新的3D驱动,游戏支持能力提升 25)全新的谷歌电子市场 26)增强的桌面插件自定义

Android 5.0 Jelly Bean(果冻豆),继“冰激凌三明治”之后的下一版Android系统。

3、4 安卓系统构架

Android的系统架构和其它操作系统一样,采用了分层的架构。android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。 Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。

在Android中,开发者可以使用Java作为编程语言来开发应用程序,也可以通过NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其他各种脚本语言进行编程(如:python、lua、tcl、php等等),还有其他诸如:Qt(qt for android)、Mono(mono for android)等一些著名编程框架也开始支持Android编程,甚至通过MonoDroid,开发者还可以使用C#作为编程语言来开发应用程序。另外,谷歌还在2009年特别发布了针对初学者的Android Simple语言,该语言类似Basic语言。而在网页编程语言方面,JavaScript,ajax,HTML5,jquery、sencha、dojo、mobl、PhoneGap等等都已经支持Android开发。 而在Android系统底层方面,Android使用C/C++作为开发语言。 应用程序(部分)

早期的Android应用程序开发,通常通过Android SDK(Android软件开发包)下使用Java作为编程语言来开发应用程序,但通过不同的软件开发包,则使用的编程语言也不同。

例如开发者可以通过Android NDK(Android Native开发包)使用C语言或者C++语言来作为编程语言开发应用程序。同时谷歌还推出了适合初学者编程使用的Simple语言,该语言类似微软公司的Visual Basic语言。此外,谷歌公司还推出了Google App Inventor开发工具,该开发工具可以快速地构建应用程序,方便新手开发者。

Java开发方面

Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层出不穷的变化。考虑到Java虚拟机的效率和资源占用,

谷歌重新设计了Android的Java,以便能提高效率和减少资源占用,因而与J2ME等不同。

图3.1 Android系统架构

其中Activity等同于J2ME的MIDlet,一个 Activity 类(Class)负责创建视窗(Windows),一个活动中的Activity就是在 foreground(前景)模式,背景运行的程序叫做Service。两者之间通过由ServiceConnection和AIDL连结,达到复数程序同时运行效果。如果运行中的 Activity 全部画面被其他 Activity 取代时,该 Activity 便被停止(Stopped),甚至被系统清除(Kill)。

View等同于J2ME的Displayable,程序人员可以通过 View 类与“XML layout”档将UI放置在视窗上,Android 1.5的版本可以利用 View 打造出所谓的 Widgets,其实Widget只是View的一种,所以可以使用xml来设计layout,HTC的Android Hero手机即含有大量的widget。至于ViewGroup 是各种layout 的基础抽象类(abstract class),ViewGroup之内还可以有ViewGroup。View的构造函数不需要再Activity中调用,但是Displayable的是必须的,在Activity 中,要通过findViewById()来从XML 中取得View,Android的View类的显示很大程度上是从XML中读取的。View 与事件(event)息息相关,两者之间通过Listener 结合在一起,每一个View都可以注册一个event listener,例如:当View要处理用户触碰(touch)的事件时,就要向Android框架注册View.OnClickListener。另外还有BitMap等同于J2ME的Image。 C/C++开发方面

早期的Android开发只支持Java作为编程语言开发应用程序,因而使得其他语言开发者只能望而却步。2010年4月,谷歌正式对开发者发布了Android NDK,NDK允许开发者使用C/C++作为编程语言来为Android开发应用程序,初版的NDK使得开发者看到了C/C++在Android开发中的希望。

但是,当前版本的NDK在功能上还有很多局限性:NDK并没有提供对应用程序生命周期的维护;NDK也不提供对Android系统中大量系统事件的支持;对于作为应用程序交互接口的UI API,当前版本的NDK中也没有提供。但是相对于初版的NDK,现在的NDK已经进行了许多重大的功能改进。

由此可见,NDK仍然需要完善和发展,相信未来随着NDK的发展,NDK可以做得更多更好。 中介软件

操作系统与应用程序的沟通桥梁,应用分为两层:函数层(Library)和虚拟机(Virtual Machine)。 Bionic是 Android 改良libc的版本。Android 同时包含了Webkit,所谓的Webkit 就是Apple Safari 浏览器背后的引擎。Surface flinger 是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的Bionic Libc。

Android采用OpenCORE作为基础多媒体框架。OpenCORE可分7大块:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。

Android 使用skia 为核心图形引擎,搭配OpenGL/ES。skia与Linux Cairo功能相当,但相较于Linux Cairo, skia 功能还只是雏形的。2005年Skia公司被Google收购,2007年初,Skia GL源码被公开,目前Skia 也是Google Chrome 的图形引擎。

Android的多媒体数据库采用SQLite数据库系统。数据库又分为共用数据库及私用数据库。用户可通过ContentResolver类(Column)取得共用数据库。 Android的中间层多以Java 实现,并且采用特殊的Dalvik 虚拟机(Dalvik Virtual Machine)。Dalvik虚拟机是一种“暂存器型态”(Register Based)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。

Dalvik虚拟机可以有多个实例(instance), 每个Android应用程序都用一个自属的Dalvik虚拟机来运行,让系统在运行程序时可达到优化。Dalvik 虚拟机并非运行Java字节码(Bytecode),而是运行一种称为.dex格式的文件。

硬件抽像层

Android 的 HAL(硬件抽像层)是能以封闭源码形式提供硬件驱动模块。HAL 的目的是为了把 Android framework 与 Linux kernel 隔开,让 Android 不至过度依赖 Linux kernel,以达成 kernel independent 的概念,也让 Android framework 的开发能在不考量驱动程序实现的前提下进行发展。

HAL stub 是一种代理人(proxy)的概念,stub 是以 *.so 档的形式存在。Stub 向 HAL“提供”操作函数(operations),并由 Android runtime 向 HAL 取得 stub 的 operations,再 callback 这些操作函数。HAL 里包含了许多的 stub(代理人)。Runtime 只要说明“类型”,即 module ID,就可以取得操作函数。 系统内核

Android 是运行于 Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic 取代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。Android 为了达到商业应用,必须移除被GNU GPL授权证所约束的部份,例如Android将驱动程序移到 userspace,使得Linux driver 与 Linux kernel彻底分开。bionic/libc/kernel/ 并非标准的kernel header files。Android 的 kernel header 是利用工具由 Linux kernel header 所产生的,这样做是为了保留常数、数据结构与宏。

目前Android 的 Linux kernel控制包括安全(Security),存储器管理(Memory Management),程序管理(Process Management),网络堆栈(Network Stack),驱动程序模型(Driver Model)等。下载Android源码之前,先要安装其构建工具 Repo来初始化源码。Repo 是 Android 用来辅助Git工作的一个工具。 安全权限机制

Android本身是一个权限分立的操作系统。在这类操作系统中,每个应用都以唯一的一个系统识别身份运行(Linux用户ID与群组ID)。系统的各部分也分别使用各自独立的识别方式。Linux就是这样将应用与应用,应用与系统隔离开。 系统更多的安全功能通过权限机制提供。权限可以限制某个特定进程的特定操作,也可以限制每个URI权限对特定数据段的访问。

Android安全架构的核心设计思想是,在默认设置下,所有应用都没有权限对其他应用、系统或用户进行较大影响的操作。这其中包括读写用户隐私数据(联系人或电子邮件),读写其他应用文件,访问网络或阻止设备待机等。

安装应用时,在检查程序签名提及的权限,且经过用户确认后,软件包安装器会给予应用权限。从用户角度看,一款Android应用通常会要求如下的权限: 拨打电话、发送短信或彩信、修改/删除SD卡上的内容、读取联系人的信息、读取日程信的息,写入日程数据、读取电话状态或识别码、精确的(基于GPS)地理位置、模糊的(基于网络获取)地理位置、创建蓝牙连接、对互联网的完全访问、查看网络状态,查看WiFi状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄图片等。

一款应用应该根据自身提供的功能,要求合理的权限。用户也可以分析一款应用所需权限,从而简单判定这款应用是否安全。如一款应用是不带广告的单机版,也没有任何附加的内容需要下载,那么它要求访问网络的权限就比较可疑。

3、5 安卓组件介绍

Android开发四大组件分别是:活动(Activity): 用于表现功能。服务(Service): 后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver):用于接收广播。内容提供商(Content Provider): 支持在多个应用中存储和读取数据,相当于数据库。

3、5、1 Activity

Android 中,Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。在Android的程序当中,Activity 一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Activity就相当于一个网页。在Activity 当中可以添加一些Button、Check box 等控件。可以看到Activity 概念和网页的概念相当类似。

一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间可以进行相互跳转,例如,按下一个Button 按钮后,可能会跳转到其他的Activity。和网页跳转稍微有些不一样的是,Activity 之间的跳转有可能返回值,例如,从Activity A 跳转到Activity B,那么当Activity B 运行结束的时候,有可能会给Activity A 一个返回值。这样做在很多时候是相当方便的。

当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的移除一些

没有必要保留的屏幕,应为Android会把每个应用的开始到当前的每个屏幕保存在堆栈中。

3、5、2 Service

Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service 是没有界面的长生命周期的代码。Service 是一种程序,它可以运行很长时间,但是它却没有用户界面。这么说有点枯燥,来看个例子。打开一个音乐播放器的程序,这个时候若想上网了,那么,我们打开Android 浏览器,这个时候虽然我们已经进入了浏览器这个程序,但是,歌曲播放并没有停止,而是在后台继续一首接着一首的播放。其实这个播放就是由播放音乐的Service进行控制。当然这个播放音乐的Service也可以停止,例如,当播放列表里边的歌曲都结束,或者用户按下了停止音乐播放的快捷键等。service 可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD 卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。 开启service有两种方式:

(1) Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次 );stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 注意,多次调用Context.startservice()不会嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被停止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate --> onStart(可多次调用) --> onDestroy。

(2) Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡了 。

3、5、3 BroadcastReceiver

在Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver 是对发送出来的Broadcast进行过滤接受并响应的一类组件。可以使用BroadcastReceiver 来让应用对一个外部的事件做出响应。这是非常有意思的,例如,当电话呼入这个外部事件到来的时候,可以利用BroadcastReceiver 进行处理。例如,当下载一个程序成功完成的时候,仍然可以利用BroadcastReceiver 进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。BroadcastReceiver通过NotificationManager 来通知用户这些事情发生了。BroadcastReceiver 既可以在AndroidManifest.xml 中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。只要是注册了,当事件来临的时候,即使程序没有启动,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast () 将它们自己的intent broadcasts广播给其他应用程序。 注册BroadcastReceiver有两种方式:

(1)在AndroidManifest.xml进行注册。这种方法有一个特点即使你的应用程序已经关闭了,但这个BroadcastReceiver依然会接受广播出来的对象,也就是说无论你这个应用程序时开还是关都属于活动状态都可以接受到广播的事件; (2)在代码中注册广播。

第一种俗称静态注册,第二种俗称动态注册,这两种注册BroadcastReceiver的区别:

动态注册较静态注册灵活。实验证明:当静态注册一个BroadcastReceiver时,不论应用程序是启动与否。都可以接受对应的广播。

动态注册的时候,如果不执行unregisterReceiver();方法取消注册,跟静态是一样的。但是如果执行该方法,当执行过以后,就不能接受广播了。

3、5、4 Content Provider

Content Provider 是Android提供的第三方应用数据的访问方案。

在Android中,对数据的保护是很严密的,除了放在SD卡中的数据,一个应用所持有的数据库、文件、等等内容,都是不允许其他直接访问的。Android当然不会真的把每个应用都做成一座孤岛,它为所有应用都准备了一扇窗,这就是Content Provider。应用想对外提供的数据,可以通过派生ContentProvider类, 封装成一枚Content Provider,每个Content Provider都用一个uri作为独立的标识,形

如:content://com.xxxxx。所有东西看着像REST的样子,但实际上,它比REST 更为灵活。和REST类似,uri也可以有两种类型,一种是带id的,另一种是列表的,但实现者不需要按照这个模式来做,给你id的uri你也可以返回列表类型的数据,只要调用者明白,就无妨,不用苛求所谓的REST。

另外,Content Provider不和REST一样只有uri可用,还可以接受Projection,Selection,OrderBy等参数,这样,就可以像数据库那样进行投影,选择和排序。查询到的结果,以Cursor(参见:reference/android/database/Cursor.html )的形式进行返回,调用者可以移动Cursor来访问各列的数据。

Content Provider屏蔽了内部数据的存储细节,向外提供了上述统一的接口模型,这样的抽象层次,大大简化了上层应用的书写,也对数据的整合提供了更方便的途径。Content Provider内部,常用数据库来实现,Android提供了强大的Sqlite支持,但很多时候,你也可以封装文件或其他混合的数据。

在Android中,ContentResolver是用来发起Content Provider的定位和访问的。不过它仅提供了同步访问的Content Provider的接口。但通常,Content Provider需要访问的可能是数据库等大数据源,效率上不足够快,会导致调用线程的拥塞。因此Android提供了一个AsyncQueryHandler帮助进行异步访问Content Provider。

在各大组件中,Service和Content Provider都是那种需要持续访问的。Service如果是一个耗时的场景,往往会提供异步访问的接口,而Content Provider不论效率如何,都提供的是约定的同步访问接口。

4、基于Android 的无线点菜系统的实现

4、1 界面设计

界面设计关系到用户体验的好坏,是不可以忽视的一个环节,用户体验的好坏往往决定着一个开发软件能不能迅速推广。安卓智能手机界面布局合理美观,这一切的界面设计都是由xml布局文件进行用户ui设计的。利用自带的有很多的控件来实现布局功能,例如文本编辑,按钮键,背景颜色,各控件分布比例等。

4、1、1 xml控件介绍

本设计是基于安卓的智能点菜系统,用于酒店点菜所用。首要是实现在手机上以及各种终端上显示各种菜谱画面,点菜画面品。因此设计之初就必须要考虑的终端界面的排版和手机ui用户界面的实现。而这一切在安卓系统里是依靠xml布局文件来实现的。安卓系统为我们提供了很多便利的组件和小控件以便设计者的编译操作,要想了解跟多可以参考相关书籍。在下面我们只就本设计的组件简单的介绍几个activity布局控件,最后就向大家展示我们最后的xml布局文件以供大家参考。

首先是视图组件(view)——作为安卓平台中用户界面的基础元素,view对象存储了终端屏幕上一个特定矩形区域的布局和内容属性的数据体。安卓的窗体功能是通过Widget类来实现的,而view类是widget(窗体部件)的基类。

4、1、2 本设计借助view类中的控件

(a)文本框视图(TextView)用来显示的文本内容 (b)可编辑框(EditText)用来提供可编辑的文本内容等 (c)按钮(Button)用来为我们显示一个可以点击的按钮 (d)滚动视图(ScrollView)用来显示滚动视图

其次还有布局组件——在安卓系统UI设计中我们常常不光要清楚各种控件的作用和接口,还要熟悉各种控件的的布局方式以此来编辑和安排我们控件在activity视图中显示的位置和顺序等。

4、1、3 本设计中涉及的控件

(a)LinearLayout(线性布局)在该布局中子元素之间呈现线性关系,及顺序排列,由于布局显示在终端的二维空间里,其顺序排列是在某一方向上的顺序排列,常见的有水平顺序排列,垂直顺序布局排列等

(b)RelativeLayout(相对布局)在该布局中根据相对位置排列元素,此方式允许子元素指定它们相对于其他元素或父元素的位置,相对于线性布局而言,此布局没有规律性。只有指定参照物后,该布局才有相对的位置可言

(c)AbsoluteLayout(绝对布局)相对布局需要指定参照父元素,而绝对布局这与其相反,不需要指定其参照物,绝对布局使用整个手机界面为坐标系,通过坐标系的两个偏移量(水平偏移量、垂直偏移量)来唯一指定其位置最后还有些一些简单的视图容器组件(viewgroup)和布局参数(LayoutParams)等视图布局组件,就不在详细介绍。

4、1、4 本设计编写的主要*.xml文件

(a)configure.xml:发送界面。点菜结束后,依据用户配置的IP和端口发送点菜信息。

(b)database.xml:数据库界面。用于查询数据库中内容,同时提供删除数据库中信息的功能。

(c)main.xml:登录界面。用于用户登录点菜系统。 (d)second.xml、list_item.xml:共同完成点菜界面设计。 (e)dish01······:用于完成各个菜品介绍界面的设计。

4、2 数据库设计

数据库的主要任务是存储有关数据,以便做查询、统计和上传之用。 通过前面程序用户所有的点菜信息都已经确定,最终的点菜程序需要被存储和通信传递到服务器端通知厨师开始做菜。客户的信息要想存储就必须要用到数据库,本设计运用安卓自带的sql数据库。安卓内置小数据库SQLite是关系型数据库,可以存储文本类数据,通过顶一个助手类SQLiteHelper来提供一个OpenHelper对象来对SQL数据库进行操作。在SQLite OpenHelper为用户提供了两个功能,首先是提供getReadableDatabase()和

getwritableDatabase()来的到可读和可写的数据库对象,在这提供了Oncreate和onupgrade两个回调函数。有了帮助类,通过其提供的函数实现数据的调用,再利用delUserById、onDestroy、query等系统函数方法实现数据库的增删改查。

涉及程序包括:

(1)Data.java:完成对toString的重写。

(2)DataBaseSystem.java:用于实现Database.xml中定义的按键的功能的程序。 (3)userdio.java:要实现数据库中各项功能所需调用的程序。 (4)mydb.java:自定义了一个数据库。

4、3 Socket通信设计

Socket套接口是用来进行进程间通信以及网络传输的重要工具,本设计就是用Socket进行网络通信部分设计的。

4、3、1 Socket的概念

Socket接口是TCP/IP网络的API(Application Programming Interface,应用程序编程接口),Socket函数定义了许多函数或例程。Socket的引入是为了方便联网应用程序的编程,在UNIX的BSD版本第一次使用了这种接口,因此也叫做BSD套接字。应用程序可以使用这种统一接口收发网络上的数据,网络的Socket数据传输是一种特殊的I/O口,Socket也是一种文件描述符。在传输协议的上下文中,由这类读写操作的对象就是通信关系的两端,被表示成了套接字。

Socket套接字是一个通用接口,支持不同的网络结构,也是一个内部进程间的通信机制。当一个主机上同时有多个应用程序在运行,这些应用程序使用TCP和UDP协议进行通信,则传输层协议收到数据后将根据端口和套接口区分数据是传给哪个应用程序。端口是标识传输层与应用程序的数据接口,每个端口有一个16位的标识符。套接口是IP地址与端口号的组合,用来标识全网范围内的唯一一个端口,在TCP和UDP协议中用来标识一个链接,网络应用程序之间通过套接口来实现通信。套接字是套接口描述字的简称。应用程序中使用套接字来调用套接口,套接字可认为是指向套接口的指针。[28][36]

4、3、2 套接字类型

Socket类型有三种:流式套接字、数据报套接字和原始套接字。 (1)流式套接字(SOCK_STREAM)

流式套接字提供可靠的、面向连接的信息流;针对于面向连接的TCP服务应用,使用TCP协议,从而保证了数据传输的可靠性和顺序性。

(2)数据报套接字(SOCK_DGRAM)

数据报套接字定义了一种不可靠、面向无连接的服务,对应于无连接的UDP服务应用,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。数据报套接字使用数据报协议UDP。

(3)原始套接字(SOCK_RAM)

原始套接字允许对底层协议和IP或ICMP进行直接访问,原始套接字功能强大但使用较为不便,主要用于一些协议的开发。

4、4 系统与上位机调试

以下是系统与上位机调试的截图。

5、总结与展望

本设计虽然完成Socket通信和大部分的界面设计。但是由于能力所限,有几点设计初衷未能实现:

(1)对SQlite数据库部分的设计不够深入,部分查询和删除功能未能实现,需要继 续改进。

(2)上位机程序未能亲自编写,是借助于学姐的帮助才完成了,所以以后要实现更强大功能,还需对上位机部分的学习。

Android系统具有学习周期短、开源和使用人数众多的优点。基于Android的程序开 发在今后几年将会有很大发展。各种各样的应用程序将越来越多。

致谢

本次设计在我的导师孙弋教授的悉心指导下终于得以完成。在这学期做毕设的时间 里,老师治学态度严谨,对我严格要求。交给我以正确的方法、态度去看待问题。从开课开始,老师和我们交流一些学习生活上的问题,不仅纠正我的一些错误看法,使我受益匪浅。在此向老师致以最真诚的谢意。

感谢西安科技大学研究生学院的雷小佩同学、赵亮同学、李青同学和吴军营同学。同 学们在开发、调试阶段,给了我很多建议,在一些关键问题上给我了重要启发。同时感谢学院领导对毕业设计的关心和帮助。

参考文献

[28]吴明捷,徐丽洁,张克.直接系列扩频通信在煤矿井下移动通信中的应用.煤炭自动化,2001.

第3 期:6-8

本文来源:https://www.bwwdw.com/article/gos7.html

Top