目录
第1章 成为程序员 1.1 选择编程语言 1.2 告诉计算机做什么 1.3 程序的工作原理 1.4 为什么程序不能正常工作 1.5 选择 Java编程工具 1.6 安装 Java开发工具 1.7 总结 1.8 问与答 1.9 测验 1.9.1 问题 1.9.2 答案 1.10 练习 第2章 编写第一个程序 2.1 编写程序所需的工具 2.2 创建 Saluton 程序 2.3 开始输入程序 2.3.1 class语句 2.3.2 main语句的作用 2.3.3 大括号 2.4 在变量中存储信息 2.5 保存编写好的程序 2.6 将程序编译为 class文件 2.7 修复错误 2.8 运行 Java程序 2.9 总结 2.10 问与答 2.11 测验 2.11.1 问题 2.11.2 答案 2.12 练习 第3章 Java之旅 3.1 第一站:Oracle 3.2 去 Java学校 3.3 在 JavaWorld 用午餐 3.4 在 NASA仰望天穹 3.5 回归正题 3.6 到 Java Boutique 去问路 3.7 在手机上运行 Java 3.8 总结 3.9 问与答 3.10 测验 3.10.1 问题 3.10.2 答案 3.11 练习 第4章 理解Java程序的工作原理 4.1 创建应用程序 4.2 向应用程序传递参数 4.3 创建 applet 4.4 总结 4.5 问与答 4.6 测验 4.6.1 问题 4.6.2 答案 4.7 练习 第5章 在程序中存储和修改信息 5.1 语句和表达式 5.2 指定变量类型 5.2.1 整数和浮点数 5.2.2 字符和字符串 5.2.3 其他数值类型的变量 5.2.4 布尔型变量 5.3 给变量命名 5.4 在变量中存储信息 5.5 运算符 5.5.1 变量的递增与递减 5.5.2 运算符优先级 5.6 使用表达式 5.7 总结 5.8 问与答 5.9 测验 5.9.1 问题 5.9.2 答案 5.10 练习 第6章 使用字符串来交流 6.1 在字符串中存储文本 6.2 在程序中显示字符串 6.3 在字符串中使用特殊字符 6.4 拼接字符串 6.5 将其他变量用于字符串中 6.6 字符串的高级处理 6.6.1 比较两个字符串 6.6.2 确定字符串的长度 6.6.3 改变字符串的大小写 6.6.4 查找字符串 6.7 导演及演员名单 6.8 总结 6.9 问与答 6.10 测验 6.10.1 问题 6.10.2 答案 6.11 练习 第7章 使用条件测试进行判断 7.1 if语句 7.1.1 小于和大于的比较 7.1.2 相等和不等 7.1.3 使用块语句组织程序 7.2 if-else 语句 7.3 switch语句 7.4 条件运算符 7.5 观察时钟 7.6 总结 7.7 问与答 7.8 测验 7.8.1 问题 7.8.2 答案 7.9 练习 第8章 使用循环重复执行操作 8.1 for循环 8.2 while 循环 8.3 do-while 循环 8.4 退出循环 8.5 给循环命名 8.6 测试计算机的运行速度 8.7 总结 8.8 问与答 8.9 测验 8.9.1 问题 8.9.2 答案 8.10 练习 第9章 使用数组存储信息 9.1 创建数组 9.2 使用数组 9.3 多维数组 9.4 对数组进行排序 9.5 对字符串中的字符计数 9.6 总结 9.7 问与答 9.8 测验 9.8.1 问题 9.8.2 答案 9.9 练习 第10章 创建第一个对象 10.1 面向对象编程的工作原理 10.2 对象示例 10.3 什么是对象 10.4 理解继承 10.5 建立继承层次 10.6 转换对象和简单变量 10.6.1 简单变量的类型转换 10.6.2 对象类型转换 10.6.3 在简单变量和对象之间进行转换 10.6.4 自动封装和拆封 10.7 创建对象 10.8 总结 10.9 问与答 10.10 测验 10.10.1 问题 10.10.2 答案 10.11 练习 第11章 描述对象 11.1 创建变量 11.2 创建类变量 11.3 用方法来创建行为 11.3.1 声明方法 11.3.2 参数不同的类似方法 11.3.3 构造函数 11.3.4 类方法 11.3.5 方法中变量的作用域 11.4 将一个类放在另一个类中 11.5 使用关键字this 11.6 使用类方法和类变量 11.7 总结 11.8 问与答 11.9 测验 11.9.1 问题 11.9.2 答案 11.10 练习 第12章 充分利用现有对象 12.1 继承的威力 12.1.1 继承行为和属性 12.1.2 覆盖方法 12.2 建立继承 12.3 使用现有的对象 12.4 将相同类型的对象存储到 Vector 中 12.5 创建子类 12.6 总结 12.7 问与答 12.8 测验 12.8.1 问题 12.8.2 答案 12.9 练习 第13章 创建简单的用户界面 13.1 Swing 和抽象窗口工具包 13.2 使用组件 13.2.1 窗口和框架 13.2.2 按钮 13.2.3 标签和文本框 13.2.4 复选框 13.2.5 组合框 13.2.6 文本区域 13.2.7 面板 13.3 创建自己的组件 13.4 总结 13.5 问与答 13.6 测验 13.6.1 问题 13.6.2 答案 13.7 练习 第14章 用户界面的布局 14.1 使用布局管理器 14.1.1 GridLayout管理器 14.1.2 BorderLayout管理器 14.1.3 BoxLayout管理器 14.1.4 使用Insets将组件隔开 14.2 应用程序的界面布局 14.3 总结 14.4 问与答 14.5 测验 14.5.1 问题 14.5.2 答案 14.6 练习 第15章 响应用户输入 15.1 让程序监听 15.2 设置要监听的组件 15.3 处理用户事件 15.3.1 复选框和组合框事件 15.3.2 键盘事件 15.3.3 启用和禁用组件 15.4 完善图形应用程序 15.5 总结 15.6 问与答 15.7 测验 15.7.1 问题 15.7.2 答案 15.8 练习 第16章 创建复杂的用户界面 16.1 滚动窗格 16.2 滑块 16.3 变更监听器 16.4 使用图像图标和工具栏 16.5 总结 16.6 问与答 16.7 测验 16.7.1 问题 16.7.2 答案 16.8 练习 第17章 创建交互式Web程序 17.1 标准applet方法 17.1.1 在applet窗口中绘画 17.1.2 初始化applet 17.1.3 启动和停止applet 17.1.4 销毁applet 17.2 将applet放到Web页面中 17.3 创建applet 17.3.1 在applet窗口中绘画 17.3.2 测试SalutonApplet程序 17.4 从Web页面传递参数 17.5 在applet中接收参数 17.6 在applet中处理参数 17.7 使用object标记 17.8 总结 17.9 问与答 17.10 测验 17.10.1 问题 17.10.2 答案 17.11 练习 第18章 处理程序中的错误 18.1 异常 18.1.1 在try-catch块中捕获异常 18.1.2 捕获多种不同的异常 18.1.3 出现异常后进行处理 18.1.4 抛出异常 18.1.5 忽略异常 18.2 抛出和捕获异常 18.3 总结 18.4 问与答 18.5 测验 18.5.1 问题 18.5.2 答案 18.6 练习 第19章 创建线程程序 19.1 线程 19.1.1 降低程序的速度 19.1.2 创建线程 19.2 使用线程 19.2.1 声明类 19.2.2 创建变量 19.3 从init( )开始 19.4 在创建URL时捕获错误 19.5 在paint( )方法中处理屏幕更新 19.6 启动线程 19.6.1 运行线程 19.6.2 停止线程 19.7 处理鼠标单击 19.8 循环显示链接 19.9 总结 19.10 问与答 19.11 测验 19.11.1 问题 19.11.2 答案 19.12 练习 第20章 读写文件 20.1 流 20.1.1 文件 20.1.2 从流中读取数据 20.1.3 缓冲输入流 20.2 将数据写入流中 20.3 读写配置属性 20.4 总结 20.5 问与答 20.6 测验 20.6.1 问题 20.6.2 答案 20.7 练习 第21章 读写XML数据 21.1 创建XML文件 21.2 读取XML文件 21.3 读取 RSS 聚合内容(Syndication Feeds) 21.4 总结 21.5 问与答 21.6 测验 21.6.1 问题 21.6.2 答案 21.7 练习 第22章 利用JAX-WS开发Web服务 22.1 定义服务端点接口 使用注解来简化Java代码 22.2 创建服务实现Bean 22.3 发布Web服务 22.4 使用Web服务描述语言文件 22.5 创建Web服务客户端 22.6 总结 22.7 问与答 22.8 测验 22.8.1 问题 22.8.2 答案 22.9 练习 第23章 创建Java2D图形 23.1 使用Font类 23.2 使用Color类 23.3 创建自定义颜色 23.4 绘制直线和形状 23.4.1 绘制直线 23.4.2 绘制矩形 23.4.3 绘制椭圆和圆 23.4.4 绘制弧线 23.5 绘制饼图 23.6 总结 23.7 问与答 23.8 测验 23.8.1 问题 23.8.2 答案 23.9 练习 第24章 编写Android app 24.1 Android简介 24.2 创建 Android app 24.2.1 剖析一个Android新项目 24.2.2 创建app 24.2.3 安装Android模拟器 24.2.4 创建调试配置 24.3 运行app 24.4 设计真实的app 24.4.1 组织资源 24.4.2 配置app的Manifest文件 24.4.3 设计用户界面 24.4.4 编写Java代码 24.5 总结 24.6 问与答 24.7 测验 24.7.1 问题 24.7.2 答案 24.8 练习 附录A 使用NetBeans IDE A.1 安装NetBeans A.2 创建新项目 A.3 创建新的Java类 A.4 运行应用程序 A.5 修复错误 附录B Java资源 B.1 可以考虑的其他书 B.2 Oracle公司的 Java官方站点 B.3 其他Java站点 B.3.1 本书英文版的配套网站 B.3.2 Café au Lait B.3.3 Workbench B.3.4 Java 7 Developer Blog B.3.5 其他Java博客 B.3.6 InformIT B.3.7 Stack Overflow B.3.8 Java Review Service B.3.9 JavaWorld杂志 B.3.10 Developer.com’s Java Directory 附录C 本书站点 附录D 设置Android开发环境 D.1 起步 D.2 安装Eclipse D.3 安装 Android SDK D.4 安装在Eclipse中使用的Android插件 D.5 设置你的手机 其他 版权

Java初级教程

Java入门经典
第24章 编写Android app

本章介绍如下内容:

为什么要创建Android;

如何创建 Android app;

Android app 是如何架构的;

如何在模拟器上运行app;

如何在Android手机上运行app。

Java 是一款通用的编程语言,可以在多种平台上运行。其中有一个平台在过去的 4 年间发展势头迅猛,成为使用Java语言进行开发的一个全新领域。

Android最初作为在手机上使用的操作系统,如今已经应用到其他设备中,并专门运行使用Java编写的程序。

这些称为 app 的程序是在开源的移动平台上开发的,该平台对开发者来说完全免费。任何人都可以编写、部署和销售 Android app。

在本章,你将学习到 Android 是如何出现的,它为什么这么特殊,以及为什么数以万计的程序员在该平台上进行开发。通过本章的学习,你还可以创建一个 app,并将其运行在Android手机上。如果没有Android手机,则可以将其运行在模拟器上。

24.1 Android简介

Google在2005年收购了Android技术,并于两年后将其推出,旨在通过业界的努力来建立一种全新而且开放的移动手机平台,该平台没有专利保护,因此与RIM黑莓和苹果iPhone所使用的技术不同。一些著名的移动手机生产厂商和技术厂商,包括Google、Intel、Motorola、Nvidia、Samsung 以及其他公司在内,组成了开放手机联盟(Open Handset Alliance),旨在本着互惠互利的目的,来推动这个新平台的发展。

Google 发布了 Android 软件开发工具包(SDK),这是一个免费的工具集,用以开发Android app。运行 Android 的第一款手机是 T-Mobile G1,它于 2008 年6 月上市。

Android 技术在发展初期进展缓慢,但是从 2010 年初期开始呈爆发态势增长,并成为iPhone和其他移动平台的强劲对手。所有的主流手机运行商现在都提供Android手机,而且Android在平板电脑和电子书阅读器市场也得到了显著增长。

在Android出现之前,如果要进行移动应用程序的开发,需要昂贵的编程工具和开发计划。而且手机生产厂商可以决定谁能够为其生产的手机开发 app,还可以决定 app 是否可以卖给其他用户。

Android的出现打破了这一壁垒。

Android的开源和非专利属性意味着任何人都可以开发、发布和销售app。而且其中涉及的唯一成本是将 app 提交给 Google app 市场时收取的象征性费用,其他的都是免费的。

在 Android 开发者站点(http://developer.android.com)上可以下载 Android SDK,以及其他编程工具。当你开发 app 时,将会经常求助于该站点,因为它囊括了 Android Java类库中的所有类,因此可以作为详尽的在线资源进行参考。

如果你使用的 IDE 支持 Android SDK,则可以很容易地开发 Android app。最流行的Android编程IDE是Eclipse,它也是免费而且开源的。Eclipse的一个Android插件可以使得Android SDK 功能无缝地嵌入到 Eclipse 中。

你可以使用 Eclipse 来编写 Android app,并在模拟器(其运行行为很像 Android 手机的软件)上进行测试,甚至也可以将app部署在真实的Android设备上。

在过去,Java语言主要用来编写运行在3个场合的程序,这3个场合是桌面计算机、Web服务器和Web浏览器。

Android可以让Java用在各处。你用Java编写的程序可以部署在上百万台手机和其他运动设备上。

在 20 世纪 90 年代中期,当 James Gosling 在 Sun 公司工作时,他发明 Java 语言的初衷就是希望该语言能够运行在各种设备上,比如手机、智能卡和家电中。如今,Android 的出现实现了Java语言的设计初衷。

当 Java 语言先是作为运行交互式 Web 程序的一种方式,继而成为通用编程语言,而逐渐流行起来时,Java开发人员已经将Java的设计初衷抛到一边。

15年过后,据业内人士估计,Android平台承载了全世界十几亿的Java程序。

随着时间的发展,Android将成为最普遍、最具潜力的Java编程领域,而且一定会是硕果累累。

这可能最有趣。

警告:

本章内容在该书中占据的篇幅最长,因为当你作为 Android app开发人员起步,朝着将来的百万富翁努力时,需要知晓很多内容。

24.2 创建 Android app

Android app 是最常见的 Java 程序,它使用了应用程序的框架,该框架是所有 app 共有的一组核心类和文件。为了让app在Android设备上正确运行,该框架包含了一组app架构规则。

要开始编写 app,你必须安装并配置 Android SDK、Eclipse IDE,以及用于 Eclipse 的Android插件。

如果你是头一次进行Android编程,你可以在附录D找到获取并安装这些工具的方法。

将要创建的第一个项目是编写一个 SalutonMondo app,该程序可以在 Android 设备的屏幕上显示一行文本。

1. 运行 Eclipse IDE,它的外观和行为与 NetBeans 很像。

2. 选择 File->New->Android Project,打开 New Android Project 向导,如图 24.1 所示。

图24.1 在 Eclipse 中创建一个新的 Android项目

3. 在 Project name 文本框中输入 SalutonMondo。

4. 在 Contents区域,选中 Create New Project in Workspace。

5. Use Default Location 复选框确定该项目的存储位置。如果可以接受默认值,保持该复选框选中状态。否则取消选中该复选框,单击Browse按钮,然后选择项目要存储的文件夹。

6. 每一个 Android 项目需要一个构建目标(build target)。该目标表示可以运行 app 的Android最老版本。由于以一个新发布的Android版本都有增强的特性,你选择的目标决定了可以使用的特性。

对于像本例这样简单的 app,可以使用早期的目标,这里选择 Android 2.2。

7. 在 Application name 文本框,将该 app 命名为 Saluton Mondo!。该名字将显示在Android设备上。

8. Package name 文本框应该包含 app 类所属的 Java 包名。输入 org.cadenhead.android。

9. Create Activity复选框指示这个新的app是否是使用Activity类创建的。行为(activity)是 app 可以完成的任务。将该复选框保持为选中状态,然后在旁边的文本框中输入SalutonActivity。

10.单击 Finish。该 app 创建完毕,SalutonMondo条目出现在 Package Explorer面板中。

24.2.1 剖析一个Android新项目

在一个 Android app 项目中,大约包含 20 个文件和文件夹,而且它们的组织方式相同。取决于app的功能,它可以包含更多的文件,但是这些开始文件和文件夹必须存在。

图 24.2 所示为在创建一个新的 Android 项目后,Eclipse Package Explorer的界面。

图24.2 查看Android项目的组成部分

你可以使用文件夹来探索该项目的文件和文件夹结构。这个新的 SalutonMondo app在开始时具有如下组件。

/src文件夹:该app的Java源代码的根文件夹。

/src/org.cadenhead.android/SalutonActivity.java:在该app运行时,将会默认执行的行为类。

/gen文件夹:用于存放生成的Java源代码,你不需要手动编辑这些代码。

/gen/org.cadenhead.android/R.java:为该 app 自动生成的资源管理源代码(不要手动编辑!)。

/assets:不会被编译为app的文件夹或文件资源。

/res:存放应用程序资源(如字符串、数字、布局文件、图形和动画)的文件夹。而且特殊的资源类型(如layout、values、drawable-hdpi、drawable-ldpi和drawable-mdpi)可以使用子文件夹来存放。这些文件夹包含 5 个资源文件:icon.png 的 3 个版本、main.xml和strings.xml。

AndroidManifest.xml:app的主配置文件。

default.properties:由Android插件生成的构建(build)文件,不要对其进行编辑。

proguard.cfg:ProGuard的配置文件,ProGuard是一款优化app的工具,而且可以使源代码更难以被反编译。

这些文件形成了应用程序的框架。作为Android程序员,你要做的第一件事就是学习如何修改该框架,以便发现每个组件要完成的功能。

该框架中还包含实现特定目的的其他文件。

24.2.2 创建app

尽管到目前为止什么也没有做,但是你可以成功地运行这个Android项目。该项目的框架可以作为一个app运行。

但是这一点也不好玩,因此可以自定义 SalutonMondo app,使其显示传统的计算机编程问候语“Saluton Mondo!”。

在第 2 章,是通过调用 System.out.println( )方法,并将文本“Saluton Mondo!”作为字符串显示出来的。

Android显示已经存储在strings.xml资源文件中的字符串。可以在/res/values文件夹中找到该文件。

在 Package Explorer 中导航到该文件夹。双击 strings.xml,打开资源编辑器,如图 24.3所示。

图24.3 编辑 Android app的字符串资源

和Java中的变量一样,字符串和其他资源都有名字和值。在资源元素面板中列出了两个字符串资源:hello和app_name。

在给资源命名时,需要遵循3个规则:

必须小写;

没有空格;

只能使用下划线字符作为标点。

在资源元素面板中单击一个字符串,将会出现出现Name文本框和Value文本框,而且还会带有如何编辑字符串的指导(见图24.3)。

在运行 New Android Project Wizard 时,需要选择 app_name 字符串资源。该名字应该与之前命名的名字匹配,但是可以随时修改该字符串。

hello字符串包含app运行时,显示在app主界面(也是唯一的界面)的文本。单击该字符串的名字可以对其修改。

在 Value 文本框,输入“Saluton Mondo!”。

资源存储在XML文件中。Resources编辑器是一个简单的XML编辑器。你也可以直接编辑XML文件自身。单击编辑器底部的strings.xml选项卡,载入该文件,即可直接进行编辑(该选项卡在图24.3中做出了标识)。

此时,strings.xml看起来如下所示:

Output

在该编辑器中可以修改XML文件中的所有内容,甚至是标记。string元素包含一个name属性,表示该资源的名字。该元素的值作为字符数据封装在标记内部。

返回Resources编辑器,单击Resources选项卡。然后在Eclipse工具栏中单击Save按钮来保存对strings.xml文件做出的修改。

修改之后,即可准备运行该app。

警告:

尽管你可以直接修改 XML 文件,但最好别修改。在创建 Android app的资源时,通常没有必要修改XML文件。但是,如果在定义资源时,Eclipse编辑器对其中的某些内容不支持,则需要修改XML文件。在字符串中不存在这样的问题,所以最好别在Resources编辑器中修改,否则将会带来错误。

24.2.3 安装Android模拟器

在生成(build)Android app 之前,必须设置其调试环境,这可以在 Eclipse 内处理。你必须在桌面计算机上安装可以运行 app 的 Android 虚拟设备(Android Virtual Device,AVD),将其作为模拟器。你还必须创建项目的调试配置。这一切完成之后,你可以生成该 app,并在模拟器中运行它。

为了配置Android虚拟设备,首先在Eclipse工具栏中单击一个绿色的Android图标,它带有一个向下的箭头,如图24.4所示。

图24.4 配置Android虚拟设备

这将启用 Android SDK 和 AVD 管理器,这是 Android SDK 中的一个工具。在左侧面板单击 Vitural Devices 条目,则右侧会列出已经创建的模拟器。管理器如图 24.5 所示。

图24.5 创建一个新的Android模拟器

为了增加一个新的模拟器,单击New按钮,然后执行如下步骤。

1. 在Name文本框中输入“SimpleAVD”。

2. 在 Target 下拉列表中,选择 Android 的目标版本。这里选择的是 Android 2.2 – API Level 8。

3. 在Size文本框选择模拟SD卡的大小。输入1024然后从后面的下拉列表中选择MiB,这表示 SD 卡的大小为 1024MB。你的计算机上必须有足够可用的空间,如果你不希望占据太大空间,则可以调小该值。最小值为9MB。

4. 单击 Create AVD 按钮,很快就可以创建一个新的模拟器(通常不会长于 1 分钟)。

可以根据需要创建模拟器。可以对它们进行自定义,使其用于不同的Android版本的显示类型。

关闭 Android SDK and AVD 管理器,然后到 Eclipse 主界面。

24.2.4 创建调试配置

在启用 SalutonMondo app 之前,需要做的最后一件事是在 Eclipse 中创建调试配置,其步骤如下。

1. 选择 Run->Debug Configuratons,打开Debug Configurations 窗口。

2. 在左侧面板中,双击 Android Application 条目(见图 24.6),可以看到新创建了一个New_Configuration 条目,该条目作为 Android Application 的子项。右侧面板将显示这个新条目的一些配置选项。

图24.6 创建Android调试配置

3. 在右侧面板中的Name文本框中,将其值修改为SalutonDebug。

4. 单击 Browse 按钮,打开 Project Selection 对话框。

5. 选择SalutonMondo项目,然后单击OK。

6. 单击Target选项卡。

7. 在 Deployment Target Selection Mode下,选择 Automatic(如果之前没有被选择)。然后在表格中选择目标AVD。

8. 在表格中,选择SimpleAVD模拟器复选框。

9. 单击Apply按钮保存所有变更,然后单击Close。

24.3 运行app

现在你已经有了Android模拟器,并创建了调试配置,接下来可以运行这个app了。单击位于 Package Explorer顶部 SalutonMondo,然后单击 Eclipse 工具栏中的调试图标。

Android 模拟器将该 app 载入到它自己的窗口中,这可能需要一分钟甚至更长的时间,所以在它启动的过程中,请耐心等待。

该模拟器将“Saluton Mondo!”作为文本和 app 的标题显示出来,如图 24.7 所示。模拟器可以像手机那样工作,但是此时需要用鼠标单击按钮(而不是用手)来辅助它的运行。单击“Back”按钮,关闭app,来看一下它是如何模拟Android设备的。

图24.7 在Android模拟器中运行app

和真实设备一样,模拟器可以做很多事情,比如在计算机已经连接到Internet的前提下,模拟器也可以连接到Internet,而且它还可以接受虚假的电话呼叫和短消息。

模拟器毕竟不是功能齐备的设备,因此你开发的app必须要在真实的Android手机和平板电脑上进行测试。

如果可以使用USB线缆将Android手机(或其他设备)连接到计算机,在该手机被设置为调试模式的前提下,你可以在上面运行 app。使用 Android SDK 开发的 app 只能部署在处于调试模式的手机中。

在手机中,通过选择Home->Settings->Applications->Development,进入调试模式。此时将显示 Development settings,从中选择 USB debugging 选项。

接下来,在Eclipse中执行如下步骤:

1. 选择 Run->Debug Configurations,打开Debug Configuration 窗口。

2. 在右侧面板中单击Target选项卡。

3. 将 Deployment Target Selection Mode 从 Automatic修改为 Manual。

4. 单击Apply和Close。

使用USB线缆将Android手机连接到计算机上。此时将会在屏幕顶部的工具栏中出现一个 Android bug 图标。如果将该工具栏拖动到窗口中,将会看到消息“USB Debugging Connected”。

返回Eclipse,单击工具栏中的bug图标,打开Android Device Chooser对话框(见图24.8)。

图24.8 在Android手机上部署app

如果 Android 手机被检测到,它将显示在图 24.5 中 Choose a Running Device 选项下面的表格中。

选中 Choose a Running Device 选项,单击手机设备的名字,单击 OK。该 app 将运行在手机中。

如果你在第 2 章创建的第一个 Java 程序那样,你创建的第一个 Android app 非常稀松平常。你接下来将要创建的这个项目将不会如此。

24.4 设计真实的app

Android app可以使用设备的所有功能,比如短消息服务、基于位置的服务、以触摸进行的输入。在本章最后第一个编程项目中,你将创建一个真实的服务,名字为 Take Me To Your Leader。

该app使用了Android手机的功能来进行呼叫、浏览网站,以及使用Google地图进行定位。该app可以让你通过手机、Web和地图与白宫取得联系。

为了开始该项目,先执行如下步骤,以在Eclipse中创建一个新的项目。

1. 单击 File->New->Android Project,打开 New Android Project 向导。

2. 在 Project Name 文本框输入 Leader。

3. 确保 Create New Project 被选中。

4. 选择 Build Target Android 2.2。

5. 在 Application Name 文本框输入 Take Me To Your Leader。

6. 在 Package Name 文本框输入 org.cadenhead.android。

7. 确保 Create Activity被选中,然后在后面的文本框中输入 LeaderActivity。此时 New Android Project 向导应该如图 24.9 所示。

图24.9 创建一个新的Android项目

8. 单击Finish。

和 SalutonMondo 项目一样,该项目也会出现在 Eclipse Package Explorer中。为了避免混淆,在进行下一步操作之前关闭 SalutonMondo 项目。在 Package Explorer 中右键单击SalutonMondo,然后从弹出菜单中选择 Close Project。

提示:

该项目包含了大量的知识。随着工作的进行,你会发现,将浏览器打开并定位到 Android Developer站点的 Reference内容(http://developer.android. com/reference),将会为你提供很多帮助。你可以在Android类库中搜索Java类,以及项目中出现的文件的名字,以获悉更多内容。

24.4.1 组织资源

在创建 Android app 时,需要使用 Java 来编程,但是大部分工作是在 Eclipse 界面中完成的。在你完全精通 Android SDK 的功能时,不用编写一行 Java 代码就可以完整大部分工作。

为了无需编程,首先要创建供app使用的资源。每一个新的Android项目在开始时都有几个放置了资源的文件夹。要查看这些文件夹,在 Package Explorer中展开 Leader文件夹,然后展开/res文件夹以及它所有的子文件夹(见图24.10)。

图24.10 查看 app 的资源文件夹

资源包含PNG/JPG/GIF格式的图形、存储在strings.xml文件中的字符串、XML格式的用户界面布局文件,以及你可以创建的其他文件。通常需要添加到项目中的两个文件是color.xml和dimens.xml,其中前者是app中用到的颜色,后者用于设置文本大小和其他要显示内容的尺寸。

新项目中的/res文件夹包含如下几个文件夹:drawable-hdpi、drawable-mdpi、drawable-lpdi,其中每个文件夹中存放着icon.png的一个版本。icon.png是app的图标,这是一个比较小的图形,用来启用app。

icon.png的这3个版本是相同的图形,但是分辨率不同。你在这里不会用到这些图标,因此可以将它们删除:在Package Explorer中单击一个icon.png文件,然后按下键盘上的Delete键。在删除每一个文件时,系统都会要求用户进行确认。

删除这些文件时,Package Explorer中将出现两个红色的X:一个位于AndroidManifest.xml上面,另一个位于最顶层的Leader上面(图24.11中对其进行了标识)。这些X符号标识该app发生了错误,该错误将阻止app的编译和运行。

由于app现在缺乏图标,因此引发了错误。在项目中添加一个新的图形文件appicon.png,然后在AndroidManifest.xml文件(app的主配置文件)中将其指定为该app的图标。

图24.11 检测和修复 app中的错误

本书配套站点包含该app需要的appicon.png和另外4个图形文件:browser.png、maps.png、phone.png和whitehouse.png。访问www.java24hours.com,然后定位到第24章的页面,下载这5个文件,并将它们存放到计算机的临时文件夹中。

Android支持多个分辨率,但是这里不会用到。这里不是使用已有的drawable文件夹,而是创建一个新的文件夹,步骤如下。

1. 在 Package Explorer中单击/res 文件夹。

2. 选择 File->New->Folder,打开 New Folder 对话框。

3. 在 Folder Name 文本框中输入 drawable。

4. 单击Finish。

/res文件夹中将创建一个名为drawable的新文件夹。app需要的所有图形可以存到这里,而且不用考虑它们的分辨率。

使用拖放技术可以将文件添加到资源中。打开包含5个文件的临时文件夹,选择它们,然后拖放到 Package Explorer中的 drawable 文件夹中。

现在该项目有了新的图标,可以将其设置为app的图标(通过编辑AndroidManifest.xml来实现),这样 Package Explorer中出现的错误图标将消失。

警告:

app中的资源使用ID来表示,将资源名字的扩展名去掉后,就是其ID。比如,appicon.png的ID是appicon,browser.pn的ID是browser。不同资源的ID不可能相同(以不同分辨率存储在3个drawable-*dpi文件夹中的同一个图形是一个例外,因为这3个图形被当做一个资源)。

如果两个资源的名字相同,但是扩展名不同,比如appicon.png和appicon. gif,则Eclipse会标识错误,而且该app无法编译。

资源的名字只能包含小写字母、数字、下划线和点号。该项目中的文件遵循了这些规则。

24.4.2 配置app的Manifest文件

在 Android app 中,主要的配置工具是名为 AndroidManifest.xml 的文件,它位于 app 主文件夹中。app使用的所有XML文件都可以手动编辑,或使用Eclipse中内置的编辑器来编辑。其中后者使用起来比较方便,而且不容易发生错误。当你编写Android程序的经验逐渐丰富时,可以考虑修改XML文件,否则不建议修改。

为了为app选择适合的图标,请执行如下步骤。

1. 在 Package Explorer中双击 AndroidManifest.xml,该文件将在 Eclipse 内置的编辑器中打开。

2. 编辑器的底部位置将出现几个选项卡。单击Application选项卡来查看与该app相关的设置(见图24.12)。

图24.12 编辑app的AndroidManifest. xml文件

3. Icon 文本框表示 app 的图标,当前在文本框内的值@drawable/icon 不正确。单击该文本框后面的 Browse 按钮,打开 Resource Chooser 对话框,其中列出了 app 中包含的 5 个“drawable”资源。

4. 选择appicon并单击OK。Icon文本框现在有了正确的值。

5. 保存文件:单击Eclipse工具栏中的Save阿牛,或者是选择File->Save。

红色的 X 将从 Package Explorer中消失,这表示已经为 app 指定了合适的图标。

24.4.3 设计用户界面

app 的图形用户界面由布局组成,布局是用来放置文本框、按钮、图形和自定义控件的容器。向用户显示的每一个画面都有一个或多个布局。有的布局可以水平或垂直地叠放组件,有的布局可以将组件组织到表中,有的布局还有其他布置方式。

app可以有一个或多个画面。一个游戏可以包含如下画面:

游戏在载入时显示的运行画面;

带有按钮(用以查看其他画面)的主菜单画面;

显示游戏规则的帮助画面;

列出最高游戏得分的分数画面;

包含游戏开发人员的致谢画面;

游戏进行中的画面。

Leader app 包含了一个画面,上面放置的按钮用来练习美国总统,或者其他领导人。

app的所有画面都存放在/res/layout文件夹中。对于一个新项目而言,该文件夹中存放了一个main.xml文件,而且该文件已经被指定为app在载入时所要显示的画面。

为了编辑该画面的布局,在 Package Explorer中双击 main.xml 文件,将会在 Eclipse 主窗口中打开该画面,如图24.13所示。

图24.13 编辑app的main.xml文件

编辑窗口中包含一个 Palette 面板以及几个可以展开的文件夹。Form Widgets 子面板(有可能已经展开)显示一些简单的控件(widget),这些控件可以立刻被拖放到画面中。

按照如下步骤将3个图形按钮添加到画面中。

1. 删除显示“Hello World”文本的 textview 控件。在画面中单击该控件,然后按下Delete键。

2. 双击 Palette面板中的 Image & Media 文件夹,将其展开。

3. 从Palette中拖动ImageButton控件到画面中。画面中出现一个狭窄的蓝色盒子,而且画面下面会出现一条错误消息。只所以出现该错误,是因为按钮缺乏图片——不用担心。

4. 拖动另外两个ImageButton控件到画面中。它们将会在画面中垂直叠放。

5. 一个 Outline 面板列出画面中的控件。从中选择 imageButton1,该按钮的属性在Properties面板中打开(见图24.14)。

图24.14 自定义控件的属性

6. 滚动 Properties 面板,直到发现 ID 属性为止。ID 属性的值当前被设置为@+id/imageButton1。将其修改为@+id/phonebutton。

7. 滚动到Src属性,其当前值是drawable/icon。单击该值,出现一个椭圆形按钮(…)。

8. 单击该按钮,打开 Reference Chooser对话框。

9. 展开Drawable标题,可以看到app的图形列表,这些图形是之前添加进去的资源。选择phone然后单击OK。现在按钮有了一个电话图形。

10.在 On Click 属性,输入值 processClicks(这将在下一节解释)。

11.针对imageButton2,重复步骤5~10,将其ID属性设置为@+id/webbutton,Src属性设置为drawable/browser。

12.针对imageButton3,重复步骤5~10,将其ID属性设置为@+id/mapbutton,Src属性设置为drawable/maps。

13.单击画面上方的 Set Horizontal Orientation 按钮(见图 24.13),按钮现在一字排开。

14.单击Outline面板中的LinearLayout,画面的属性将出现在Properties面板中。

15.单击Background 的值,然后单击椭圆形按钮(…),打开Reference Chooser。

16.展开Drawable,选择whitehouse,然后单击OK。此时白宫的图片将成为画面的背景。

17.单击Save按钮。

完成后的画面如图24.15所示。

图24.15 预览 app 的图形用户界面

24.4.4 编写Java代码

此时,你已经完成了该app的大部分工作,但是你还没有编写一行Java代码。当你充分使用 Android SDK 的功能,而不求助于编程时,app 的开发工作无疑会轻松很多。

app被组织为Activities,这表示app可以处理的任务。每一个Activity都由它所属的Java类来定义。当创建app时,需要确定名为LeaderActivity的Activity已经创建。这样,当app运行时,匹配该名字的类能够自动运行。

LeaderActivity.java 的源代码可以在 Package Explorer 中找到,它位于/src/org.cadenhead. android文件夹中。双击该文件,以进行编辑。

刚开始时,该类的代码如程序清单24.1中所示。

程序清单 24.1 LeaderActivity.java 在刚开始时的文本

与所有Activities相同,LeaderActivity类是Activity的子类,后者位于android.app包中,它包含了显示画面、收集用户输入、保存用户设置等所需要的所有行为。

第 9~12 行定义的 onCreate( )方法将在载入 LeaderActivity类时被调用。该方法首先使用super 调用其超类中的同名方法。然后,再调用 setContentView( )用来选择要显示的画面。传递给该方法的参数是一个实例变量R.layout.main,它引用/res/layout中的main.xml文件。你应该还记得,资源的ID是去除扩展名后的文件名。

注意:

你可以打开并编辑/res/gen/org.cadenhead.android 文件夹中的 R.java 文件,以获悉 main 资源被称为 R.layout.main的原因。R类是由 Android SDK自动生成的,其目的是确保能够通过资源的ID来引用资源。你最好不要修改该类。

在LeaderActivity类中,首先要创建一个类变量。在类定义语句后面添加如下语句:

该变量作为该类的标识符使用,可以用来记录在类运行时所发生的事件。Android 类可以等级它们的行为,以让你知道app中发生了什么。下面是一条记录(log)语句,你在后面会用到:

这条语句显示一条记录消息,而且使用名字Leader进行标记。

android.util包中的Log类显示记录中的消息。该类有5个方法来记录消息,每一个方法都可以只是消息的类型,比如警告消息、调试消息或错误消息。方法 i( )表示信息(information)消息,该消息可以解释app中发生了什么。

传递给 Log.i( )的第一个参数表示 app,第二个参数包含要显示的消息。

在前面设计 app 用户界面时,你将每一个按钮的 On Click 属性设置为 processClicks。这表示当用户单击画面中的按钮控件时,将会调用 processClicks( )方法。现在来实现该方法。在 LeaderActivity中的onCreate( )方法下面添加如下语句:

在调用该方法时需要用到一个参数View,这是来自android.view包中的View类对象。View是app中某些可视化的显示类型。在本例中,它是包含Dialer、Broswer和Maps按钮的画面。

View 对象的 getId( )方法返回被单击按钮的 ID:phonebutton、webbutton 或mapbutton。

该ID存储在id变量中,并在switch语句中使用,这样可以根据单击的按钮采取相应的行为:

该代码的switch语句使用每一个ID的整数值作为参数,并执行3种行为中的一种。方法 processClicks( )中的第一个语句创建了一个变量来存放一个 Intent 对象。Intent 是 Android的android.content包中的一个类:

在Android中,使用Intent来让一个Activity告诉另外一个Activity要做什么。这也是app与Android设备进行通信的一种方式。

该方法使用了下面3个Intent:

Intent( )构造函数接受 2 个参数:

要采取的行为,由它的类变量来表示;

与行为相关的数据。

这3个Intent告诉Android设备:设置一个打给白宫的拨出电话,其电话号码为(202) 456-1111;浏览 http://whitehouse.gov 网站;使用部分地址“White House,Washington,DC”来载入Google地图。

在创建Intent之后,下面的语句将让它执行相应的任务:

程序清单24.2为LeaderActivity类的完整文本。在程序清单24.1的基础上添加import语句(见程序清单24.2中的第3~8行)和processClicks( )方法。确保你的代码与程序清单24.2完全相同。

程序清单 24.2 LeaderActivity.java 的完整源代码

输入完毕之后保存该文件。该文件应该会成功编译(Eclipse 将自定执行该编译)。如果没有,则红色的 X 将显示在 Package Explorer中,指示项目中出错的文件。

当修复错误后,则可以准备运行该app。

你必须先为该项目创建一个新的调试配置:

1. 在Eclipse的主工具栏中单击靠近Debug按钮的箭头,然后选择Debug Configurations,打开 Debug Configuration对话框。

2. 双击左侧面板的Android Application,创建一个名为New_configuration(1)的新配置。

3. 在Name文本框中输入LeaderDebug。

4. 单击Browse按钮,选择Leader项目,然后单击OK。

5. 单击Target选项卡。

6. 在Deployment Target Selection Mode下选中Automatic,然后选择SimpleAVD Android虚拟设备。

7. 将 Deployment Target Selection Mode 更改为 Manual,单击 Apply,然后单击 Close。

现在,创建了一名为LeaderDebug的新调试配置。

要运行该程序,单击靠近Debug按钮的箭头,然后选择LeaderDebug(如果有的话)。如果没有,则选择Debug Configuration,再选择LeaderDebug,然后单击Debug。此时打开Android Device Chooser。选择Launch a New Android Virtual Device,然后选择SimpleAVD,然后单击OK。

在接下来的几分钟时间里,模拟器将载入并自动运行该app。

模拟器并不能模拟 Android 设备的一切行为。这个 Leader app 的 Dialer 和 Browser 按钮应该能够正常工作,但是在使用Maps按钮时,可能会遇到问题。

该app也可以在Android手机上运行,前提是该手机可以运行在Android SDK中,而且已经被设置为调试模式。单击Debug按钮附近的箭头,然后选择LeaderDebug,此时该选项应该绝对存在。选择Choose a Running Android Device,在列表中选择你的手机,然后单击OK。

图24.16为运行在我手机上的app。当手机从肖像模式切换到风景模式时,该app也随之切换(该截图还显示我有141个新的语音信息,我应该查看一下)。

图24.16 在手机上运行该Leader app

这个 Leader app 也将它自己的“Take Me to Your Leader”图标添加到手机应用程序中。即使你拔掉USB线缆,该app也会在手机上继续运行。

祝贺你!现在世界上有了10亿零1个app了。

注意:

读者可能也猜到,Android编程所需要的知识肯定要比本章讲解的内容要多。Sams 出版社还出版了其他 Android编程相关的图书,如《Sams Teach Yourself Android Application Development,2ndEdtion》(由 Lauren Darcey和Shane Conder 编写)。

24.5 总结

本书的目标是帮助读者熟悉编程的概念,提升编写应用程序的信心,无论应用程序是用于桌面计算机、Web页面、Web服务器,还是手机。

当你具有了Java编程经验之后,其他相关的经验也会随之增长,因为像面向对象编程、虚拟机和安全环境等概念在软件开发中都处于前沿地位。

如果你的Java编程经验还有所欠缺,可以查看该书的附录,以寻找有用的信息。

在本章内容结束后,你可以通过多种途径继续学习Java语言。你可以访问://weblogs.java. net站点来查看有关Java语言的讨论,在http://www.careerbuilder.com这样的网站上会列出大量的与Java编程有关的工作机会。此外,在该书的配套站点http://www.java24hours.com上可以找到作者的信箱、查看该书练习的答案,以及勘误等内容。

作为一名 Java 程序员,你可以通过阅读 Sams Teach Yourself Java in 21 Days 来进一步提到你的编程技能。我也是该书的作者,该书对这里讲到的各个主题进行了扩展,此外还添加了很多新的主题,比如 JDBC、Java servlets 和网络编程。本书还会涵盖 Android的内容。

24.6 问与答

问:为什么使用 Eclipse而不是 NetBeans 来创建 Android app?

答:也可以使用NetBeans来开发app,但是使用起来会相当麻烦,而且对Android编程的支持也不是很好。Eclipse 被 Google 指定为首选的 Android IDE。Android Developer 站点(http://developer.android.com)上的官方文档和指南使用的都是Eclipse。

大多数的 Android 编程图书使用的也是 Eclipse。尽管当你从 NetBeans 切换到Eclipse,以进行Android开发时,会存在一个适应阶段。但是当你掌握了app的编写、调试和部署基础之后,就会发现 Eclipse更容易使用,因为它得到了程序员和技术作者更好的支持。

问:ProGuard是如何使app的源码更难以被反编译的?

答:Java类文件很容易使用逆向工程来破解。逆向工程是接受可执行代码,分析出相应源代码的过程。由于 Android app 的设计者不希望自己编写的代码被其他开发人员使用,因此在创建Android项目时可以使用ProGuard。

在编译类文件时,ProGuard通过删除其中未使用的代码来优化app。而且ProGuard会将类、字段和方法的名字更改为无意义而且模糊的内容,这样即使有人反编译了Java代码,也很难轻易地读懂源代码。

只有当app在发布模式下创建时,才使用ProGuard的模糊特性。如果过早地使用该特性,会让调试变得很困难。

24.7 测验

24.7.1 问题

1.下面哪一个公司不是开放手机联盟中的成员?

a.Google。

b.Apple。

c.Motorola。

2.下面哪一个工具可以增大开发人员窃取Java程序源代码的难度?

a.反编译器(decompiler)。

b.重编译器(recompiler)。

c.模糊器(obfuscator)。

3.Android模拟器不能执行下面哪项任务?

a.接收短消息。

b.连接到Internet。

c.进行电话呼叫。

24.7.2 答案

1.b.Apple。Android 是作为开源的一部分创建的,不涉及专利性,而且与 Apple iPhone存在竞争关系。

2.c.

3.c.模拟器并不能模拟真实设备的所有行为,因此它只是测试app过程的一部分。

24.8 练习

为了进一步巩固你的Android知识,请做如下练习。

将 SalutonMondo app 的文本改为“Hello World”,然后在模拟器和 Android 设备(如果有的话)上运行该app。

针对不同的世界领导人创建 Take Me To Your Leader app 的新版本,并自定义电话、Web地址和地图信息。

有关为完成这些练习而编写的Java程序,请访问本书的配套网站www.java24hours.com。

没有精选讨论主题。

全部讨论主题 查看精选主题

没有讨论主题。
😃 😅 😆 😁 😂 😊 😄 😠 😩 😲 😞 😵 😰 😒 😍 😤 😜 😝 😋 😘 😚 😷 😳 😢 😭 😨 😣 😡 😌 😖 😔 😱 😪 😏 😓 😥 😫 😉 👊 👍 👆 👇 👈 👉 👋 👏 👌 👎 👐 💓 💔 💕 💖 💗 💘 💙 💚 💛 💜 💝 💞 💟