项目二 开发标准身高计算器

本项目工作情景的目标是让学生掌握Android的界面开发技术。主要的工作任务划分为① 开发输入界面;② 进行事件处理;③ 显示计算结果;④ 发布到手机。本项目主要涉及的关键技术包括:Activity类的使用、布局文件的设计、事件的处理、创建菜单等。
本章将正式开始学习开发Android项目,示例中将会多次出现XML配置文件,里面有大量的XML元素,学习者只需要掌握重要的XML元素及其属性的含义,而不必花费过多时间记忆每个元素和属性的拼写,因为在实际项目开发中,可以通过Android可视化的布局编辑器来设置布局界面属性,并自动生成XML布局文件。
本书会对项目的相关类进行介绍。在一个类的应用中,首先应知道该类的功能作用;然后去掌握如何定义类的对象,实际上就是了解类的构造方法;最后应熟悉调用类的主要方法,及这些方法要求的参数各有哪些。
Android程序需要用到大量的包,在实际编写代码时,可以在Eclipse中使用【Ctrl】+【Shift】+【O】组合键自动导入相应的包,无需人工输入导入包的语句。

2.1 背景知识

一、常见的手机硬件参数知识

手机软件与手机的硬件密切相关,如果了解手机常见的硬件参数,将便于程序员更好地开发适合于手机硬件的软件产品,也有利于提高软件产品的可移植性。
1.分辨率
手机屏幕尺寸分为物理尺寸和显示分辨率两个概念。物理尺寸是指屏幕的实际大小,以屏幕的对角线长度作为依据(比如3.5英寸、4.0英寸)。在屏幕上看到的画面其实都是由一个个小点组成,这些小点又称为像素。每个像素点可以近似看作屏幕上的一个发光点,点的密度越大,显示效果越清晰,单位面积下显示的内容也就越多。屏幕分辨率反映的是在物理尺寸下可以显示的像素数量,以乘法形式表现,比如手机常见的分辨率320像素 × 480像素,其中“320”表示屏幕上水平方向显示的像数个数,“480”表示垂直方向的像数个数。分辨率越大表示像素的数量越多,图像就越清晰,因此这个指标是决定画面质量的最主要因素。两台手机的物理尺寸相同并不表示其分辨率相同,不同物理尺寸的屏幕,也可以具有相同的分辨率,例如,4.3英寸的Samsung i9100和4.0英寸的HTC G11都具有480 像素× 800像素(WVGA)。分辨率比值是分辨率中横向像素与纵向像素的比值,例如320 像素× 480像素的分辨率比值为2∶3。
目前,手机主流分辨率很多,也有很多的名词术语,下面对此进行解释。

  • GA(Video Graphics Array):支持640像素 × 480像素,是IBM计算机的一种显示标准,也是现在绝大多数分辨率的基准。
  • QVGA(Quarter VGA):VGA分辨率的四分之一,支持240像素 × 320像素。传统的手机一般都采用这种分辨率,例如,Sony Ericsson S500c、Samsung S3650C、Motorola A1800、Nokia E66V等。
  • HVGA(Half-size VGA):VGA分辨率的一半,即480 像素× 320像素,iPhone、第一款Google手机T-Mobile G1均采用这种分辨率。
  • WVGA(Wide VGA):扩大了的VGA分辨率,支持480 像素× 800像素,例如,Samsung的I9000、HTC Desire HD等。
  • FWVGA(Full Wide VGA):扩大了的WVGA分辨率,支持480像素 × 854像素,例如,Motorola Milestone 2、Nokia N9、小米M1等。

分辨率的高低直接影响了产品外型的大小及画质的好坏。由于手机型号和操作系统的多样性,要求同一款游戏需要考虑在不同手机上的运行效果。目前,大部分的软件开发是以兼容分辨率480像素×800像素和480像素×854像素的手机为标准。对于美术设计人员而言,需要在设计之初就考虑屏幕的自适应问题。
2.色彩数量
屏幕颜色是由色阶来决定的。色阶是表示手机液晶显示屏亮度强弱的指标,也就是通常所说的色彩指数,表示色彩的丰满程度。
目前手机的色阶指数从低到高可分为最低单色、256色、4096色、65536色、26万色、1600万色。256=28,即8位彩色;依此类推,65536色=216,即通常所说的16位真彩色;26万色=218,也就是18位真彩色;1600万色=224,也就是24位真彩色。
目前手机能达到的色彩数量也是限制美术人员发挥的一个重要瓶颈。将色阶高的图片放到色阶低的手机上,会导致图片色彩失真,有的颜色无法区分,且色偏严重。所以,设计人员应根据手机的实际情况进行图片绘制。
此外,液晶屏幕由于其独特的发光原理,颜色的明亮度不高。在强光下色彩丰富的图像不能显示出原有的效果,户外显示时这一缺点尤其明显。因此设计人员在设计手机游戏图片时需要考虑这一点,避免将色彩对比度设置得过于接近。
3.CPU
手机同计算机一样具有CPU和内存,特别是随着智能手机越来越普及,更高的CPU硬件配置将成为手机发展的一个趋势,四核、八核的手机CPU已出现。CPU具有运算器和控制器功能,是手机的心脏,构成了系统的控制中心,可对各部件进行统一协调和控制。主频是衡量手机CPU性能的一个重要技术参数。频率越高,表明指令的执行速度越快,指令的执行时间也就越短,对信息的处理能力与效率就越高。
从技术发展趋势来看,手机和计算机正逐渐走向融合,手机CPU的处理性能在近几年得到了较大提高。下面对业界较有名气的手机CPU厂商进行介绍,此外samsung、Apple等公司也有自己的CPU。
① 德州仪器公司:提供OMAP系列处理器,能够兼容Linux、Symbian、Windows Mobile、Android等主流操 作系统,是手机CPU的主要供应商。
② Marvell公司:2006年购买了Intel公司的通信及应用处理器业务,得到了Intel著名的针对嵌入式设备的XScale处理器技术。
③ 高通公司:包括Mobile Station Modems(MSM芯片组)、单芯片(QSC)以及Snapdragon平台,根据手机定位的不同,推出经济型、多媒体型、增强型和融合型四种不同的芯片。
在手机游戏特别是3D游戏中,动画帧数不流畅的问题多数是由于运算速度慢造成的,从而对游戏动画效果产生很大的影响。对此程序员应该采取优化算法来改进画面质量,例如局部刷帧、缓存技术等。
4.内存
手机上的内存分为RAM和ROM。其中,RAM是动态内存,相当于计算机的内存,是影响手机程序运行性能的重要指标,它决定了手机可以同时运行多少应用程序。RAM中的数据在手机关闭后丢失。目前来说,应选用512 MB以上的RAM以确保手机使用的流畅性。
ROM则相当于计算机的硬盘,用于存储手机操作系统、应用程序和用户的文件,ROM中的信息即使在手机断电后也不会丢失。随着手机上安装程序的增多,以及数据信息的累加,ROM的可用空间会不断减少。如果ROM的空间太少,就会影响到手机的操作速度。这一点和计算机引导盘空间(如Windows系统C盘空间)的减少会影响计算机的使用类似。目前,对Android手机而言,应选择1 GB以上的ROM空间。
手机大小的内存可以通过插入SD卡来进一步扩充。SD卡一般用于存放用户的文件,如视频、音频文件,可以将SD卡理解为计算机上的外接移动硬盘。

二、Android的像素单位

Android的像素单位有dip、px、pt、sp等,下面分别介绍它们各自的主要用途。
(1)dip(Device Independent Pixels):设备独立像素。Android设备的屏幕尺寸有很多种,为了使显示能尽量与设备无关,提出了dip的概念,这样可以使程序能够较好地在分辨率不同的手机上运行,并保持类似的外观。即在分辨率不同的屏幕上,相同dip的控件占据屏幕的百分比相等。在程序中一般建议采用该像素单位进行设置。
(2)px:表示像素,采用的是绝对大小,不同设备的显示效果相同,即大小不随设备分辨率的改变而改变,是Android默认的像素单位。
(3)pt:表示磅,是一个标准的长度单位,1 pt=1/72英寸,用于印刷业。
(4)sp:放大像素,与dip概念类似,推荐用于设置字体,TextView控件的字体最好以sp为单位。
(5)in:表示英寸。
(6)mm:表示毫米。

2.2 开发输入界面

一、任务分析

本任务需要实现的效果如图2-1所示。

图像说明文字

应用程序主要由界面和功能组成。标准身高计算器的开发可分为信息的录入界面、数据处理和结果反馈3个模块。本次任务是为用户提供数据录入界面,需要思考如下几个问题。
(1)如何使用Android常用的界面类,它们有哪些重要的方法?
(2)如何使用XML描述布局?
(3)如何在手机上显示所开发的界面?

二、相关知识

1.用户界面设计
用户界面(UI,User Interface)是用户使用程序的桥梁,良好的界面能够使用户更乐意去接受和使用程序。由于不同程序的功能要求差异较大,复杂程度不一,所以评价用户界面并没有绝对的标准。设计一个良好的用户界面不应一味地追求漂亮的外观。下面给出用户界面设计的4项原则。
(1)满足系统功能的需求。这是最基本的原则,用户界面反映了程序对外提供的功能,如果不能符合系统功能的需求,将会直接影响到程序的使用效果。
(2)能够为用户提供准确的信息。不会对用户使用程序起到误导。
(3)布局合理,易于使用。根据信息显示的载体特点来进行界面布局,例如手机和计算机的屏幕大小差异较大,需要在布局上做更精心的设计,易于用户快速找到所需要的信息;具有良好的交互性,使用户不需要太多的培训就可以直接使用程序。
(4)界面风格要一致,符合用户的使用习惯。在进行软件开发时,如果感觉到没有头绪,也可以通过网络查找业界同类型的软件,进行参考。图2-2所示为使用Android开发的一款导航软件的界面。

图像说明文字

一个Android应用是类android. app. Application的一个实例。Application中可以包含多个Activity实例。系统给每个Activity分配一个默认的窗口,而窗口中的内容则需要调用setContent View()方法将其放在一个显式的视图ContentView中,该视图描述了界面上具体的UI控件,如标签、文本框、单选框、多选框等。上述关系如图2-3所示,理解该图有助于读者在后面编写代码时理解各个类之间的关系。

图像说明文字

2.View类
View类是Android所有UI控件的父类。View控件和Swing编程中的JPanel类似,代表一个空白的矩形区域,并负责绘图和事件处理。ViewGroup是View类的一个重要子类,通常作为其他控件的容器使用,可定义其子View对象的布局。图2-4所示为Android UI的控件关系,其中View对象是指在界面上可直接看到的控件,例如,文本框、单选框、多选框、图片、按钮等。

图像说明文字

Android的所有UI控件都建立在View、ViewGroup基础之上。所有继承于View类的控件都可以使用其属性和方法。View类典型的XML属性和方法如表2-1所示。

图像说明文字

属性说明如下。
(1)在用户界面设计中一方面可以在XML中指定属性的值,另一方面也可以在编程过程中通过相关方法动态地修改该属性。对于开发者来说,建议只需掌握常用的属性,并不需要花费时间去记忆所有的属性。可以根据属性名字和方法的英文含义去理解其作用。
(2)属性android:id的命名和程序变量的命名类似,需要赋予一个有含义的标识,以便于之后在程序代码中调用。
(3)Android包下面的android.R.styleable类包含系统所有控件相关的XML属性,在编程时可以直接调用。
View的子类也有很多自己的XML属性,下面以TextView和EditText两个视图控件为例进行介绍。
(1)TextView:是View的子类,其作用是显示文本,相当于一个标签。表2-2给出TextView的主要属性。

图像说明文字

android:gravity属性的取值类型较多,下面是它们取值的含义。

  • android:gravity="top":不改变大小,位于容器的顶部。
  • android:gravity="bottom":不改变大小,位于容器的底部。
  • android:gravity="left":不改变大小,位于容器的左边。
  • android:gravity="right":不改变大小,位于容器的右边。
  • android:gravity="center_vertical":不改变大小,位于容器的纵向中央部分。
  • android:gravity="center_horizontal":不改变大小,位于容器的横向中央部分。
  • android:gravity="center":不改变大小,位于容器横向和纵向的中央部分。
  • android:gravity="fill_vertical":可能的话,纵向延伸以填满容器。
  • android:gravity="fill_horizontal":可能的话,横向延伸以填满容器。
  • android:gravity="fill":可能的话,纵向和横向延伸以填满容器。

(2)EditText:TextView的子类,其功能是向用户提供输入框。表2-3给出EditText的主要属性。

图像说明文字

在Android源程序中EditText类的常用方法主要有两种。
① selectAll():文本全选。
② getText().toString():以字符串形式返回文本框的文本。其中getText()返回的是CharSequence类型的接口,用toString()方法可将其转换成String类型。
对于涉及颜色赋值的XML属性,例如,android:textColor、android:textColorHighlight、android: textColorHint、android:background,使用六位十六进制数表示RGB颜色,其中前两位表示红色(R),中间两位表示绿色(G),最后两位表示蓝色(B),每两位的取值范围都是00~FF(相当于十进制的0~255)。红、绿、蓝三种颜色的十六进制表示方法是:本位取最大值FF,其他位取最小值00。
在程序代码中,若要对颜色进行赋值,可以使用Color类。

  • 使用Color类的常量,例如,int color=Color.RED; //创建一个红色
  • 使用Color类的argb方法,例如,int color=Color.argb(145, 123, 34, 68);// argb方法的4个参数的取值范围都是[0~255]

3.布局方式
设计Android用户界面有三种方法。最常用的方法是使用XML来描述UI。一个XML元素的名字实际上是对应一个Java类,元素的属性对应Java类的成员属性,例如,一个元素在UI中相当于创建一个EditText类。当在程序中加载一个布局资源时,Android系统会初始化这些运行的对象,实例化UI布局元素,并操作其属性。这样做的好处是应用MVC设计模式将用户界面和程序逻辑分开,使得改变用户界面不会影响到程序逻辑,同样地,程序逻辑的变动也不会影响用户界面。Activity为MVC中的Controller,Activity的ContentView则是MVC中的View。另外一种用户界面设计方法是使用Java代码来创建UI,这种方法较为复杂,且模块之间的耦合度较高。第三种方法是综合使用前面两种方法,把变化小、行为比较固定的控件放在XML布局文件中实现,而变化较多、行为控制复杂的控件则由代码进行管理。
布局是一个程序用户界面的架构,它定义了界面的布局结构且存储所有显示给用户的元素,例如文本框、按钮等控件。布局文件使用XML来定义自己的布局和表达层次视图,以.xml为扩展名,存放在项目的res/layout目录下,以便自动被编译工具编译。Eclipse在创建Activity时,会自动为其生成一个布局文件。如果需要新增加布局文件,可以通过图2-5和图2-6所示的方式来创建。需要注意的是,布局文件的命名不能使用大写字母。

图像说明文字

利用Android预先定义的XML元素,可以快速地设计UI界面,这一点和Web页面的设计使用HTML相似。每个布局文件必须包含一个根元素,根元素必须是一个View或ViewGroup对象。一旦定义了根元素,就可以添加其他View元素,逐步构建一个视图层次的界面布局。下面的main_layout.xml布局示例展示了使用纵向的LinearLayout方式,添加一个文本框。

图像说明文字

定义好的布局文件是如何被加载的呢?在编译Android应用程序时,每个XML布局文件将被编译成一个View资源。由Activity代码中的onCreate()函数调用setContentView()实现布局资源的加载,以“R.layout.布局文件名”的形式作为函数的参数值。如对名为main_layout.xml的布局文件,加载如下代码:

图像说明文字

设置好用户界面后就可以进一步操作布局文件中的元素。上面已经介绍过,XML中的每一个元素对应一个Java类,那么如何确定元素对应的UI类呢?这就涉及XML的ID属性。XML中ID属性语法如下:
android:id="@+id/editText1"

其中,“@”表示XML解析器应该解析和扩展剩下的ID字符串,并将其用作ID资源。“+”符号表示这是一个新的资源名字,必须被创建且加入到R.java文件中。R.java文件是一个最终类,保存了应用程序用到的图标、常量等各种资源ID,被放置在“项目名称/gen/项目包名/R.java”目录下。R.java是编译器根据用户的XML文件或资源文件自动创建的,应避免手工修改R.java文件。通过R.java,应用程序能方便地查找到对应的资源,调用的格式是R.XXX.XXX。第一个 “XXX”在实际使用时应填写具体的值,如R.drawable. XXX、R.string.XXX、R.layout. XXX、R.id. XXX,分别对应于“项目目录/res/drawable/”下的资源、“/res/string/”下的字符串、“/res/layout/”下的布局文件及XML文件中控件元素的ID等。第二个“XXX”表示要找的资源ID,如R.layout.main_layout表示名为main_layout的布局文件。另外编绎器也会检查R.java列表中的资源是否被调用,没有被调用的资源将不会被编译进软件中,从而减少了应用程序占用的空间。下面的代码通过findViewById方法从布局文件中找出文本输入框,并向其中填写内容,editText1为文本框的ID。图2-7所示为整个程序的效果图。

图像说明文字

关于手机屏幕上的控件摆放设置,Android提供了5种布局方式,分别为线性布局(LinearLayout)、表格布局(TableLayout)、相对布局(RelativeLayout)、单帧布局(FrameLayout)、绝对布局(AbsoluteLayout)。可以将它们理解为上一节讲到的ViewGroup。这些布局也可以嵌套在一起使用,以便于灵活地生成各种布局样式。本节主要讨论线性布局。需要注意的是,对需要设置成某种布局的控件,应将其XML配置代码作为布局的子元素。布局属性的设置会影响内部控件的排列,所以在修改控件的属性时,如果无法出现预期效果,应进一步检查其上一级布局属性的设置。
1.线性布局
线性布局是Android默认的布局方式,分为垂直线性布局和水平线性布局,分别表示为android:orientation=“vertical”和android: orientation=“horizontal”。前者表示控件以垂直方式排列,即每一行放一个控件;后者表示控件按照水平方式排列,即所有控件都放在同一行,超出部分会被遮盖。
图2-8所示为综合利用多个LinearLayout实现较为复杂的布局界面。

图像说明文字

图像说明文字

放到布局中的View控件,需要设置其主要的布局属性。
① android:layout_height属性:设置控件的高度。
② android:layout_width属性:设置控件的宽度。
上面两个属性,都有3种取值其中,fill_parent表示强制性使控件扩展,以填充布局单元内尽可能多的空间,在空间允许情况下,可以占满屏幕;match_parent与fill_parent的意思一样,在Android 2.2之后版本中建议采用match_parent;wrap_content表示只需显示控件的全部内容即可,例如对于TextView,将完整显示其内部的文本;对于ImageView,将完整显示其图像。
③ android:layout_gravity属性:设置控件显示的位置,默认取值为top,表示顶部对齐。如果希望居中对齐,可取值为center_vertical表示垂直居中,或center_horizontal表示水平居中。
④ android:layout_margin属性:设置控件上、下、左、右边框的边距。
⑤ android:layout_marginBottom属性:设置控件下边框的边距,如取值为“5.0 dip”,表示下边距为5个像素。
(6)android:layout_marginLeft属性:设置控件左边框的边距。
(7)android:layout_marginRight属性:设置控件右边框的边距。
(8)android:layout_marginTop属性:设置控件上边框的边距。
(9)android:layout_weight属性:默认值是0,意味着只在屏幕上占据需要显示的空间大小。若赋值大于0,则和其他值大于0的视图按照取值的比例来分割可用的空间。如果屏幕上控件大小较为一致,可以将其值都设置为1,控件的大小将会被等比例划分,这样界面上的控件布局看起来会较为整齐。
2.相对布局
相对布局,在这个容器内部的子元素们可以使用彼此之间的相对位置或者与容器间的相对位置来进行定位。使用相对布局的好处是位置控制比较灵活。如图2-9所示,其布局代码如下。

图像说明文字

相对布局的主要属性包括4类:① 设置控件与控件之间的位置关系(见表2-4);② 设置控件与控件之间对齐的方式,是顶部、底部还是左、右对齐(见表2-5):③ 设置控件与父控件之间对齐的方式,是顶部、底部还是左、右对齐(见表2-6);④ 设置控件方向的属性(见表2-7)。可以通过组合这些属性来实现各种各样的布局效果。

图像说明文字

图像说明文字

3.表格布局
表格布局的样式与一个表格类似。通过TableRow 来定义行,有几行就有几个TableRow。图2-10中所示的表格布局的代码如下。

图像说明文字

图像说明文字

表格布局中常用的属性如下,它们的取值从序号0开始。
① android:collapseColumns:隐藏指定的列。
② android:shrinkColumns:收缩指定的列以适合屏幕,以避免被挤出屏幕。
③ android:stretchColumns:用指定的列尽量填充屏幕的空白部分。
④ android:layout_column:控件放在指定的列。
⑤ android:layout_span:该控件所占的列数,取值越大,控件占的空间越大。
此外,Android的UI布局还有单帧布局(FrameLayout)、绝对布局(AbsoluteLayout)两种方式。单帧布局是将所有添加到这个布局中的视图都以层叠的方式显示,第一个添加的组件放到最底层,最后添加到框架中的视图显示在最上面,上一层的会覆盖下一层的控件。绝对布局是指定子控件的x-y精确坐标的布局方式,但这种方式不便于程序适应不同分辨率的手机,因此不推荐使用。
4.RadioButton单选框
要实现单选功能,需要使用RadioGroup和RadioButton控件。RadioGroup是一个容器,用于管理一组RadioButton,用户只能选择其中的一个RadioButton。在没有RadioGroup的情况下,RadioButton可以被全部选中。下面举例说明如何在布局文件中创建单选框,效果如图2-11所示。

图像说明文字

图像说明文字

下面对XML代码进行解释。
① RadioGroup也是一个布局管理器,即ViewGroup,可以通过改变其orientation属性的值来设置在RadioButton的布局。
② RadioButton作为RadioGroup的子元素,主要用来设置text属性,用于展示按钮选项的内容。
如果希望在程序代码中获得ID为groupSex的RadioGroup对象,那么可采取如下方法:
RadioGroup group =(RadioGroup)findViewById(R.id.groupSex);
RadioGroup类中的方法getChildCount()用于获得按钮组内的按钮数量,getChildAt(index)方法用于获得索引值为index的按钮。
类似地,在程序代码中获得ID为male的RadioButton对象的方法如下:
RadioButton maleButton =(RadioButton)findViewById(R.id.male);
这样就可以在程序中对RadioButton对象做进一步的处理,例如使用isChecked()方法判断按钮是否被选中,使用getId()方法获得按钮的ID等。
5.标准身高计算公式
目前有很多种标准身高计算公式,本书选择其中一种常用计算公式作为示例。具体计算方法如下:

图像说明文字

6.Activity类
Activity类是Android应用程序中非常重要的类,直接负责与用户进行交互。项目一已经对Activity的生命周期和有关的方法进行了介绍。本节将对Activity做进一步的补充。
Activity方法的主要功能分为与事件处理有关的操作、按键操作、菜单操作、系统较为底层的操作等。掌握并利用这些方法,可以编写较为复杂的应用。
(1)Activity的事件处理方法:当启动一个Activity类时,onCreate方法首先启动,接着是onStart和onResume。一般来说,等这几个方法都执行完成之后Activity就被显示出来。在Acitivity销毁的时候会调用onPause、onStop、onDestory 3种方法。在执行完onDestory之后,Acitivity完成销毁。
除了显示或者被销毁之外,Activity类还可能处于其他状态。例如,当Activity A启动了另一个Activity B时,这个Activiy A会调用onPause方法,进入停滞状态,被放到系统的堆栈中,等被启动的另一个Activity B返回时,Activiy A才会调用onResume方法重新被显示出来。
onSaveInstanceState与onRestoreInstanceState的用途是:当设备的配置(如屏幕方向、语言等)发生变化而使Activity自动重启或者Activity从前台转到后台(如按下Home键)时,Activity会调用onSaveInstanceState(Bundle)方法将当前Activity的状态保存到Bundle变量中。这个Bundle变量与onCreate(Bundle)方法、onRestoreInstanceState(Bundle)中的Bundle参数是同一个,也就是说,后两个方法通过传入的Bundle参数能够还原Activity之前的状态。
Activity的状态被保存到Bundle中。要想手动设置Activity重启后需要的状态数据,可以直接调用该Bundle实例的putXXX方法存入额外的数据信息。
下面给出的示例建议放在真实手机上进行测试,通过切换屏幕方向和切换不同的应用程序,来观察界面上的两个文本在不同操作下的提示差异(见图2-12、图2-13、图2-14),从而更深入地理解此类事件的含义。

图像说明文字

布局文件main.xml:

图像说明文字

程序代码:

图像说明文字

(2)按键事件的处理方法:Activity提供了对按键的捕捉。按键的捕捉分为两个层面:一是对输入法、输入值的捕捉;二是功能键操作,例如回退、主菜单、声音调节等。对于某些输入法而言,按键事件未必能够捕捉到,建议在程序中使用Android keyboard输入法进行测试。
① Boolean onKeyDown(int keyCode,KeyEvent event):当按键被按下时调用。参数keyCode表示按键的编码;参数event表示按键事件对象。KeyEvent类不仅包含了触发按键的详细信息,例如事件的状态、事件的类型、事件发生的时间,还定义了一些keyCode的常量,表示标准Android设备中的功能按键。
② Boolean onKeyUp(int keyCode,KeyEvent event):当按键被释放时调用。
③ Boolean onTouchEvent(MotionEvent event):当触屏事件发生时调用。参数event表示移动事件对象。MotionEvent类包含笔、手指、轨迹球等对象的移动信息,例如坐标。
④ onKeyLongPress(int keyCode,KeyEvent event):当长按某个键时被调用。
⑤ Void onBackPressed():按下【Back】键时被调用,一般用来屏蔽【Back】键或者添加后退功能,例如,弹出确认退出的对话框,如果用户选择退出,则执行finish()方法关闭Activity。注意:与System.exit(0)方法的退出整个应用程序不同,finish()方法只是将Activity推向后台,并没有立即将活动的资源释放。
按键捕捉示例如下,捕捉用户按键以及屏幕的触点坐标,并将这些信息进行显示,实现如图2-15所示的效果。

图像说明文字

图像说明文字

图像说明文字

代码分析如下。

  • 在onKeyDown、onKeyUp方法中,分别根据keyCode判断触发的是哪个功能键,如菜单Menu键、Back键、声音键等,并且通过更改文本控件的内容来进行按键提示。
  • 如果想避免用户执行功能键的实际功能,则只需在onKeyDown()的回调方法中返回true值,让系统知道当前捕捉的是onkeyDown事件即可。若返回false,则表明还会执行用户功能键的实际功能。例如,在对KeyEvent.KEYCODE_VOLUME_DOWN的捕捉事件中,返回的值不是true,而是false,则表明由系统直接处理该功能事件,当用户按下声音键时,实际上已经通过系统调用降低了音量。
  • 要让系统调用onKeyLongPress()方法,必须要在onKeyDown()方法中对需要监控的按键调用event.startTracking()方法并返回true值。
    (3)系统主要的管理方法包括以下几种。
    ① void addContentView(View view,ViewGroup.LayoutParams params):将View添加到Activity的内容视图。参数view表示想要显示的视图;参数params表示想要显示的视图的布局参数。
    ② View findViewById(int id):根据XML文件中的ID属性,找到相应的视图对象。需要在方法的前面指定视图对象的类型,进行相应的强制类型转换。
    ③ void finish ():关闭Activity。
    ④ void finishActivity(int requestCode):强制关闭之前通过startActivityForResult(Intent,int)方法打开的Activity。
    ⑤ View getCurrentFocus():取得当前焦点的View。
    ⑥ Intent getIntent():获取启动Activity的Intent。
    ⑦ void setIntent(Intent newIntent):为Activity设置新的Intent。
    ⑧ LayoutInflater getLayoutInflater():获得一个LayoutInflater对象,该对象可以解释XML布局文件,将其实例化为一个视图对象。
    ⑨ MenuInflater getMenuInflater():获得一个MenuInflater对象,该对象可以解释菜单XML文件,将其实例化为菜单对象。
    ⑩ setRequestedOrientation(int requestedOrientation):设置Activity显示的方向。参数requestedOrientation是常量,在ActivityInfo.screenOrientation中定义,如ActivityInfo.SCREEN_ ORIENTATION_LANDSCAPE表示横屏;ActivityInfo.SCREEN_ORIENTATION_PORTRAIT表示竖屏。在AndroidManifest.xml文件的activity中加入android:screenOrientation="landscape",表示横屏显示(显示时宽度大于高度);加入android:screenOrientation="portrait"表示竖屏显示(显示时高度大于宽度),例如,

图像说明文字

! int getRequestedOrientation():返回Activity当前显示的方向。
@ Object getSystemService(String name):根据名字返回系统的服务对象。该方法返回Object类型,一般需要根据服务对象进行相应的强制类型转换。 void setDefaultKeyMode(int mode):用来设置Activity默认的按键模式,也就是说当Activity中发生了一些按键事件,但是没有任何Listener响应的时候就执行mode设置的动作。mode的值可以有5种选择。

  • DEFAULT_KEYS_DISABLE:关闭按键,相当于丢弃。
  • DEFAULT_KEYS_DIALER:将键盘事件传入拨号器进行处理。
  • DEFAULT_KEYS_SHORTCUT:将键盘输入作为当前窗体上注册的快捷键,进行快捷键处理。
  • DEFAULT_KEYS_SEARCH_LOCAL:将键盘输入作为搜索内容,执行应用程序所定义的搜索。
  • DEFAULT_KEYS_SEARCH_GLOBAL:将键盘输入作为搜索内容,进行全局搜索。

) boolean requestWindowFeature(int featureId):允许扩展窗口的特征,例如,程序全屏显示、自定义标题(使用按钮等控件)。参数featureId的取值在Window类中定义,常用的有:FEATURENO_TITLE、FEATURE_PROGRESS、FEATURE_LEFT_ICON、FEATURE INDETERMINATEPROGRESS。 void setFeatureDrawableResource(int featureId,int resId):对窗口特征设置图像资源。featureId在Window类中定义,resId是res目录下的图片资源ID。这个方法应在requestWindowFeature()方法调用之后才能使用。
+ startActivityForResult(Intent intent,int requestCode):开启一个新的Activity,并接收其执行完毕后返回的结果。如果requestCode的值小于0,该方法的作用就和startActivity(Intent intent)一样。
1 public SharedPreferences getPreferences(int mode):获得只属于Activity的SharedPerference。
2 void setProgressBarVisibility(boolean visible):设置标题栏中长条形进度条的可见性。ProgressBar主要有圆形进度条(progressBarStyleLarge)和长条形进度条(progressBarStyle Horizontal)两种形态。圆形进度条通常用于显示未确定何时结束的进度,一直以动画方式沿圆形轨迹旋转。长条形的进度条通常用于显示明确的进度。要想在标题中显示长条形进度条,应先执行requestWindowFeature(Window.FEATUREPROGRESS)。
3 void setProgressBarIndeterminateVisibility(boolean visible):设置标题栏中圆形进度条的可见性。要想在标题中显示圆形进度条,应先执行requestWindowFeature(Window.FEATURE
INDETERMINATE_PROGRESS)。
4 void setProgressBarIndeterminate(boolean indeterminate):设置进度条的进度是否是不确定的。
5 void setProgress(int progress):设置标题栏长条形进度条的当前数值。参数progress的取值范围为0~10000。
6 void setSecondaryProgress(int secondaryProgress):设置第二个进度条的数值。主要进度数值在setProgress方法中设置,如在播放网络媒体时,默认进度显示播放进度,第二进度条作为背景显示下载缓冲的进度。
7 setVolumeControlStream(int streamType):设置由手机上音量控制键控制的Activity中音频流声音的大小。参数streamType的取值在AudioManager用静态常量定义了需要调整音量的音频流。

  • AudioManager.STREAM_MUSIC:音乐。
  • AudioManager.STREAM_RING:铃声。
  • AudioManager.STREAM_ALARM:警报。
  • AudioManager.STREAM_NOTIFICATION:窗口顶部状态栏通知声。
  • AudioManager.STREAM_SYSTEM:系统。
  • AudioManager.STREAM_VOICECALL:通话。
  • AudioManager.STREAM_DTMF:双音多频。

8 void runOnUiThread(Runnable action):任务action将在UI线程中运行。

三、任务实施

从标准身高计算公式可看出,计算标准身高需要获得用户的体重和性别,因此在用户界面设计中需要提供用户录入体重和性别的界面。用户的体重要求是数字,所以EditText对象需要控制录入范围(必须是数字)。用户的性别要求可以是“男”、“女”或者两者都可以同时计算。
1.创建项目
创建一个Android Project,项目名称为【HeightCalculator】,包名为【com.demo.pr2】,选择Android SDK2.2版本,并创建一个Activity名为【HeightCalculatorActivity】。
2.创建用户界面布局
根据项目分析,分5个步骤来设置XML的布局,如图2-16所示。

图像说明文字

① 设置项目主题区域。
② 设置体重输入框区域。
③ 设置选择性别(可多选)区域。
④ 设置计算按钮区域。
⑤ 设置结果显示区域。
根据布局图,本任务采用线性布局LinearLayout。线性布局的好处是提供了控件水平和垂直排列的模型,同时可以通过设置子控件的weight布局参数来控制各个控件在布局中的相对大小。下面具体介绍如何实现上面规划的界面布局。
(1)设置项目主题区域。主题“个人标准身高计算器”放在布局的第1部分,要求字体居中,大小为22像素点,字体样式为bold类型,距离顶部20像素点。因此选择LinearLayout和TextView两种XML元素进行布局,并将TextView作为LinearLayout的子元素。

图像说明文字

(2)设置体重输入框区域。该区域放在布局的第2部分,按设计要求,输入框只能输入数字。输入框左右两侧分别显示文字信息“请输入你的体重:”和“kg”,因此采用LinearLayout水平分布嵌套两个Textview和一个EditText子元素。

图像说明文字

(3)设置选择性别区域。该区域放在布局的第3部分,按设计要求分别设置男、女性别单选框。同样采用LinearLayout水平布局嵌套RadioGroup和RadioButton元素。

图像说明文字

(4)设置计算按钮区域。该区域放在布局的第4部分,代码如下:

图像说明文字

(5)设置结果显示区域。该区域放在布局的第5部分,代码如下:

图像说明文字

如何将上面5个水平的LinearLayout布局统一起来呢?同样使用LinearLayout布局。不同的是,这时需要使用垂直布局将5个水平布局组合起来。

图像说明文字

在Eclipse中双击上面的布局文件,会显示如图2-17所示的项目界面设计效果。Android提供了可视化的布局编辑器,建议读者在实际的项目开发中通过可视化的布局编辑器来制作应用程序的界面布局,自动生成XML布局文件,从而不需要编写复杂的XML元素,提高编程的效率。此外,读者也可以到网上下载一个名为DroidDraw的软件,它是一个有名的Android界面设计器,可以用来方便地生成复杂的Android Layout XML文件。

图像说明文字

下面简要描述如何利用Android的可视化编辑器直接拖曳UI控件进行布局。以设置项目主题区域的“个人标准身高计算器”为例,需选择LinearLayout和TextView两种UI控件。
① 从UI工具栏Layouts下拖曳LinearLayout UI控件到布局页面窗口,如图2-18所示。

图像说明文字

② 从UI工具栏Form Widgets下拖曳TextView UI控件到布局页面窗口,如图2-19所示,作为LinearLayout的内嵌控件,并在可视属性参数栏中设置参数。将Text属性设置为“个人标准身高计算器”。具体参数设置请查看本章View中的相关知识。

图像说明文字

2.3 进行事件处理

一、任务分析

2.2节的任务只提供了用户信息的录入界面,在用户录入信息后,有两种可能的操作:一种是告诉程序已经输入所有的信息,让程序运行计算结果;另一种是想直接退出程序,不需要程序进行计算处理。本次任务是实现响应用户的操作,需要思考如下几个问题。
(1)事件在程序设计中的用途和原理?
(2)Android提供的事件处理机制有哪些?

二、相关知识

1.单击事件处理
用户界面开发的一般步骤是:首先通过XML文件定义或在代码中动态生成UI控件,然后对控件属性进行设置,最后给控件添加事件监听器。前面两个步骤在2.2节的任务中已经做了介绍,下面将重点介绍如何在Android中实现事件处理。
事件描述的是用户所执行的操作。图形用户界面通过事件机制响应用户和程序的交互。当用户和界面上的控件有交互时会产生某类事件,例如单击按钮,就会产生动作事件。要处理产生的事件,需要向系统注册事件监听,并在预先规定的方法中编写处理事件的代码。当某种事件发生时,系统会自动调用处理该事件的相应方法,从而实现用户与程序的交互,这就是图形用户界面事件处理的基本原理。图形用户界面事件处理提供的是一种触发响应的交互式机制,增加了程序的灵活性和可扩展性。
Android的事件处理机制和J2SE的事件处理机制很接近,都是Java事件(消息)机制实现。Java有四种事件监听实现方式,分别为自身类作为事件监听器、外部类作为事件监听器、内部类作为事件监听器、匿名内部类作为事件监听器。它们的主要实现步骤是类似的,首先确定需要哪种事件监听方式,选择对应的事件监听接口;然后定义一个类实现该监听接口;最后为需要进行事件监听的控件添加监听器(每个控件都有各自添加监听器的方法)。此监听器为在第二步中实现监听接口的类的对象。表2-8为Android常见的监听器接口。

图像说明文字

OnClickListener为处理单击View对象事件的接口,是Android常用的按钮事件,它需要实现onClick(View v)方法,其中参数v表示被单击的View对象。该方法的功能是处理单击View对象的操作。SetOnClickListener方法用于为按钮添加监听器。下面举例说明在Android中实现监听的四种方法。
(1)自身类作为事件监听器,实现代码如下。

图像说明文字

(2)外部类作为事件监听器,实现代码如下。

图像说明文字

(3)内部类作为事件监听器,实现代码如下。

图像说明文字

(4)匿名内部类作为事件监听器,实现代码如下。

图像说明文字

除了可以在Activity的按钮对象中设置监听事件之外,还可以在按钮对象所在的XML布局文件中使用android:onClick赋予按钮执行方法,例如,

图像说明文字

当一个用户单击按钮时,Android系统将调用Activity的selfDestruct(View)方法。该方法要求必须将selfDestruct(View)方法定义为public,并且将View对象作为该方法的唯一参数。例如,

图像说明文字

2.AlertDialog提示框
AlertDialog用于弹出提示框,本身并没有构造函数,不可以直接通过构造函数new AlertDialog(…)的方式来初始化,首先需要通过AlertDialog.Builder来创建一个Builder,然后有两种方法来完成一个AlertDialog:一种方法是使用Builder对象中的方法定义AlertDialog的属性,然后再使用show()方法来创建并显示AlertDialog提示框;另一种方法是先使用create()方法获得AlertDialog对象,然后使用AlertDialog对象的方法定义AlertDialog属性,最后使用show()方法显示AlertDialog提示框。 AlertDialog.Builder构造函数有两种:
① AlertDialog.Builder(Context context);
② AlertDialog.Builder(Context context,int theme)。
其中Context类表示应用程序的上下文环境,是一个抽象类。Activity、Service以及BroadcastReceiver类是实现Context的子类,因此在Activity程序中直接用this代表调用的实例为Activity。如果在内部类中,如在Button按钮的onClick(View view)方法中,直接使用this就会报错,这时可以使用Activity类名.this来解决。
AlertDialog的主要方法及用途介绍如下。
① void dismiss():将对话框从屏幕上移除。
② void setButton(int whichButton,CharSequence text,DialogInterface.OnClickListener listener):设置对话框的按钮,一个单选框或复选框列表的对话框可以有0~3个按钮。参数whichButton表示按钮的类型,在DialogInterface接口中定义了BUTTON_POSITIVE、BUTTON_NEGATIVE和BUTTON_NEUTRAL 3种取值,主要影响按钮的位置;参数text表示按钮的显示文字;参数listener表示按钮触发的监听器。DialogInterface.OnClickListener接口需要实现一个方法onClick(DialogInterface dialog,int which)。
③ void setView(View view):将视图控件显示在对话框中。参数view为某种视图控件。
④ void setMessage(CharSequence message):设置对话框的显示内容。
⑤ setTitle(CharSequence title):为对话框设置标题。参数title表示标题内容。
⑥ void setIcon(Drawable icon)和void setIcon(int resId):为对话框设置图标。参数icon表示图像;参数resId表示图像资源的ID,如果取值为0表示无需使用图标。
如果希望在对话框中实现更复杂的功能,则可以使用AlertDialog.Builder中的方法,具体用法介绍如下。
① AlertDialog.Builder setMultiChoiceItems(CharSequence[] items,boolean[] checkedItems,DialogInterface.OnMultiChoiceClickListener listener):在对话框中显示多选框。参数items表示选项内容数组;参数checkedItems用于指出哪些选项默认处于选中状态,取值为null则表示没有选项被选中;参数listener表示选项被选中的监听器。DialogInterface. OnMultiChoice ClickListener接口需要实现一个方法onClick(DialogInterface dialog,int which,boolean isChecked)。
② AlertDialog.Builder setSingleChoiceItems(CharSequence[] items,int checkedItem,DialogInterface.OnClickListener listener):在对话框中显示单选框。参数items表示选项内容数组;参数checkedItem用于指出哪个选项默认被选中,取值为−1表示没有选项被选中;参数listener表示选项被选中的监听器。
③ AlertDialog.Builder setItems(CharSequence[] items,DialogInterface. OnClickListener listener):在对话框中显示列表。参数items表示选项内容数组;参数listener表示选项被选中的监听器。
下面利用AlertDialog创建出7种不同风格的对话框,效果如图2-20所示。

图像说明文字

(1)布局文件alertdialog.xml。在界面中定义一个文本框用于显示对话框执行的操作。另外定义7个按钮,分别用来显示不同类型的对话框。

图像说明文字

(2)程序代码如下。

图像说明文字 图像说明文字 图像说明文字 图像说明文字

三、任务实施

根据2.2节给出的标准身高计算公式,应该定义一个方法来实现该公式的业务逻辑。这里将方法的名字命名为evaluateHeight。该方法有体重和性别两个参数,返回值为double类型。

图像说明文字

当体重输入框没有数据时或者没选择性别时,定义一个showMessage方法给予信息提示。

图像说明文字

在Button按钮的事件处理方法中,首先判断体重输入框的值和性别选择框的值是否为空,若为空则调用showMessage以提示信息;否则则传递身高和性别两个参数值,并调用evaluateHeight方法。

图像说明文字

2.4 显示计算结果

一、任务分析

本任务需要实现的效果示意图如图2-21所示。
完成了用户信息的录入和处理后,接下来的任务是将程序运行的结果返回给用户,并为用户提供退出操作。要完成本次任务,需要思考如下几个问题。
(1)如何在手机屏幕上显示信息处理结果?
(2)如何退出标准体重计算器程序?
(3)如何制作一个菜单?

二、相关知识

1.创建菜单
菜单是用户应用程序界面中最常见的元素之一,使用非常频繁。在Android系统中,菜单分为三种:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)。
选项菜单通过按下MENU键来显示。选项菜单默认在屏幕底部弹出,每个菜单项依次排列在底部,这些菜单项有文字有图标,也被称作图标菜单项(Icon Menus),如图2-22所示。选项菜单一般情况下最多显示2排,每排3个菜单项,如果多于6项,从第6项开始会被隐藏,并在第6项的位置提示More信息,单击More才出现第6项及以后的菜单项,这些菜单项也被称作展开的菜单项。
上下文菜单与Windows中的右键弹出菜单类似,即用户长按注册了上下文菜单的视图对象,程序界面将会出现一个提供相关功能的浮动菜单。菜单选项在此不能附带图标,但是可以为其标题指定图标,如图2-23所示。
子菜单就是将相同功能的分组进行多级显示的一种菜单,可以添加到选项菜单或上下文菜单的选项中,如图2-24所示。

图像说明文字

在程序中最常用的菜单是选项菜单,下面对其进行详细的描述。管理操作OptionMenu只需重载Activity类中的相应方法。选项菜单的主要方法介绍如下。
① public boolean onCreateOptionsMenu(Menu menu):用于对Activity程序的菜单进行初始化。创建菜单的代码通常放在该方法中,该方法仅在菜单项第一次显示时调用。
② public boolean onOptionsItemSelected(MenuItem item):用于处理用户选中某个菜单项后执行的动作。
③ public void onOptionsMenuClosed(Menu menu):用于处理菜单关闭后执行的动作。
④ public boolean onPrepareOptionsMenu(Menu menu):用于在菜单显示前的相关事件处理,每次菜单显示前都会调用该方法。若想在菜单显示前根据某些条件更新菜单内容,可以重写该方法。例如,将某些菜单项设置为可用或者不可用状态,或者修改其内容。
⑤ public boolean onMenuOpened(int featureId,Menu menu):用于判断用户打开菜单后发生的动作。
⑥ onOptionsMenuClosed(Menu menu):用于菜单正在被关闭时发生的动作。
⑦ openOptionsMenu():通过程序打开选项菜单。选项菜单一般由用户单击键盘上的MENU键打开,但如果希望由程序控制来打开菜单,则可以调用该方法。
⑧ closeOptionsMenu():通过程序关闭选项菜单。
在上面的方法中有6个将Menu和MenuItem用作它们当中的参数。对于Menu接口,主要方法有以下几种。
① add方法:用于添加菜单项,该函数有四个重载方法,返回值都是MenuItem类,下面分别介绍。

  • add(CharSequence title):添加菜单项,菜单项上的内容为标题。这种方法添加的菜单项默认以垂直方式排列。

图像说明文字

效果如图2-25所示。

图像说明文字

  • add(int groupId,int itemId,int order,int titleRes):参数groudId是组的标识符,用于表示菜单项属于哪一个组,可批量对菜单项进行状态处理;参数itemId是菜单项的标识符,如果不需要表示唯一的标识符,那么可以使用Menu.NONE;参数order用于指定菜单项在选项菜单中的排列顺序,如果不关心其排序,可以使用Menu.NONE。参数titlerRes是菜单项标题字符串的资源标识符,需在strings.xml中对其进行定义。如在strings.xml文件中添加如下元素:

图像说明文字

在Activity程序中添加如下代码:

图像说明文字

效果如图2-26所示。

图像说明文字

  • add(int titleRes):参数titleRes和方法b的第4个参数相同。
  • add(int groupId,int itemId,int order,CharSequence title):是最常用的添加菜单项方法。前3个参数和方法b相同;第4个参数title是CharSequence类型,表示菜单项的标题。

下面的代码可以实现如图2-22的效果。

图像说明文字

② findItem(int id):获得指定id的菜单项。
③ getItem(int index):获得给定索引index的菜单项。
④ size():获得菜单项的数量。
⑤ addSubMenu():用于创建具有子菜单的菜单项,具有四种重载方法,参数的含义和add方法中的参数相同。该方法的返回值是一个SubMenu接口,可以继续使用add方法创建子菜单项。例如,

图像说明文字

效果如图2-27所示。

图像说明文字

对于MenuItem接口实现使用的主要方法如下。
① setEnabled(boolean enabled):设置菜单项是否可用。参数enabled如果取值为true,则菜单项可用;如果取值为false,则菜单项不可用。
② setIcon(Drawable icon):为菜单项设置图标,参数icon是类型为Drawable的图标。
③ setVisible(boolean visible):设置菜单项是否可见。参数visible如果取值为true,则菜单项可见;如果取值为false,则菜单项不可见。
④ isEnabled():判断菜单项是否可用。
⑤ isVisible():判断菜单项是否可见。
对于上下文菜单,Activity也提供了一组处理方法,如下。
① public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo):创建上下文菜单。和选项菜单不同,每次上下文菜单要显示的时候都会调用该方法。
② public void registerForContextMenu(View view):为某个View注册上下文菜单。多个视图可以显示同一个上下文菜单。
③ public void unregisterForContextMenu(View view):阻止在View上显示上下文菜单
④ public void openContextMenu(View view):通过程序打开上下文菜单。
⑤ public void closeContextMenu():通过程序关闭上下文菜单。
下面给出一个显示选项菜单和上下文菜单的示例,实现效果如图2-28所示。

图像说明文字

(1)布局文件menu.xml代码如下。

图像说明文字

(2)主程序代码如下。

图像说明文字

2.菜单单击事件
在上一节介绍的onCreateOptionsMenu方法只能在程序中显示菜单,但单击菜单后执行的操作还没有实现。Activity提供的onOptionsItemSelected(MenuItem item)方法则用于处理菜单项单击事件。这个方法将创建一个参数MenuItem对象,表示被选中的菜单项,通过调用getItemId()可以获得相应ID(该ID值用在add方法创建菜单项的时候已经指定),这样就可以判断选中的菜单项。下面是单击菜单示例,可添加到上一节的示例代码中。

图像说明文字

对于上下文菜单,可采用onContextItemSelected(MenuItem item)方法响应菜单项的单击,在方法的实现上与选项菜单类似。

图像说明文字

三、任务实施

2.3节介绍了从UI控件读取用户输入数据的方法,下面介绍如何改变用户UI控件的值。与读取数据类似,UI控件有相应的赋值方法,如TextView类就是使用setText方法来设置文本内容的。下面代码是放在单击按钮事件中,向一个TextView控件写入结果。

图像说明文字

接着创建一个退出软件功能的菜单。

图像说明文字

2.5 发布到手机

一、任务分析

程序员通常在计算机上开发Android程序,并使用手机模拟器进行调试。开发完毕后,需要将程序发布到手机上进行测试。最终版测试通过的Android程序才能交付给普通用户使用。发布Android程序,需先对要发布的程序进行打包,然后通过数据线、WiFi、蓝牙等传输到手机上进行安装。要完成本次任务,需要思考以下两个问题。
(1)如何对Android程序进行打包?
(2)在手机上运行Android程序,需要哪些文件?

二、任务实施

APK(Android Package Kit)文件是Android安装包,其本质是ZIP格式的文件。将其后缀改为zip,然后再对文件进行解压,从中可找到名为classes的DEX(Dalvik VM executes)文件,该文件就是Android Dalvik执行程序,使用Dalvik字节码表示。此外,APK里面还包含:存放签名信息的META-INF目录、存放资源文件的res目录、程序全局配置文件AndroidManifest.xml,编译后的二进制资源文件resources.arsc。
在Android系统中,数字签名用于标识应用程序的作者和在应用程序之间建立信任关系,而非用于决定用户可否安装该应用程序。此项签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,只是用来让应用程序包自我认证。
在编译完成的Android项目的bin目录下,Eclipse会自动生成一个已签名的APK文件。当程序代码有改动时文件会重新自动编译。开发者也可以自己创建数字签名文件,方法是右键选中项目,此时弹出Andoid Tools菜单,然后单击Export子菜单导出签名的或未签名的APK。
下面演示创建数字签名APK文件的步骤。
① 选中项目,然后用鼠标右键单击,选中【Android Tools】→【Export Signed Application Package…】命令,如图2-29所示。

图像说明文字

② 确定需要导出的项目名称,如图2-30所示。
③ 选择密钥库。有两种选项:一种是选择已经存在的密钥库,另一种是重新创建一个密钥库。用户在首次导出签名包时,一般情况下并不存在密钥库。若要新创建密钥库,则需要输入密钥库的存放位置和名字,并设置6位密码,如图2-31所示。

图像说明文字

④ 填写密钥的相关信息,分别是:别名、密码、确认密码、有效期(年)、姓名、组织单元、组织、城市、省、国家代码,如图2-32所示。
⑤ 确认需要签名的APK文件,以及签名后所存放的目录,并单击【Finish】按钮完成操作,如图2-33所示。

图像说明文字

生成APK文件后,可以通过数据线将其复制到手机上,然后在手机上单击该APK文件,即可以完成软件在手机上的安装。也可以借助于豌豆夹、360手机助手、腾讯手机管家等软件安装和卸载手机应用程序。

2.6 完整项目实施

标准个人身高计算器由一个main.xml文件和HeightCalculatorActivity类实现,其完整代码如下。
(1)标准个人身高程序界面布局XML:【main.xml】。

图像说明文字 图像说明文字

(2)标准个人身高程序实现类:【HeightCalculatorActivity.java】。

图像说明文字 图像说明文字 图像说明文字

目录

推荐用户

同系列书

  • 移动应用UI设计

    张晓景 胡克

    本书中通过基础加案例的方式向同学们介绍了Photoshop在手机UI领域中的应用。全书中从UI的基础讲起,针对...

    ¥49.80
  • 移动平台UI交互设计与开发

    陈燕 戴雯惠 魏娜 许伟刚

    本书内容分为设计篇和开发篇,以企业全真项目和经典案例为载体,内容覆盖Photoshop在智能手机应用图标设计、...

    ¥45.00
  • Android移动应用开发项目教程

    李新辉 邹绍芳 陈云志 周昕 吴红娉

      本书通过精心设计的7个工作项目,全程贯彻“做中学”理念,先实践认知,后理论拓展,由浅入深,让读者逐步掌握A...

    ¥46.00
  • Android项目开发入门教程

    张伟华 朱东、伊雯雯

    本书主要围绕Android应用程序开发基础、界面设计、Activity、ContentProvider、数据存...

    ¥35.00
  • Android应用程序设计教程

    李华忠 梁永生 刘涛

      全书共分成8章,主要内容包括Android开发环境构建、Android屏幕布局、Android控件Widg...

    ¥39.80
  • 跨平台的移动Web开发实战(HTML5+CSS3)

    从跨平台的移动Web开发实际应用的角度理解HTML5和CSS3的新元素和新功能,合理选取教学内容。本书设置了8...

    ¥49.80
  • Android移动开发项目式教程(第2版)

    谢景明 钟闰禄 陈长辉 冯敬益 王志球

    本书内容主要包括7 部分,第1 部分讲解搭建Android 开发环境的方法,第2 部分讲解在Android...

    ¥42.00
  • HTML 5移动平台的Java Web实用项目开发

    本书以真实购物网站为项目原型,以购物网站为载体,将购物网站的功能模块合理划分为8个教学单元:导航栏和信息提示设...

    ¥45.00
人邮微信
本地服务
人邮微信
教师服务
二维码
读者服务
读者服务
返回顶部
返回顶部