Android 开发教程

uml.org.cn

Android 开发教程

-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

开 放 手 机 联 盟 --Open Handset Alliance

什 么 是 开 放 手 机 联 盟 ?

开 放 手 机 联 盟 ,Open Handset Alliance: 是 美 国 Google 公 司 与 2007 年 11 月 5 日 宣 布 组 建 的 一 个 全 球 性 的 联

盟 组 织 。 这 一 联 盟 将 会 支 持 Google 发 布 的 Android 手 机 操 作 系 统 或 者 应 用 软 件 , 共 同 开 发 名 为 Android 的 开

放 源 代 码 的 移 动 系 统 。 开 放 手 机 联 盟 包 括 手 机 制 造 商 、 手 机 芯 片 厂 商 和 移 动 运 营 商 几 类 。 目 前 , 联 盟 成 员 数

量 已 经 达 到 了 43 家 。

移 动 手 机 联 盟 创 始 成 员 :

Aplix、Ascender、Audience、Broadcom、 中 国 移 动 、eBay、Esmertec、 谷 歌 、 宏 达 电 、 英 特 尔 、KDDI、

Living Image、LG、Marvell、 摩 托 罗 拉 、NMS、NTT DoCoMo、Nuance、Nvidia、PacketVideo、 高 通 、 三 星 、

SiRF、SkyPop、Sonic Network、Sprint Nextel、Synaptics、TAT、 意 大 利 电 信 、 西 班 牙 电 信 、 德 州 仪 器 、T-Mobile

和 Wind River。

Mobile Operators 移 动 运 营 商 类

China Mobile Communications Corporation 中 国 移 动 通 信

KDDI CORPORATION 日 本 KDDI 电 信

NTT DoCoMo, Inc. 日 本 多 科 莫 电 信

SOFTBANK MOBILE Corp. 日 本 软 银 移 动

Sprint Nextel( 美 国 )

T-Mobile( 德 国 )

Telecom Italia( 意 大 利 )

Telefónica( 西 班 牙 )

Vodafone 沃 达 丰 电 信

China Unicom 中 国 联 通

Semiconductor Companies 半 导 体 制 造 公 司

AKM Semiconductor Inc

Audience

ARM

Atheros Communications

Broadcom Corporation( 博 通 )

Ericsson ( 爱 立 信 公 司 )

Intel Corporation ( 英 特 尔 公 司 )

Marvell Semiconductor, Inc. ( 收 购 了 intel 手 机 芯 片 部 门 的 公 司 )

2


-----------------------------------Android 编 程 基 础

NVIDIA Corporation ( 英 伟 达 公 司 )

Qualcomm Inc.( 高 通 公 司 )

SiRF Technology Holdings, Inc.( 知 名 GPS 芯 片 制 造 商 )

Synaptics, Inc.

Texas Instruments Incorporated ( 德 州 仪 器 )

Handset Manufacturers 电 话 制 造 商

ASUSTeK Computer Inc. 华 硕

Garmin International, Inc.

HTC Corporation ( 多 普 达 的 母 公 司 ) 宏 达 电 子

Huawei Technologies 华 为 科 技

LG Electronics, Inc. 乐 金 电 子

Motorola, Inc. 摩 托 罗 拉

Samsung Electronics 三 星 电 子

Sony Ericsson 索 尼 爱 立 信

Toshiba Corporation 东 芝 公 司

lenovo 联 想 移 动

联 盟 成 员 :Software

Companies 软 件 提 供 公 司

Ascender Corp.

eBay Inc.

Esmertec

Google Inc.

LivingImage LTD.

Nuance Communications, Inc.

OMRON SOFTWARE Co, Ltd. 日 本 欧 姆 龙 软 件

有 限 公 司

PacketVideo (PV)

SkyPop

SONiVOX

ASUSTeK Computer Inc. 华 硕

AKM Semiconductor AKM 半 导 体 公 司

ARM 公 司

Borqs 播 思 通 讯

Atheros Communications

Toshiba Corporation 东 芝 公 司

lenovo 联 想 移 动

软 银 移 动 日 本 无 线 运 营 商 软 银

瑞 典 计 算 机 咨 询 公 司 Teleca AB

Garmin International, Inc. 高 明

HTC Corporation ( 多 普 达 的 母 公 司 ) 宏 达 电 子

Huawei Technologies 华 为 科 技

LG Electronics, Inc. 乐 金 电 子

Motorola, Inc. 摩 托 罗 拉

Samsung Electronics 三 星 电 子

Sony Ericsson 索 尼 爱 立 信

沃 达 丰

Teleca

联 盟 目 的

将 会 支 持 Google 可 能 发 布 的 手 机 操 作 系 统 或 者 应 用 软 件 , 共 同 开 发 名 为 Android 的 开 放 源 代 码 的 移 动 系

统 。

谷 歌 早 在 2002 年 就 进 入 了 移 动 领 域 , 可 是 由 于 目 前 的 手 机 操 作 系 统 企 业 和 手 机 企 业 相 对 封 闭 , 提 高 了

行 业 的 进 入 门 槛 , 移 动 互 联 网 的 发 展 远 没 有 拥 有 统 一 标 准 的 传 统 互 联 网 发 展 迅 速 , 此 次 推 出 的 开 源 手 机 操 作

系 统 平 台 就 是 出 于 这 个 目 的 。

也 有 分 析 认 为 , 谷 歌 并 不 想 做 一 个 简 单 的 手 机 终 端 制 造 商 或 者 软 件 平 台 开 发 商 , 而 意 在 一 统 传 统 互 联 网 和 移

动 互 联 网 。

3


-----------------------------------Android 编 程 基 础

Android 手 机 新 概 念

操 作 系 统 的 选 择 -- 定 制 和 长 尾



重 构

MVC 和 Web APP 架 构

Android 开 发 背 景

计 算 技 术 、 无 线 接 入 技 术 的 发 展 , 使 嵌 入 式 系 统 逐 渐 有 能 力 对 桌 面 系 统 常 规 业 务 进 行 支 持 。

谷 歌 长 期 以 来 奉 行 的 移 动 发 展 战 略 : 通 过 与 全 球 各 地 的 手 机 制 造 商 和 移 动 运 营 商 结 成 合 作 伙 伴 , 开 发 既

有 用 又 有 吸 引 力 的 移 动 服 务 , 并 推 广 这 些 产 品 。Android 进 一 步 推 进 了 " 随 时 随 地 为 每 个 人 提 供 信 息 " 这 一 企 业

目 标 的 实 现 。

Open Handset Alliance 汇 集 了 多 家 业 界 巨 头 。 运 营 商 如 :China Mobile、NTT DoCoMo、Vodafone、T-Mobile

等 ; 设 备 制 造 商 如 ASUS、HTC、Huawei、LG、Motorola、Samsung、Sony Ericsson、Toshiba 等 ; 芯 片 厂 商

如 ARM、Broadcom、Intel、Marvell、NVIDIA、Qualcomm 等 。 软 件 厂 商 如 Ascender 、eBay、Esmertec、LivingImage

等 。


Android 更 像 一 款 桌 面 环 境 为 Java 的 Linux 操 作 系 统 。 有 助 于 Google 实 现 其 " 随 时 随 地 为 每 个 人 提 供 信

息 " 的 企 业 战 略 。

HTC Dream/G1 具 体 配 置

硬 件

3.17 英 寸 HVGA (480 x 320) ;1150mAh 电 池 ; 高 通 528Mhz 7201 处 理 器 ;64MB RAM、128MB ROM ;1GB

MicroSD 卡 ;QWERTY 全 键 盘 ;310 万 像 素 摄 像 头 。

流 媒 体

支 持 视 频 格 式 :H.264、 流 媒 体 、3GPP、MPEG4 和 Codec 3GP ; 支 持 音 频 格 式 :MP3、AAC、AAC+、WMA、

MPEG4、WAV、MIDI、REAL、AUDIO 和 OGG; 支 持 墙 纸 格 式 :JPG、BMP、PNG 和 GIF ; 铃 声 (MP3、

AAC、AAC+ 和 WMA)。

接 入 技 术

蓝 牙 (class 1) ; 四 频 (850,900,1800,1900); 支 持 3G,802.11b 和 802.11g。

4


-----------------------------------Android 编 程 基 础

互 联 网

支 持 HTTP、WAP Push 和 xHTML; 支 持 POP、IMAP、SMTP, 以 及 AOL 和 GMAIL 电 子 邮 件 服 务 ; 支 持 AIM、

MSN、 雅 虎 通 和 GTALK; 与 谷 歌 日 历 同 步 ; 与 Android Market 联 机 ; 支 持 谷 歌 “ 街 景 ” 服 务 ; 包 装 盒 内 附

数 据 工 具 包 。

更 多 信 息

https://sites.google.com/a/android.com/opensource/release-features

Android 盈 利 模 式

Android 的 App Market 模 式 , 软 件 开 发 者 获 得 7 成 收 入 ,3 成 用 于 系 统 维 护 。 难 点 在 于 位 置 营 销 。

设 备 商 通 过 卖 设 备 、 内 置 特 色 应 用 来 获 得 盈 利 。 也 可 以 兼 职 专 业 软 件 开 发 者 进 行 赢 利 。

Google 自 身 通 过 基 于 统 一 平 台 为 用 户 提 供 信 息 来 盈 利 。

Android 的 优 势


源 代 码 完 全 开 放 , 便 于 开 发 人 员 更 清 楚 的 把 握 实 现 细 节 , 便 于 提 高 开 发 人 员 的 技 术 水 平 , 有 利 于 开 发 出

更 具 差 异 性 的 应 用 。

采 用 了 对 有 限 内 存 、 电 池 和 CPU 优 化 过 的 虚 拟 机 Dalvik,Android 的 运 行 速 度 比 想 象 的 要 快 很 多 。

运 营 商 ( 中 国 移 动 等 ) 的 大 力 支 持 , 产 业 链 条 的 热 捧 。

良 好 的 盈 利 模 式 (3/7 开 ), 产 业 链 条 的 各 方 : 运 营 商 、 制 造 商 、 独 立 软 件 生 产 商 都 可 以 获 得 不 错 的 利 益 。

将 移 动 终 端 的 评 价 标 准 从 硬 件 向 软 件 转 变 , 极 大 的 激 发 了 软 件 开 发 者 的 热 情 。

Android 的 源 代 码 遵 循 Apache V2 软 件 许 可 , 而 不 是 通 常 的 GPL v2 许 可 。 有 利 于 商 业 开 发 。

具 有 强 大 的 Linux 社 区 的 支 持 。

Android 的 不 足


由 于 采 用 了 Java 作 为 应 用 开 发 语 言 , 目 前 可 用 的 传 统 第 三 方 应 用 还 很 少 , 但 由 于 Android 是 一 款 完 全 开

源 的 移 动 计 算 平 台 , 相 信 第 三 方 应 用 会 很 快 的 丰 富 起 来 。


Google 提 供 了 一 套 Java 核 心 包 (J2SE 5,J2SE 6) 的 有 限 子 集 , 尚 不 承 诺 遵 守 Java 任 何 Java 规 范 , 可 能 会 造

成 Java 阵 营 的 进 一 步 分 裂 。

现 有 应 用 完 善 度 不 太 够 , 需 要 的 开 发 工 作 量 较 大 。

5


-----------------------------------Android 编 程 基 础

基 于 QEMU 开 发 的 模 拟 器 调 试 手 段 不 十 分 丰 富 , 只 支 持 通 话 、SMS 等 , 速 度 慢 。


暂 不 具 备 Push Mail 和 Office(DataViz、 QuickOffice 计 划 近 期 推 出 ) 功 能 , 目 前 主 要 面 向 的 是 普 通 消 费 者

用 户 , 对 商 业 用 户 支 持 尚 弱 。

Android 带 来 的 影 响

ANDROID 的 推 出 后 可 能 影 响 的 产 业 包 括 移 动 电 信 业 , 软 件 开 发 业 , 手 机 制 造 业 , 在 以 消 费 者 为 核 心 的 状 态 。

对 消 费 者 的 影 响

高 档 手 机 选 择 面 增 加 。


Android 在 设 计 初 期 就 考 虑 了 与 现 其 有 业 务 的 融 合 , 改 变 以 往 从 计 算 机 为 主 改 成 从 手 机 使 用 为 导 向 。 新

生 应 用 如 :Google 地 图 及 其 衍 生 应 用 、GMail、GTalk 等 。

GPS 卫 星 导 航 功 能 , 手 机 照 相 ,MP3, 蓝 芽 等 均 被 列 为 Android 所 提 供 支 持 的 基 本 选 项 。


Android 的 平 台 基 本 上 是 免 费 的 , 虽 然 有 部 份 原 生 链 接 库 会 要 求 费 用 , 但 大 部 份 是 免 权 利 金 ;Android

程 序 可 以 采 用 JAVA 开 发 , 但 是 因 为 它 的 虚 拟 机 (Virtual Machine) Dalvik, 是 将 JAVA 的 bytecode 转 成 自

己 的 格 式 , 回 避 掉 需 要 付 给 SUN 有 关 JAVA 的 授 权 费 用 。

对 手 机 制 造 者 的 影 响


Android 是 款 开 源 的 移 动 计 算 软 件 平 台 , 组 建 了 google 主 导 的 拥 有 众 多 产 业 界 巨 头 的 产 业 联 盟 , 有 利 于

高 效 开 发 、 降 低 成 本 。


由 于 是 源 代 码 开 放 的 产 品 , 对 非 主 导 厂 商 而 言 , 可 以 避 开 与 主 导 厂 商 在 核 心 技 术 上 面 的 差 距 , 开 发 出 更

具 竞 争 力 和 差 异 化 的 产 品 。

对 运 营 商 的 影 响

丰 富 的 数 据 业 务 , 将 导 致 数 据 流 量 的 显 著 增 加 。

手 机 来 源 增 加 , 价 格 更 为 低 廉 。

对 软 件 开 发 者 的 影 响

因 为 Android 移 动 软 件 平 台 抱 持 开 放 互 通 的 观 念 , 势 必 吸 引 不 少 自 由 软 件 的 拥 护 者 。

开 发 方 向 有 三 个 重 点 :

6


-----------------------------------Android 编 程 基 础

‣ 应 用 软 件 的 开 发

‣ 特 殊 功 能 的 原 生 链 接 库

‣ 专 属 应 用 程 序 框 架

由 于 Android 的 App Market 性 质 , 可 能 催 生 出 专 门 的 应 用 软 件 开 发 商 。

Android 应 用 现 状

设 备 商 :lenovo、 琦 基 、 戴 尔 、 三 星 、 摩 托 罗 拉 、 华 为 、 英 特 尔 、Kogan、 索 爱 、 华 硕 、 多 普 达 、 爱 可 视 、

Archos 等 。

制 造 商 :HTC、Telstra 等 。

手 机 设 计 公 司 : 播 思 、 德 信 无 线 等 。

运 营 商 : 中 国 移 动 、Sprint、T-Mobile、Teleca AB 等 。

芯 片 商 :Qualcomm、Marvell、TI、Boardcom 等 。

7


-----------------------------------Android 编 程 基 础

Android 开 发 入 门

System Requirements

The sections below describe the system and software requirements for developing Android applications using the

Android SDK tools included in Android 1.1 SDK, Release 1.

Supported Operating Systems

• Windows XP (32-bit) or Vista (32- or 64-bit)

• Mac OS X 10.4.8 or later (x86 only)

• Linux (tested on Linux Ubuntu Dapper Drake)

Supported Development Environments

Eclipse IDE

o

o

o

o

Eclipse 3.3 (Europa), 3.4 (Ganymede)

• Eclipse JDT plugin (included in most Eclipse IDE packages)

• WST (optional, but needed for the Android Editors feature; included in most Eclipse IDE

packages)

JDK 5 or JDK 6 (JRE alone is not sufficient)

Android Development Tools plugin (optional)

Not compatible with Gnu Compiler for Java (gcj)

Other development environments or IDEs

o

o

o

JDK 5 or JDK 6 (JRE alone is not sufficient)

Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows

Not compatible with Gnu Compiler for Java (gcj)

Note: If JDK is already installed on your development computer, please take a moment to make sure that it meets the

version requirements listed above. In particular, note that some Linux distributions may include JDK 1.4 or Gnu

Compiler for Java, both of which are not supported for Android development

8


-----------------------------------Android 编 程 基 础

什 么 是 Android?

Android 是 一 个 专 门 针 对 移 动 设 备 的 软 件 集 , 它 包 括 一 个 操 作 系 统 , 中 间 件 和 一 些 重 要 的 应 用 程 序 。Beta 版

Android SDK 提 供 了 在 Android 平 台 上 使 用 JaVa 语 言 进 行 Android 应 用 开 发 必 须 的 工 具 和 API 接 口 。

特 性

• 应 用 程 序 框 架 支 持 组 件 的 重 用 与 替 换

• Dalvik 虚 拟 机 专 为 移 动 设 备 优 化

• 集 成 的 浏 览 器 基 于 开 源 的 WebKit 引 擎

• 优 化 的 图 形 库 包 括 定 制 的 2D 图 形 库 ,3D 图 形 库 基 于 OpenGL ES 1.0 ( 硬 件 加 速 可 选 )

• SQLite 用 作 结 构 化 的 数 据 存 储

• 多 媒 体 支 持 包 括 常 见 的 音 频 、 视 频 和 静 态 图 像 格 式 ( 如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG,

GIF)

• GSM 电 话 技 术 ( 依 赖 于 硬 件 )

• 蓝 牙 Bluetooth, EDGE, 3G, 和 WiFi( 依 赖 于 硬 件 )

• 照 相 机 ,GPS

GPS, 指 南 针 , 和 加 速 度 计 (accelerometer

accelerometer) ( 依 赖 于 硬 件 )

• 丰 富 的 开 发 环 境 包 括 设 备 模 拟 器 , 调 试 工 具 , 内 存 及 性 能 分 析 图 表 , 和 Eclipse 集 成 开 发 环 境 插 件

应 用 程 序

Android 会 同 一 系 列 核 心 应 用 程 序 包 一 起 发 布 , 该 应 用 程 序 包 包 括 email 客 户 端 ,SMS 短 消 息 程 序 , 日 历 ,

地 图 , 浏 览 器 , 联 系 人 管 理 程 序 等 。 所 有 的 应 用 程 序 都 是 使 用 JAVA 语 言 编 写 的 。

应 用 程 序 框 架

开 发 人 员 也 可 以 完 全 访 问 核 心 应 用 程 序 所 使 用 的 API 框 架 。 该 应 用 程 序 的 架 构 设 计 简 化 了 组 件 的 重 用 ; 任 何

一 个 应 用 程 序 都 可 以 发 布 它 的 功 能 块 并 且 任 何 其 它 的 应 用 程 序 都 可 以 使 用 其 所 发 布 的 功 能 块 ( 不 过 得 遵 循 框

架 的 安 全 性 限 制 )。 同 样 , 该 应 用 程 序 重 用 机 制 也 使 用 户 可 以 方 便 的 替 换 程 序 组 件 。

隐 藏 在 每 个 应 用 后 面 的 是 一 系 列 的 服 务 和 系 统 , 其 中 包 括 ;

• 丰 富 而 又 可 扩 展 的 视 图 (Views), 可 以 用 来 构 建 应 用 程 序 , 它 包 括 列 表 (lists), 网 格 (grids), 文

本 框 (text boxes), 按 钮 ( buttons), 甚 至 可 嵌 入 的 web 浏 览 器 。

• 内 容 提 供 器 (Content Providers) 使 得 应 用 程 序 可 以 访 问 另 一 个 应 用 程 序 的 数 据 ( 如 联 系 人 数 据 库 ), 或

者 共 享 它 们 自 己 的 数 据

• 资 源 管 理 器 (Resource Manager) 提 供 非 代 码 资 源 的 访 问 , 如 本 地 字 符 串 , 图 形 , 和 布 局 文 件 ( layout

files )。

• 通 知 管 理 器 (Notification Manager) 使 得 应 用 程 序 可 以 在 状 态 栏 中 显 示 自 定 义 的 提 示 信 息 。

• 活 动 管 理 器 ( Activity Manager) 用 来 管 理 应 用 程 序 生 命 周 期 并 提 供 常 用 的 导 航 回 退 功 能 。

9


-----------------------------------Android 编 程 基 础

程 序 库

Android 包 含 一 些 C/C++ 库 , 这 些 库 能 被 Android 系 统 中 不 同 的 组 件 使 用 。 它 们 通 过 Android 应 用 程 序 框 架

为 开 发 者 提 供 服 务 。 以 下 是 一 些 核 心 库 :

• 系 统 C 库 - 一 个 从 BSD 继 承 来 的 标 准 C 系 统 函 数 库 ( libc ), 它 是 专 门 为 基 于 embedded linux

的 设 备 定 制 的 。

• 媒 体 库 - 基 于 PacketVideo OpenCORE; 该 库 支 持 多 种 常 用 的 音 频 、 视 频 格 式 回 放 和 录 制 , 同 时 支 持

静 态 图 像 文 件 。 编 码 格 式 包 括 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

• Surface Manager - 对 显 示 子 系 统 的 管 理 , 并 且 为 多 个 应 用 程 序 提 供 了 2D 和 3D 图 层 的 无 缝 融 合 。

• LibWebCore - 一 个 最 新 的 web 浏 览 器 引 擎 用 , 支 持 Android 浏 览 器 和 一 个 可 嵌 入 的 web 视 图 。

• SGL - 底 层 的 2D 图 形 引 擎

• 3D libraries - 基 于 OpenGL ES 1.0 APIs 实 现 ; 该 库 可 以 使 用 硬 件 3D 加 速 ( 如 果 可 用 ) 或 者 使 用 高

度 优 化 的 3D 软 加 速 。

• FreeType - 位 图 (bitmap) 和 矢 量 (vector) 字 体 显 示 。

• SQLite - 一 个 对 于 所 有 应 用 程 序 可 用 , 功 能 强 劲 的 轻 型 关 系 型 数 据 库 引 擎 。

Android 运 行 库

Android 包 括 了 一 个 核 心 库 , 该 核 心 库 提 供 了 JAVA 编 程 语 言 核 心 库 的 大 多 数 功 能 。

每 一 个 Android 应 用 程 序 都 在 它 自 己 的 进 程 中 运 行 , 都 拥 有 一 个 独 立 的 Dalvik 虚 拟 机 实 例 。Dalvik 被 设 计

成 一 个 设 备 可 以 同 时 高 效 地 运 行 多 个 虚 拟 系 统 。 Dalvik 虚 拟 机 执 行 (.dex) 的 Dalvik 可 执 行 文 件 , 该 格 式 文

件 针 对 小 内 存 使 用 做 了 优 化 。 同 时 虚 拟 机 是 基 于 寄 存 器 的 , 所 有 的 类 都 经 由 JAVA 编 译 器 编 译 , 然 后 通 过 SDK

中 的 "dx" 工 具 转 化 成 .dex 格 式 由 虚 拟 机 执 行 。

Dalvik 虚 拟 机 依 赖 于 linux 内 核 的 一 些 功 能 , 比 如 线 程 机 制 和 底 层 内 存 管 理 机 制 。

Linux 内 核

Android 的 核 心 系 统 服 务 依 赖 于 Linux 2.6 内 核 , 如 安 全 性 , 内 存 管 理 , 进 程 管 理 , 网 络 协 议 栈 和 驱 动 模 型 。

Linux 内 核 也 同 时 作 为 硬 件 和 软 件 栈 之 间 的 抽 象 层 。

10


-----------------------------------Android 编 程 基 础

Android 的 系 统 架 构

系 统 构 架

Android 内 核

Linux 内 核 版 本 2.6

位 于 硬 件 和 软 件 堆 之 间 的 抽 象 层

核 心 服 务 : 安 全 机 制 、 内 存 管 理 、 进 程 管 理 、 网 络 、 硬 件 驱 动 。

Android 依 赖 Linux 内 核 2.6 提 供 核 心 服 务 , 比 如 安 全 、 内 存 管 理 、 进 程 管 理 、 网 络 、 硬 件 驱 动 。 在 这 里 ,Linux

内 核 扮 演 的 是 硬 件 层 和 系 统 其 它 层 次 之 间 的 一 个 抽 象 层 的 概 念 。 这 个 操 作 系 统 并 非 类 GNU/Linux 的 , 因 为 其

系 统 库 , 系 统 初 始 化 和 编 程 接 口 都 和 标 准 的 Linux 系 统 是 有 所 不 同 的 。

11


-----------------------------------Android 编 程 基 础

从 Google 目 前 release 的 Linux 系 统 来 看 , 其 没 有 虚 拟 内 存 文 件 系 统 , 系 统 所 用 的 是 yaffs2 文 件 系 统 , 具 体

的 映 像 也 都 位 于 SDK 安 装 目 录 下 。 通 过 emulator -console 命 令 , 我 们 可 以 在 host 中 断 下 得 到 一 个 简 单 的 可 以

控 制 Android 的 shell , 这 个 系 统 包 含 了 一 个 Toolbox , 提 供 一 些 基 本 的 命 令 工 具 , 集 中 在

/sbin,/system/sbin,/system/bin 中 , 但 是 很 简 陋 , 命 令 种 类 也 很 少 。

目 前 Android 的 程 序 安 装 模 式 是 靠 Eclipse 自 动 进 行 的 , 通 过 对 底 层 的 分 析 可 知 , 大 致 步 骤 就 是 在 /data/app 和

data/data 下 存 放 android 底 层 和 普 通 内 核 没 有 什 么 大 的 区 别 , 我 们 可 以 将 其 作 为 一 个 Linux 来 进 行 开 发 和

hacking。

Lib 和 运 行 环 境

lib

C/C++ 库 : 被 各 种 Android 组 件 使 用

通 过 应 用 程 序 框 架 开 发 者 可 以 使 用 其 功 能

包 括 :

‣ 媒 体 库 :MPEG4 H.264 MP3 JPG PNG .....

‣ WebKit/LibWebCore:Web 浏 览 引 擎

‣ SQLite 关 系 数 据 库 引 擎

‣ 2D,3D 图 形 库 、 引 擎

丰 富 的 类 库 支 持 :2D 和 3D 图 像 库 OpenGL ES、 数 据 库 SQLite、 对 象 数 据 库 db4o 类 库 、 媒 体 库 、 基 于 Linux

底 层 系 统 C 库 等 等 , 让 应 用 开 发 更 简 单 多 样 。Google 使 用 Apache 的 Harmony 类 库 ,Harmony 某 些 方 面 速 度

快 于 Sun 的 VM。Runtime 在 Dalvik Java VM 上 ,Dalvik 采 用 简 练 、 高 效 的 byte code 格 式 运 行 , 它 能 够 在 低

资 耗 和 没 有 应 用 相 互 干 扰 的 情 况 下 并 行 执 行 多 个 应 用 。

运 行 时 环 境






核 心 库 提 供 的 Java 功 能

Dalvik 虚 拟 机 依 赖 于 Linux 内 核 , 例 如 线 程 或 底 层 内 存 管 理

设 备 可 以 运 行 多 个 Dalvik 虚 拟 机 , 每 一 个 Android 应 用 程 序 在 它 自 己 的 Dalvik VM 实 例 中 运 行

VM 执 行 优 化 的 Dalvik 可 执 行 文 件 (.dex)

Dx- 工 具 把 编 译 过 的 Java 文 件 转 换 为 dex 文 件

12


-----------------------------------Android 编 程 基 础

应 用 和 框 架

核 心 应 用 , 例 如 联 系 人 , 电 子 邮 件 , 电 话 , 浏 览 器 , 日 历 , 地 图 , ...

充 分 访 问 所 有 核 心 应 用 框 架 API

简 化 组 件 的 重 用

用 Java 编 写 应 用 程 序

13


-----------------------------------Android 编 程 基 础

支 持 的 功 能

+ Application framework: 可 重 用 的 和 可 替 换 的 组 件 部 分 , 在 这 个 层 面 上 , 所 有 的 软 件 都 是 平 等 的 。

+ Dalvik virtul machine: 一 个 基 于 Linux 的 虚 拟 机 。

+ Integrated browser: 一 个 基 于 开 源 的 WebKit 引 擎 的 浏 览 器 , 在 应 用 程 序 层 。

+ Optimized graphics: 包 含 一 个 自 定 义 的 2D 图 形 库 和 基 于 OpenGL ES 1.0 标 准 的 3D 实 现 。

+ SQLite: 数 据 库

+ Media support: 通 用 的 音 频 , 视 频 和 对 各 种 图 片 格 式 的 支 持 (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)

+ GSM Telephony: GSM 移 动 网 络 , 硬 件 支 持 。

+ Bluetooth, EDGE, 3G, and WiFi: 都 依 赖 于 硬 件 支 持 。

+ Camera, GPS, compass, and accelerometer: 都 依 赖 于 硬 件 支 持 。

+ Rich development environment: 包 含 一 套 完 整 的 开 发 工 具 集 , 方 便 跟 踪 调 试 , 内 存 检 测 和 性 能 测 试 , 而 且

提 供 了

Eclipse 的 插 件 。 最 底 层 的 是 一 个 Linux Kernel, 加 载 了 几 个 移 动 设 备 必 要 的 系 统 驱 动 ( 这 么 说 来 Android

础 系 统 是 要 以 GPL 发 布 了 ? 不 知 道 34 家 厂 商 的 硬 件 开 发 商 们 是 怎 么 样 想 的 ); 上 面 是 类 库 和 Runtime, 绿 色

的 类 库 部 分 可 以 看 到 大 名 鼎 鼎 的 SQLite, 这 个 软 件 甚 至 声 称 自 己 属 于 公 共 领 域 ( 比 MIT License 还 要 强 @@),

字 体 FreeType 是 BSD-style License 的 , 图 形 库 OpenGL ES 只 需 通 过 产 品 测 试 , 无 偿 使 用 于 产 品 。 再 向 上 看

是 应 用 层 的 东 西 了 , 这 里 可 以 做 的 事 情 就 非 常 多 了 , 各 个 社 区 , 各 个 厂 家 都 可 以 参 与 进 来 。 难 怪 Android 的 sdk

可 以 Apache License 发 布 了 , 对 企 业 和 开 发 人 员 友 好 啊 。 那 么 Google 自 己 的 东 西 在 哪 里 呢 ? 没 错 , 就 是 右

边 那 个 runtime, 最 吸 引 技 术 人 员 的 就 是 这 个 runtime( 注 意 , 这 个 才 是 Android 的 核 心 )。Google 为 它 准 备 了

一 个 虚 拟 机 , 叫 做 Dalvik。 这 个 让 人 摸 不 着 头 脑 的 东 西 的 到 底 是 什 么 ? 从 开 发 平 台 上 我 们 清 清 楚 楚 地 得 到 了

答 案 :Java

14


-----------------------------------Android 编 程 基 础

封 面

15


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

7 个 Linux 手 机 平 台








Maemo

Android

LIMO

OpenMOKO

GPE^2

ALP

QTopia Phone Edition

Maemo 架 构

2


-----------------------------------Android 编 程 基 础

Android 架 构

3


-----------------------------------Android 编 程 基 础

LIMO 架 构

4


-----------------------------------Android 编 程 基 础

OpneMOKO 架 构

5


-----------------------------------Android 编 程 基 础

GPE^2 架 构

6


-----------------------------------Android 编 程 基 础

ALP 架 构

7


-----------------------------------Android 编 程 基 础

QTopia Phone Edition 架 构

8


-----------------------------------Android 编 程 基 础

进 程 间 的 通 信

Linux 手 机 平 台 进 程 间 通 信








Maemo 采 用 D-BUS

Android 采 用 OpenBinder

LiMO 采 用 D-BUS

OpenMoko 采 用 D-BUS

GPE Phone Edition 采 用 D-BUS

ALC 采 用 OpenBinder

Qtopia Phone Edition 采 用 D-BUS

进 程 间 通 信 种 类






D-BUS

Openbinder

CORBA/Corbit

IVY

GNET

D-BUS

9


-----------------------------------Android 编 程 基 础

Android 学 习 方 法

1

2

3

4

了 解 什 么 是 Androi

建 立 开 发 环 境

阅 读 SDK 文 档

背 景 知 识

Java

面 向 对 象

设 计 模 式

J2ME、Brew、Symbian

建 立 Android 开 发 环 境

1 下 载 JDK 5 or JDK 6 (JRE alone is not sufficient) -> 安 装 -> 设 置 环 境 变 量

JAVA_HOME CLASSPATH path

2 下 载 Eclipse 3.3 (Europa), 3.4 (Ganymede) IDE for JAVA-> 解 压

3 下 载 Android SDK 解 压 -> path 里 加 入 SDK 包 中 的 tools 目 录 全 路 径

4 下 载 ADT 0.8.0 解 压

5 打 开 Eclipse 安 装 ADT 插 件

10


-----------------------------------Android 编 程 基 础

封 面

11


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

Android 开 发 环 境 搭 建

ADV 的 创 建

ADT0.9.1 版 本

1

在 Eclipse 中 创 建

2


-----------------------------------Android 编 程 基 础

2

在 命 令 行 中 创 建

打 开 CMD 命 令 行 , 进 入 到 Android SDK tools 目 录

cd

E:\Mobile DEV\Android_SDK1.5\tools

使 用 android 命 令 列 出 target 值

android list targets

使 用 android create avd 命 令 来 创 建 AVD

行 为 :"create avd":

创 建 一 个 新 的 Android 虚 拟 设 备 。

选 项 :

-t --target 新 的 AVD 的 Target ID( 必 须 )

-c --sdcard 指 向 一 个 共 享 的 SD 存 储 卡 的 路 径 或 是 为 新 的 AVD 定 制 的 新 SD 存 储 卡 的 容 量 大 小

-p --path 新 AVD 将 被 创 建 的 位 置 路 径

-n --name 新 AVD 的 名 称 ( 必 须 )

-f --force 强 制 创 建 ( 覆 盖 已 存 在 的 AVD)

-s --skin 新 AVD 的 皮 肤

3


-----------------------------------Android 编 程 基 础

例 子 : 将 建 一 个 名 叫 GPhone 的 AVD,Target ID=2、SD 存 储 卡 容 量 52M、 路 径 C:\AVD\、 皮 肤 SUSE-HVGA-P

android create avd -n GPhone -t 2 -c 52M -p C:\AVD\ -s SUSE-HVGA-P

查 看 自 己 新 创 建 的 ADV :list avd 命 令

android list avd

ADT0.9.0 版 本

只 能 在 命 令 行 中 创 建

开 启 命 令 行 进 入 Android SDK tools 目 录

cd E:\Mobile DEV\Android_SDK1.5\tools

列 出 Target ID

andriod list target

创 建 一 个 新 的 AVD

android create avd -n GPhone -t 2 -c 52M -p C:\AVD\ -s SUSE-HVGA-P

查 看 新 创 建 的 AVD

android list avd

运 行 指 定 的 AVD

运 行 新 创 建 的 AVD:GPhone

emulator -avd GPhone

4


-----------------------------------Android 编 程 基 础

Windows 平 台 :

Eclipse IDE 版 本

1. 必 须 软 件

------------JDK+Eclipse+Android SDK+ADT

1 JAVA JDK SE 1.6 jdk-6u13-windows-i586-p.exe

2 Eclipse 3.4.2 eclipse-java-ganymede-SR2-win32.zip

3 Google Android SDK android-sdk-windows-1.5_r1.zip

4 ADT-0.9.0 ADT-0.9.0.zip

2. 安 装 过 程

1 安 装 JAVA JDK SE 1.6

‣ 设 置 环 境 变 量

JAVA_HOME

JAVA_HOME=C:\Program Files\Java\jdk1.6.0_13


JAVA_JRE_HOME

JAVA_JRE_HOME=C:\Program Files\Java\jdk1.6.0_13\jre


JRE_HOME

JRE_HOME=C:\Program Files\Java\jre6


Android_SDK_HOME

Android_SDK_HOME=C:\Mobile Phone DEV\Android SDK


CLASSPATH

CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.

jar;%JRE_HOME%\lib;%JRE_HOME%\lib\rt.jar;%JAVA_JRE_HOME%\lib;%JAVA_JRE_HOME%

\lib\rt.jar

Path

要 使 用 命 令 行 工 具 必 须 配 置

Path=%Android_SDK_HOME%\tools;%JAVA_HOME%\bin;%JRE_HOME%\bin;%JAVA_JRE

_HOME%\bin;

5


-----------------------------------Android 编 程 基 础

2 解 压 Eclipse 3.4.2

解 压 eclipse-java-ganymede-SR2-win32.zip

到 C:\Eclipse For Android\

3

解 压 Google Android SDK

解 压 android-sdk-windows-1.5_r1.zip 到 C:\Mobile Phone DEV\Android SDK

4 Eclipse 下 安 装 ADT 0.9.0

复 制 ADT-0.9.0.zip 到 C:\

打 开 C:\Eclipse For Android\eclipse.exe

设 置 工 作 路 径 为 C:\WorkSpace

Help->SoftWare Update->find and install ->Search for new features to install ->Next->New Archived

site-> 选 中 C:\ ADT-0.9.0.zip->OK->Finish->ADT-0.9.0.zip 选 勾 ->Next->Accept->Next->Finish-

>Install All->Restart “YES”

5

设 置 Google Android SDK 路 径

Window->preferences-> 选 中 Android->SDK Location 中 选 择 Google Android SDK 的 安 装 路 径

C:\Mobile Phone DEV\Android SDK->OK

6


-----------------------------------Android 编 程 基 础

3. HelloWorld 程 序 实 例

1

新 建 一 个 Android Project

• Project name 设 置 工 程 名 Hello Google Android

• Package name 设 置 包 名 zyf.android.test.hello

• Activity name 设 置 活 动 名 Hello

• Application name

设 置 应 用 程 序 名 Hello

• Build Target 设 置 AVD API 的 版 本 3 Android1.5

7


-----------------------------------Android 编 程 基 础

8


-----------------------------------Android 编 程 基 础

2 修 改 Hello.java 文 件 内 容 如 下 :

package zyf.android.test.hello;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class Hello extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// setContentView(R.layout.main);

TextView tv = new TextView(this

this);

tv.setText(" 这 是 一 个 测 试 Android 的 helloWorld");

}

}

setContentView(tv);

3

运 行 as Android

9


-----------------------------------Android 编 程 基 础

4 代 码 分 析 :

Android 中 , 用 户 界 面 控 件 被 封 装 成 了 各 种 Class 叫 做 Views。 一 个 View 是 一 个 可 以 显 示 的 控 件 对

象 , 比 如 RadioButton,Animation,TextLable 等 。 其 中 的 一 个 简 单 的 控 件 是 TextView:

TextView tv = new TextView(this

this);

传 入 TextView 构 造 函 数 的 参 数 是 一 个 Context 对 象 , 通 过 这 个 对 象 可 以 使 用 系 统 提 供 的 功 能 接 口 , 比

如 加 载 资 源 , 访 问 数 据 库 和 共 享 数 据 等 等 。Activity 类 从 Context 类 继 承 而 来 , 所 以 Activity 本 身 是

一 个 Context(Java 中 的 继 承 概 念 )。

TextView 对 象 构 建 以 后 就 可 以 设 置 要 显 示 的 数 据 了 。

tv.setText(" 这 是 一 个 测 试 Android 的 helloWorld");

最 后 是 连 接 TextView 到 屏 幕 , 类 似 这 样 :

setContentView(tv);

setContentView() 方 法 可 以 控 制 具 体 哪 一 个 控 件 和 系 统 的 UI 联 系 起 来 ( 我 的 理

解 是 设 置 为 主 显 示 View)。 如 果 没 有 设 置 , 屏 幕 中 将 会 显 示 空 白 。

5

结 果

10


-----------------------------------Android 编 程 基 础

11


-----------------------------------Android 编 程 基 础

Apache Ant IDE 版 本

------------JDK+Android SDK +Ant

1. 必 须 软 件

1 JAVA JDK SE 1.6 jdk-6u13-windows-i586-p.exe

2 Google Android SDK android-sdk-windows-1.5_r1.zip

3 Apache Ant apache-ant-1.7.1-bin.zip

2. 安 装 过 程

1 安 装 JAVA JDK SE 1.6

‣ 设 置 环 境 变 量


JAVA_HOME

JAVA_HOME=C:\Program Files\Java\jdk1.6.0_13


JAVA_JRE_HOME

JAVA_JRE_HOME=C:\Program Files\Java\jdk1.6.0_13\jre


JRE_HOME

JRE_HOME=C:\Program Files\Java\jre6

Android_SDK_HOME

Android_SDK_HOME=C:\Mobile Phone DEV\Android SDK

ANT_HOME

ANT_HOME=C:\Mobile Phone DEV\Apache Ant\apache-ant-1.7.1

CLASSPATH

CLASSPATH=.;%ANT_HOME%\lib;%ANT_HOME%\lib\ant.jar;%JAVA_HOME%\lib;%JAV

A_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JRE_HOME%\lib;%JRE_HOME%\lib\r

t.jar;%JAVA_JRE_HOME%\lib;%JAVA_JRE_HOME%\lib\rt.jar

Path

Path=%ANT_HOME%\bin;%Android_SDK_HOME%\tools;%JAVA_HOME%\bin;%JRE_HO

ME%\bin;%JAVA_JRE_HOME%\bin;

12


-----------------------------------Android 编 程 基 础

2

解 压 Google Android SDK

解 压 android-sdk-windows-1.5_r1.zip

到 C:\Mobile Phone DEV\Android SDK

3

解 压 apache-ant-1.7.1.zip

解 压 Apache Ant apache-ant-1.7.1.zip

到 C:\Mobile Phone DEV\Apache Ant\apache-ant-1.7.1

3.HelloWorld 程 序 实 例

1 开 始 -> 运 行 ->cmd

2 cd C:\Mobile Phone DEV\WorkSpace

3 使 用 命 令 行 工 具 来 创 建 一 个 新 工 程

android create project -k zyf.hello -n HelloAndroid -t 2 -a AntActivity -p ./Hello

4 cd Hello

5 ant debug

6 cd bin

7 emulator -avd Android_SDK1.5

8 adb install ./hello-debug.apk

9 在 模 拟 器 中 运 行 hello 程 序

结 果

13


-----------------------------------Android 编 程 基 础

Linux 平 台 :

JDK+Eclipse+Android SDK+ADT

JDK+Android SDK +Ant

14


-----------------------------------Android 编 程 基 础

应 用 解 析

Activity :

活 动 是 最 基 本 的 Android 应 用 程 序 组 件 , 应 用 程 序 中 , 一 个 活 动 通 常 就 是 一 个 单 独 的 屏 幕 。 每 一 个 活 动

都 被 实 现 为 一 个 独 立 的 类 , 并 且 从 活 动 基 类 中 继 承 而 来 , 活 动 类 将 会 显 示 由 视 图 控 件 组 成 的 用 户 接 口 , 并 对

事 件 做 出 响 应 。 大 多 数 的 应 用 是 由 多 个 屏 幕 显 示 组 成 。 例 如 : 一 个 文 本 信 息 的 应 用 也 许 有 一 个 显 示 发 送 消 息 的

联 系 人 列 表 屏 幕 , 第 二 个 屏 幕 用 来 写 文 本 消 息 和 选 择 收 件 人 , 再 来 一 个 屏 幕 查 看 消 息 历 史 或 者 消 息 设 置 操 作

等 。 这 里 每 一 个 这 样 的 屏 幕 就 是 一 个 活 动 , 很 容 易 实 现 从 一 个 屏 幕 到 一 个 新 的 屏 幕 并 且 完 成 新 的 活 动 。 在 某

些 情 况 下 当 前 的 屏 幕 也 许 需 要 向 上 一 个 屏 幕 活 动 提 供 返 回 值 -- 比 如 让 用 户 从 手 机 中 挑 选 一 张 照 片 返 回 通 讯 录

做 为 电 话 拨 入 者 的 头 像 。

当 一 个 新 的 屏 幕 打 开 后 , 前 一 个 屏 幕 将 会 暂 停 , 并 保 存 在 历 史 堆 栈 中 。 用 户 可 以 返 回 到 历 史 堆 栈 中 的 前

一 个 屏 幕 。 当 屏 幕 不 再 使 用 时 , 还 可 以 从 历 史 堆 栈 中 删 除 。 默 认 情 况 下 ,Android 将 会 保 留 从 主 屏 幕 到 每 一

个 应 用 的 运 行 屏 幕 。

简 单 理 解 Activity 代 表 一 个 用 户 所 能 看 到 的 屏 幕 ,Activity 主 要 是 处 理 一 个 应 用 的 整 体 性 工 作 , 例 如 , 监

听 系 统 事 件 ( 按 键 事 件 、 触 摸 屏 事 件 等 )、 为 用 户 显 示 指 定 的 View, 启 动 其 他 Activity 等 。 所 有 应 用 的 Activity

都 继 承 于 android.app.Activity 类 , 该 类 是 Android 提 供 的 基 层 类 , 其 他 的 Activity 继 承 该 父 类 后 , 通 过 Override

父 类 的 方 法 来 实 现 各 种 功 能 , 这 种 设 计 在 其 他 领 域 也 较 为 常 见 。

Intent :

调 用 Android 专 有 类 Intent 进 行 架 构 屏 幕 之 间 的 切 换 。Intent 是 描 述 应 用 想 要 做 什 么 。Intent 数 据 结 构 两

个 最 重 要 的 部 分 是 动 作 和 动 作 对 应 的 数 据 。 典 型 的 动 作 类 型 有 :MAIN( 活 动 的 门 户 )、VIEW、PICK、EDIT

等 。 而 动 作 对 应 的 数 据 则 以 URI 的 形 式 进 行 表 示 。 例 如 : 要 查 看 某 个 人 的 联 系 方 式 , 你 需 要 创 建 一 个 动 作 类

型 为 VIEW 的 Intent, 以 及 一 个 表 示 这 个 人 的 URI。

Android 使 用 了 Intent 这 个 特 殊 类 , 实 现 在 屏 幕 与 屏 幕 之 间 移 动 。Intent 类 用 于 描 述 一 个 应 用 将 会 做 什 么

事 。 在 Intent 的 描 述 结 构 中 , 有 两 个 最 重 要 的 部 分 : 动 作 和 动 作 对 应 的 数 据 。 典 型 的 动 作 类 型 有 :M AIN(activity

的 门 户 )、VIEW、PICK、EDIT 等 。 而 动 作 对 应 的 数 据 则 以 URI 的 形 式 进 行 表 示 。 例 如 : 要 查 看 一 个 人 的 联

系 方 式 , 你 需 要 创 建 一 个 动 作 类 型 为 VIEW 的 intent, 以 及 一 个 表 示 这 个 人 的 URI。

与 之 有 关 系 的 一 个 类 叫 IntentFilter。 相 对 于 intent 是 一 个 有 效 的 做 某 事 的 请 求 , 一 个 intentfilter 则 用 于 描

述 一 个 activity( 或 者 IntentReceiver) 能 够 操 作 哪 些 intent。 一 个 activity 如 果 要 显 示 一 个 人 的 联 系 方 式 时 , 需

要 声 明 一 个 IntentFilter, 这 个 IntentFilter 要 知 道 怎 么 去 处 理 VIEW 动 作 和 表 示 一 个 人 的 URI。IntentFilter 需

要 在 AndroidManifest.xml 中 定 义 。

通 过 解 析 各 种 intent, 从 一 个 屏 幕 导 航 到 另 一 个 屏 幕 是 很 简 单 的 。 当 向 前 导 航 时 ,activity 将 会 调 用

startActivity(IntentmyIntent) 方 法 。 然 后 , 系 统 会 在 所 有 安 装 的 应 用 程 序 中 定 义 的 IntentFilter 中 查 找 , 找 到 最

匹 配 myIntent 的 Intent 对 应 的 activity。 新 的 activity 接 收 到 myIntent 的 通 知 后 , 开 始 运 行 。 当 startActivity 方

法 被 调 用 将 触 发 解 析 myIntent 的 动 作 , 这 个 机 制 提 供 了 两 个 关 键 好 处 :

15


-----------------------------------Android 编 程 基 础

A、Activities 能 够 重 复 利 用 从 其 它 组 件 中 以 Intent 的 形 式 产 生 的 一 个 请 求 ;

B、Activities 可 以 在 任 何 时 候 被 一 个 具 有 相 同 IntentFilter 的 新 的 Activity 取 代 。

IntentReceiver:

当 你 希 望 你 的 应 用 能 够 对 一 个 外 部 的 事 件 ( 如 当 电 话 呼 入 时 , 或 者 数 据 网 络 可 用 时 , 或 者 到 了 晚 上 时 ) 做 出 响

应 , 你 可 以 使 用 一 个 IntentReceiver。 虽 然 IntentReceiver 在 感 兴 趣 的 事 件 发 生 时 , 会 使 用 NotificationManager

通 知 用 户 , 但 它 并 不 能 生 成 一 个 UI。IntentReceiver 在 AndroidManifest.xml 中 注 册 , 但 也 可 以 在 代 码 中 使 用

Context.registerReceiver() 进 行 注 册 。 当 一 个 intentreceiver 被 触 发 时 , 你 的 应 用 不 必 对 请 求 调 用 intentreceiver,

系 统 会 在 需 要 的 时 候 启 动 你 的 应 用 。 各 种 应 用 还 可 以 通 过 使 用 Context.broadcastIntent() 将 它 们 自 己 的

intentreceiver 广 播 给 其 它 应 用 程 序 。

Service :

一 个 Service 是 一 段 长 生 命 周 期 的 , 没 有 用 户 界 面 的 程 序 。 比 较 好 的 一 个 例 子 就 是 一 个 正 在 从 播 放 列 表 中

播 放 歌 曲 的 媒 体 播 放 器 。 在 一 个 媒 体 播 放 器 的 应 用 中 , 应 该 会 有 多 个 activity, 让 使 用 者 可 以 选 择 歌 曲 并 播 放

歌 曲 。 然 而 , 音 乐 重 放 这 个 功 能 并 没 有 对 应 的 activity, 因 为 使 用 者 当 然 会 认 为 在 导 航 到 其 它 屏 幕 时 音 乐 应 该

还 在 播 放 的 。 在 这 个 例 子 中 , 媒 体 播 放 器 这 个 activity 会 使 用 Context.startService() 来 启 动 一 个 service, 从 而

可 以 在 后 台 保 持 音 乐 的 播 放 。 同 时 , 系 统 也 将 保 持 这 个 service 一 直 执 行 , 直 到 这 个 service 运 行 结 束 。 另 外 ,

我 们 还 可 以 通 过 使 用 Context.bindService() 方 法 , 连 接 到 一 个 service 上 ( 如 果 这 个 service 还 没 有 运 行 将 启 动

它 )。 当 连 接 到 一 个 service 之 后 , 我 们 还 可 以 service 提 供 的 接 口 与 它 进 行 通 讯 。 拿 媒 体 播 放 器 这 个 例 子 来 说 ,

我 们 还 可 以 进 行 暂 停 、 重 播 等 操 作 。

Content Provider :

Android 应 用 程 序 能 够 将 它 们 的 数 据 保 存 到 文 件 、SQLite 数 据 库 中 , 甚 至 是 任 何 有 效 的 设 备 中 。 当 你 想

将 你 的 应 用 数 据 与 其 它 的 应 用 共 享 时 , 内 容 提 供 器 就 可 以 发 挥 作 用 了 。 因 为 内 容 提 供 器 类 实 现 了 一 组 标 准 的

方 法 , 从 而 能 够 让 其 它 的 应 用 保 存 或 读 取 此 内 容 提 供 器 处 理 的 各 种 数 据 类 型 。

数 据 是 应 用 的 核 心 。 在 Android 中 , 默 认 使 用 鼎 鼎 大 名 的 SQLite 作 为 系 统 DB。 但 是 在 Android 中 , 使 用 方

法 有 点 小 小 的 不 一 样 。 在 Android 中 每 一 个 应 用 都 运 行 在 各 自 的 进 程 中 , 当 你 的 应 用 需 要 访 问 其 他 应 用 的 数

据 时 , 也 就 需 要 数 据 在 不 同 的 虚 拟 机 之 间 传 递 , 这 样 的 情 况 操 作 起 来 可 能 有 些 困 难 ( 正 常 情 况 下 , 你 不 能 读 取

其 他 的 应 用 的 db 文 件 ),ContentProvider 正 是 用 来 解 决 在 不 同 的 应 用 包 之 间 共 享 数 据 的 工 具 。

• 所 有 被 一 个 Android 应 用 程 序 创 建 的 偏 好 设 置 , 文 件 和 数 据 库 都 是 私 有 的 。

• 为 了 和 其 他 应 用 程 序 共 享 数 据 , 应 用 程 序 不 得 不 创 建 一 个 Content Provider

• 要 回 索 其 他 应 用 程 序 的 数 据 , 它 自 己 的 Content Provider 必 须 被 调 用

Android 本 地 Content Provider 包 括 :

‣ CallLog: 地 址 和 接 收 到 的 电 话 信 息

‣ Contact.People.Phones: 存 储 电 话 号 码

‣ Setting.System: 系 统 设 置 和 偏 好 设 置

‣ 等 等

16


-----------------------------------Android 编 程 基 础

封 面

17


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

Android 虚 拟 机 Dalvik

Dalvik 冲 击

随 着 Google 的 AndroidSDK 的 发 布 , 关 于 它 的 API 以 及 在 移 动 电 话 领 域 所 带 来 的 预

期 影 响 这 些 方 面 的 讨 论 不 胜 枚 举 。 不 过 , 其 中 的 一 个 话 题 在 Java 社 区 是 一 石 激 起 千 层 浪 ,

这 就 是 Android 平 台 的 基 础 ——Dalvik 虚 拟 机 。

Dalvik 和 标 准 Java 虚 拟 机 (JVM) 首 要 差 别

Dalvik 基 于 寄 存 器 , 而 JVM 基 于 栈 。, 基 于 寄 存 器 的 虚 拟 机 对 于 更 大 的 程 序 来 说 , 在 它 们 编 译 的 时 候 , 花 费

的 时 间 更 短 。

Dalvik 和 Java 运 行 环 境 的 区 别

Dalvik 经 过 优 化 , 允 许 在 有 限 的 内 存 中 同 时 运 行 多 个 虚 拟 机 的 实 例 , 并 且 每 一 个 Dalvik 应 用 作 为 一 个 独 立 的

Linux 进 程 执 行 。 独 立 的 进 程 可 以 防 止 在 虚 拟 机 崩 溃 的 时 候 所 有 程 序 都 被 关 闭 .

Dalvik 形 势

Dalvik 的 诞 生 也 导 致 人 们 开 始 忧 虑 Java 平 台 的 第 一 次 大 规 模 的 分 道 扬 镳 或 许 已 经 是 进 行 时 了 —— 有 人 已 经 把

Davlik 和 微 软 的 JVM 以 及 Sun 对 微 软 的 诉 讼 联 系 起 来 , 等 着 看 Google 身 上 是 否 也 会 发 生 类 似 事 情 ; 另 外 一

些 人 则 指 出 ,Google 并 没 有 宣 称 Dalvik 是 一 个 Java 实 现 , 而 微 软 却 是 这 样 做 的 。Sun 也 对 可 能 带 来 的 阵 营

分 裂 表 达 了 忧 虑 情 绪 , 并 提 出 和 Google 合 作 来 保 证 Dalvik 和 JVM 之 间 的 兼 容 性 ——Google 对 此 的 解 释 是 ,

Dalvik 是 对 解 决 目 前 JavaME 平 台 上 分 裂 的 一 次 尝 试 , 也 是 为 了 提 供 一 个 拥 有 较 少 限 制 许 可 证 的 平 台 。 甚 至

还 有 人 怀 疑 这 是 否 是 Sun 和 Google 两 大 阵 营 对 Java 之 未 来 的 一 次 大 规 模 较 量 。

2


-----------------------------------Android 编 程 基 础

Android 中 各 种 JAVA 包 的 功 能 描 述

Android 的 应 用 程 序 开 发 中 , 通 常 使 用 的 是 JAVA 语 言 , 除 了 需 要 熟 悉 JAVA 语

言 的 基 础 知 识 之 外 , 还 需 要 了 解 Android 提 供 的 扩 展 的 JAVA 功 能 。

在 一 般 的 JAVA 应 用 中 , 如 果 需 用 引 用 基 础 类 库 , 通 常 需 要 使 用 如 下 的 方 式 :

import javax.swing.*;

以 上 代 码 表 示 了 引 用 JAVA 的 GUI 组 件 Swing,javax.swing 即 JAVA 中 的 一 个 包 。

android 提 供 一 些 扩 展 的 JAVA 类 库 , 类 库 分 为 若 干 个 包 , 每 个 包 中 包 含 若 干 个 类 。

重 要 包 的 描 述 :

android.app : 提 供 高 层 的 程 序 模 型 、 提 供 基 本 的 运 行 环 境

android.content : 包 含 各 种 的 对 设 备 上 的 数 据 进 行 访 问 和 发 布 的 类

android.database : 通 过 内 容 提 供 者 浏 览 和 操 作 数 据 库

android.graphics : 底 层 的 图 形 库 , 包 含 画 布 , 颜 色 过 滤 , 点 , 矩 形 , 可 以 将 他 们 直 接 绘 制 到 屏 幕 上 .

android.location : 定 位 和 相 关 服 务 的 类

android.media : 提 供 一 些 类 管 理 多 种 音 频 、 视 频 的 媒 体 接 口

android.net : 提 供 帮 助 网 络 访 问 的 类 , 超 过 通 常 的 java.net.* 接 口

android.os : 提 供 了 系 统 服 务 、 消 息 传 输 、IPC 机 制

android.opengl : 提 供 OpenGL 的 工 具

android.provider : 提 供 类 访 问 Android 的 内 容 提 供 者

android.telephony : 提 供 与 拨 打 电 话 相 关 的 API 交 互

android.view : 提 供 基 础 的 用 户 界 面 接 口 框 架

android.util : 涉 及 工 具 性 的 方 法 , 例 如 时 间 日 期 的 操 作

android.webkit : 默 认 浏 览 器 操 作 接 口

android.widget : 包 含 各 种 UI 元 素 ( 大 部 分 是 可 见 的 ) 在 应 用 程 序 的 屏 幕 中 使 用

3


-----------------------------------Android 编 程 基 础

Android 的 相 关 文 件 类 型

Java 文 件 ----- 应 用 程 序 源 文 件

android 本 身 相 当 一 部 分 都 是 用 java 编 写 而 成 ( 基 本 上 架 构 图 里 头 蓝 色 的 部 份 都 是 用 Java 开 发 的 ),android 的

应 用 必 须 使 用 java 来 开 发 。

Class 文 件 ------Java 编 译 后 的 目 标 文 件

不 像 J2se,java 编 译 成 class 就 可 以 直 接 运 行 ,android 平 台 上 class 文 件 不 能 直 接 在 android 上 运 行 。 由 于 Google

使 用 了 自 己 的 Dalvik 来 运 行 应 用 , 所 以 这 里 的 class 也 肯 定 不 能 在 AndroidDalvik 的 java 环 境 中 运 行 ,android

的 class 文 件 实 际 上 只 是 编 译 过 程 中 的 中 间 目 标 文 件 , 需 要 链 接 成 dex 文 件 后 才 能 在 dalvik 上 运 行 。

Dex 文 件 -----Android 平 台 上 的 可 执 行 文 件

Android 虚 拟 机 Dalvik 支 持 的 字 节 码 文 件 格 式 Google 在 新 发 布 的 Android 平 台 上 使 用 了 自 己 的 Dalvik 虚 拟 机

来 定 义 , 这 种 虚 拟 机 执 行 的 并 非 Java 字 节 码 , 而 是 另 一 种 字 节 码 :dex 格 式 的 字 节 码 。 在 编 译 Java 代 码 之 后 ,

通 过 Android 平 台 上 的 工 具 可 以 将 Java 字 节 码 转 换 成 Dex 字 节 码 。 虽 然 Google 称 Dalvik 是 为 了 移 动 设 备 定

做 的 , 但 是 业 界 很 多 人 认 为 这 是 为 了 规 避 向 sun 申 请 Javalicense。 这 个 DalvikVM 针 对 手 机 程 式 /CPU 做 过 最

佳 化 , 可 以 同 时 执 行 许 多 VM 而 不 会 占 用 太 多 Resource。

Apk 文 件 -------Android 上 的 安 装 文 件

Apk 是 Android 安 装 包 的 扩 展 名 , 一 个 Android 安 装 包 包 含 了 与 某 个 Android 应 用 程 序 相 关 的 所 有 文 件 。apk

文 件 将 AndroidManifest.xml 文 件 、 应 用 程 序 代 码 (.dex 文 件 )、 资 源 文 件 和 其 他 文 件 打 成 一 个 压 缩 包 。 一 个 工

程 只 能 打 进 一 个 .apk 文 件 。

4


-----------------------------------Android 编 程 基 础

Android 的 应 用 程 序 结 构 分 析 :HelloActivity

本 例 以 一 个 简 单 的 HelloActivity 程 序 为 例 , 简 单 介 绍 Android 应 用 程 序 的 源 代 码 结 构 。 事 实

上 ,Android 应 用 程 序 虽 然 不 是 很 复 杂 , 但 是 通 常 涉 及 了 JAVA 程 序 ,XML 文 件 ,Makefile

多 方 面 的 内 容 。HelloActivity 虽 然 简 单 , 但 是 麻 雀 虽 小 , 五 脏 俱 全 , 是 学 习 Android 应 用 程

序 的 最 好 示 例 。

第 一 部 分 :HelloActivity

的 源 代 码

HelloActivity 工 程 的 源 代 码 在 Android 目 录 的 development/samples/HelloActivity/ 中 , 代 码 的

结 构 如 下 所 示 :

development/samples/HelloActivity/

|-- Android.mk

|-- AndroidManifest.xml

|-- res

| |-- layout

| | `-- hello_activity.xml

| `-- values

| `-- strings.xml

|-- src

| `-- com

| `-- example

| `-- android

| `-- helloactivity

| `-- HelloActivity.java

`-- tests

|-- Android.mk

|-- AndroidManifest.xml

`-- src

`-- com

`-- android

`-- helloactivity

`-- HelloActivityTest.java

其 中 tests 是 一 个 独 立 的 项 目 , 可 以 暂 时 不 考 虑 。 其 他 部 分 看 作 一 个 Android 的 一 应 用 程 序

的 工 程 。 这 个 工 程 主 要 的 组 成 部 分 如 下 所 示 :

AndroidManifest.xml: 工 程 的 描 述 文 件 , 在 运 行 时 有 用 处

Android.mk: 整 个 工 程 的 Makefile

5


-----------------------------------Android 编 程 基 础

res: 放 置 资 源 文 件 的 目 录

src/com/example/android/helloactivity/HelloActivity.java: 这 是 JAVA 类 文 件 , 这 个 文 件 的 路 径

表 示 在 Andorid 的 JAVA 包 的 结 构 中 的 位 置 , 这 个 包 的 使 用 方 式 为

com.example.android.helloactivity。

第 二 部 分 : 编 译 的 中 间 结 果

这 个 HelloActivity 工 程 经 过 编 译 后 将 生 成

out/target/common/obj/APPS/He lloActivity_intermediates/ 目 录 , 这 个 目 录 中 的 内 容 都 是

HelloActivity 工 程 相 关 的 , 更 具 体 地 说 都 与 development/samples/HelloActivity/ 中 的

Android.mk 文 件 相 关 。

out/target/common/obj/APPS/He lloActivity_intermediates/

|-- classes.dex ( 字 节 码 )

|-- classes.jar (JAR 文 件 )

|-- public_resources.xml ( 根 据 resources 结 构 生 成 的 xml)

`-- src

|-- R.stamp

`-- com

`-- example

`-- android

`-- helloactivity

`-- R.java (resources 生 成 的 文 件 )

classes.dex

是 一 个 最 重 要 的 文 件 , 它 是 给 Android 的 JAVA 虚 拟 机 Dalvik 运 行 的 字 节 码 文

件 。

classes.jar

是 一 个 JAR 文 件 ,JAR 的 含 义 为 Java ARchive, 也 就 是 Java 归 档 , 是 一 种 与 平 台

无 关 的 文 件 格 式 , 可 将 多 个 文 件 合 成 一 个 文 件 。 解 压 缩 之 后 的 目 录 结 构 :(JAVA 标 准 编 译 得

到 的 类 )

6


-----------------------------------Android 编 程 基 础

classes

|-- META-INF

| `-- MANIFEST.MF

`-- com

`-- example

`-- android

`-- helloactivity

|-- HelloActivity.class

|-- R$attr.class

|-- R$id.class

|-- R$layout.class

|-- R$string.class

`-- R.class

各 个 以 class 为 扩 展 名 的 文 件 , 事 实 上 是 JAVA 程 序 经 过 编 译 后 的 各 个 类 的 字 节 码 。

第 三 部 分 : 目 标 apk 文 件

目 标 apk 文 件 是 Android 的 JAVA 虚 拟 机 Dalvik 安 装 和 运 行 的 文 件 , 事 实 上 这 个 apk 文 件 将

由 编 译 的 中 间 结 果 和 原 始 文 件 生 成 。apk 文 件 的 本 质 是 一 个 zip 包 。 这 个 APK 包 解 压 缩 后 的

目 录 结 构 如 下 所 示 :

out/target/product/generic/obj/APPS/HelloActivity_intermediates/package.apk_FILES/

|-- AndroidManifest.xml

|-- META-INF

| |-- CERT.RSA

| |-- CERT.SF

| `-- MANIFEST.MF

|-- classes.dex

|-- res

| `-- layout

| `-- hello_activity.xml

`-- resources.arsc

值 得 注 意 的 是 , 这 里 的 xml 文 件 经 过 了 处 理 , 和 原 始 的 文 件 不 太 一 样 , 不 能 按 照 文 本 文 件

的 方 式 阅 读 。

7


-----------------------------------Android 编 程 基 础

第 四 部 分 : 源 代 码 的 各 个 文 件

Android.mk 是 整 个 工 程 的 “Makefile”, 其 内 容 如 下 所 示 :











LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := samples

# Only compile source java files in this apk.

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := HelloActivity

LOCAL_SDK_VERSION := current

include $(BUILD_PACKAGE)

# Use the following include to make our test apk.

include $(call all-makefiles-under,$(LOCAL_PATH))

这 个 文 件 在 各 个 Android 的 工 程 中 都 是 类 似 的 , 其 中 LOCAL_PACKAGE_NAME 表 示 了 这

个 包 的 名 字 。LOCAL_MODULE_TAGS 表 示 了 模 块 的 标 , 在 这 里 使 用 的 是

samples, 正 式 的 应 用 程 序 (packages 目 录 中 的 应 用 ) 中 多 使 用 eng development。

AndroidManifest.xml 是 这 个 HelloActivity 工 程 的 描 述 文 件 , 其 内 容 如 下 所 示 :












其 中 package 用 于 说 明 这 个 包 的 名 称 ,android:labeapplication 中 的 内 容 是 表 示 这 个 应 用 程 序

在 界 面 上 显 示 的 标 题 ,activity 中 的 android:name 表 示 这 个 Android 的 活 动 的 名 称 。

8


-----------------------------------Android 编 程 基 础

文 件 src/com/example/android/helloactivity/HelloActivity.java 是 程 序 主 要 文 件 , 由 JAVA 语 言

写 成

package com.example.android.helloactivity;

import android.app.Activity;

import android.os.Bundle;

public class HelloActivity extends Activity {

public HelloActivity() {

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.hello_activity);

}

}

com.example.android.helloactivity 表 示 的 是 这 个 包 的 名 称 , 在 文 件 的 头 部 引 入 了 两 个 包

android.app.Activity 是 一 个 Android 活 动 ( Activity) 包 , 每 一 个 Android 活 动 都 需 要 继 承

Activity 类 。

包 android.os.Bundle 用 于 映 射 字 符 串 的 值 。

onCreate() 是 一 个 重 载 的 函 数 , 在 这 个 函 数 中 实 现 应 用 程 序 创 建 的 所 执 行 的 过 程 。 其 中

setContentView() 设 置 当 前 的 视 图 (View)。

设 置 的 方 法 是 使 用 一 个 文 件 , 这 个 文 件 因 此 决 定 了 视 图 中 包 含 的 内 容 。 这 里 使 用 的 是

R.layout.hello_activity, 表 示 从 res/layout/ 目 录 中 使 用 hello_activity.xml 文 件 。

res/layout/hello_activity.xml 文 件 的 内 容 如 下 所 示 :



其 中 定 义 了 一 个 可 编 辑 的 文 本 ( EditText), 下 面 的 各 项 其 实 是 它 的 各 种 属 性 , android:text 表 示 这 个 文 本 的

内 容 ,string/hello_activity_text_text 表 示 找 到 相 应 的 文 件 , 也 就 是 res/value/string.xml 文 件 中 的

hello_activity_text_text 文 本 。

res/value/string.xml 的 内 容 如 下 所 示 :



He llo, World!


hello_activity_text_text 文 本 被 res/layout/hello_activity.xml 文 件 引 用 , 正 是 应 用 程 序 运 行 时 在

屏 幕 显 示 的 文 本 。

9


-----------------------------------Android 编 程 基 础

AndroidADB

ADB 工 具 使 用

adb(Android Debug Bridge) 是 Android 提 供 的 一 个 通 用 调 试 工 具 , 借 助 这 个 工 具 , 我 妈 可 以 管 理 设 备 或 手 机 模

拟 器 的 状 态 。

adb 功 能 操 作 :





快 速 更 新 设 备 或 手 机 模 拟 器 中 的 代 码 , 如 应 用 或 Android 系 统 升 级

在 设 备 上 运 行 shell 命 令

管 理 设 备 或 手 机 模 拟 器 上 预 定 端 口

在 设 备 或 手 机 模 拟 器 上 复 制 、 粘 贴 文 件

adb 常 用 操 作 :

安 装 应 用 到 模 拟 器

adb install app.apk

Android 没 有 提 供 一 个 卸 载 应 用 的 命 令 , 只 能 手 动 删 除 :

adb shell

cd data/app

rm app.apk

进 入 设 备 或 模 拟 器 的 Shell

adb shell

通 过 以 上 命 令 , 可 以 进 入 设 备 或 模 拟 器 的 shell 环 境 中 , 在 这 个 Linux Shell 中 , 你 可 以 执 行 各 种 Linux 的 命 令 ,

另 外 如 果 只 想 执 行 一 条 shell 命 令 , 可 以 采 用 以 下 方 式 :

adb shell [command]

如 :

adb shell dmesg

会 打 印 出 内 核 的 调 试 信 息

发 布 端 口

可 以 设 置 任 意 的 端 口 号 , 做 为 主 机 向 模 拟 器 或 设 备 的 请 求 端 口 。 如 :

adb forward tcp:5555 tcp:8000

10


-----------------------------------Android 编 程 基 础

复 制 文 件

可 向 一 个 设 备 或 从 一 个 设 备 中 复 制 文 件

复 制 一 个 文 件 或 目 录 到 设 备 或 模 拟 器 上 :

adb push

如 :

adb push test.txt /tmp/test.txt

从 设 备 或 模 拟 器 上 复 制 一 个 文 件 或 目 录

adb pull

如 :

adb pull /android/lib/libwebcore.os

搜 索 / 等 待 模 拟 器 、 设 备 实 例

取 得 当 前 运 行 的 模 拟 器 、 设 备 的 实 例 列 表 及 每 个 实 例 的 状 态 | 等 待 正 在 运 行 的 设 备

adb devices

adb wait-for-device

查 看 Bug 报 告

adb bugreport

记 录 无 线 通 讯 日 志

无 线 通 讯 记 录 日 志 非 常 多 , 在 运 行 时 没 必 要 记 录 , 可 以 通 过 命 令 设 置 记 录

adb shell

logcat -b radio

获 取 设 备 ID 和 序 列 号

adb get-product

adb get-serialno

访 问 数 据 库 SQLite3

adb shell

sqlite3

11


-----------------------------------Android 编 程 基 础

封 面

12


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

Android 模 拟 器

模 拟 器 参 数

参 数 格 式

emulator [option] [-qemu args]

option 选 项

-sysdir

为 模 拟 器 在 目 录 中 搜 索 系 统 硬 盘 镜 像

-system

为 模 拟 器 从 文 件 中 读 取 初 始 化 系 统 镜 像

-datadir

设 置 用 户 数 据 写 入 的 目 录

-kernel

为 模 拟 器 设 置 使 用 指 定 的 模 拟 器 内 核

-ramdisk 设 置 内 存 RAM 镜 像 文 件 ( 默 认 为 /ramdisk.img)

-image

废 弃 , 使 用 -system 替 代

-init-data

设 置 初 始 化 数 据 镜 像 ( 默 认 为 /userdata.img)

-initdata

和 "-init-data " 使 用 方 法 一 致

-data

设 置 数 据 镜 像 ( 默 认 为 /userdata-qemu.img)

-partition-size

system/data 分 区 容 量 大 小 (MB)

-cache 设 置 模 拟 器 缓 存 分 区 镜 像 ( 默 认 为 零 时 文 件 )

-no-cache

禁 用 缓 存 分 区

-nocache

与 "-no-cache" 使 用 方 法 相 同

-sdcard

指 定 模 拟 器 SDCard 镜 像 文 件 ( 默 认 为 /sdcard.img)

-wipe-data 清 除 并 重 置 用 户 数 据 镜 像 ( 从 initdata 拷 贝 )

-avd

指 定 模 拟 器 使 用 Android 虚 拟 设 备

-skindir 设 置 模 拟 器 皮 肤 在 目 录 中 搜 索 皮 肤 ( 默 认 为 /skins 目 录 )

-skin

选 择 使 用 给 定 的 皮 肤

-no-skin

不 适 用 任 何 模 拟 器 皮 肤

-noskin

使 用 方 法 与 "-no-skin" 相 同

-memory

物 理 RAM 内 存 大 小 (MB)

-netspeed

设 置 最 大 网 络 下 载 、 上 传 速 度

-netdelay

网 络 时 延 模 拟

-netfast

禁 用 网 络 形 态

-tarce

代 码 配 置 可 用

-show-kernel

显 示 内 核 信 息

-shell

在 当 前 终 端 中 使 用 根 Shell 命 令

-no-jni

Dalvik 运 行 时 禁 用 JNI 检 测

-nojni

使 用 方 法 与 "-no-jni" 相 同

-logcat

输 出 给 定 tag 的 Logcat 信 息

2


-----------------------------------Android 编 程 基 础

-no-audio

禁 用 音 频 支 持

-noaudio

与 "-no-audio" 用 法 相 同

-audio

使 用 指 定 的 音 频 backend

-audio-in

使 用 指 定 的 输 入 音 频 backend

-audoi-out

使 用 指 定 的 输 出 音 频 backend

-raw-keys

禁 用 Unicode 键 盘 翻 转 图

-radio

重 定 向 无 线 模 式 接 口 到 个 性 化 设 备

-port

设 置 控 制 台 使 用 的 TCP 端 口

-ports , 设 置 控 制 台 使 用 的 TCP 端 口 和 ADB 调 试 桥 使 用 的 TCP 端 口

-onion

在 屏 幕 上 层 使 用 覆 盖 PNG 图 片

-onion-alpha

指 定 上 层 皮 肤 半 透 明 度

-onion-rotation 0|1|2|3

指 定 上 层 皮 肤 旋 转

-scale

调 节 模 拟 器 窗 口 尺 寸 ( 三 种 :1.0-3.0、dpi、auto)

-dpi-device 设 置 设 备 的 resolution (dpi 单 位 ) ( 默 认 165)

-http-proxy

通 过 一 个 HTTP 或 HTTPS 代 理 来 创 建 TCP 连 接

-timezone

使 用 给 定 的 时 区 , 而 不 是 主 机 默 认 的

-dns-server

在 模 拟 系 统 上 使 用 给 定 的 DNS 服 务

-cpu-delay

调 节 CUP 模 拟

-no-boot-anim

禁 用 动 画 来 快 速 启 动

-no-window

禁 用 图 形 化 窗 口 显 示

-version

显 示 模 拟 器 版 本 号

-report-console 向 远 程 socket 报 告 控 制 台 端 口

-gps

重 定 向 GPS 导 航 到 个 性 化 设 备

-keyset

指 定 按 键 设 置 文 件 名

-shell-serial

根 shell 的 个 性 化 设 备

-old-system

支 持 旧 版 本 (pre 1.4) 系 统 镜 像

-tcpdump

把 网 络 数 据 包 捕 获 到 文 件 中

-bootchart

bootcharting 可 用

-qemu args....

向 qemu 传 递 参 数

-qemu -h

显 示 qemu 帮 助

-verbose

和 "-debug-init" 相 同

-debug

可 用 、 禁 用 调 试 信 息

-debug-

使 指 定 的 调 试 信 息 可 用

-debug-no-

禁 用 指 定 的 调 试 信 息

-help

打 印 出 该 帮 助 文 档

-help-

打 印 出 指 定 option 的 帮 助 文 档

-help-disk-images

关 于 硬 盘 镜 像 帮 助

-help-keys 支 持 按 钮 捆 绑 ( 手 机 快 捷 键 )

-help-debug-tags

显 示 出 -debug 命 令 中 的 tag 可 选 值

-help-char-devices

个 性 化 设 备 说 明

-help-environment

环 境 变 量

-help-keyset-file

指 定 按 键 绑 定 设 置 文 件

-help-virtula-device

虚 拟 设 备 管 理

3


-----------------------------------Android 编 程 基 础

-help-sdk-images

-help-build-images

-help-all

当 使 用 SDK 时 关 于 硬 盘 镜 像 的 信 息

当 构 建 Android 时 , 关 于 硬 盘 镜 像 的 信 息

打 印 出 所 有 帮 助

4


-----------------------------------Android 编 程 基 础

进 程 :

Android 中 , 进 程 完 全 是 应 用 程 序 的 实 现 细 节 , 不 是 用 户 一 般 想 象 的 那 样 。

它 们 的 用 途 很 简 单 :





通 过 把 不 信 任 或 是 不 稳 定 的 代 码 放 到 其 他 进 程 中 来 提 高 稳 定 性 或 是 安 全 性

通 过 在 相 同 的 进 程 中 运 行 多 个 .apk 代 码 来 减 少 消 耗

通 过 把 重 量 级 代 码 放 入 一 个 分 开 的 进 程 中 来 帮 助 系 统 管 理 资 源 。 该 分 开 的 进 程 可 以 被 应 用 程 序 的 其 他 部

分 单 独 地 杀 死

如 果 两 个 没 有 共 享 相 同 的 用 户 ID 的 .apk 试 图 在 相 同 的 进 程 中 运 行 , 这 将 不 被 允 许 , 并 且 系 统 会 为 每 一

个 apk 程 序 创 建 不 同 的 进 程 会

线 程





Android 让 一 个 应 用 程 序 在 单 独 的 线 程 中 , 指 导 它 创 建 自 己 的 线 程

应 用 程 序 组 件 (Activity、service、broadcast receiver) 所 有 都 在 理 想 的 主 线 程 中 实 例 化

没 有 一 个 组 件 应 该 执 行 长 时 间 或 是 阻 塞 操 作 ( 例 如 网 络 呼 叫 或 是 计 算 循 环 ) 当 被 系 统 调 用 时 , 这 将 中 断 所

有 在 该 进 程 的 其 他 组 件

你 可 以 创 建 一 个 新 的 线 程 来 执 行 长 期 操 作

5


-----------------------------------Android 编 程 基 础

Android 释 放 手 机 资 源 , 进 程 释 放 优 先 级

当 系 统 资 源 消 耗 ,Android 将 会 杀 死 一 些 进 程 来 释 放 资 源 。

进 程 优 先 级 顺 序 :

1 前 台 进 程 :

包 含 一 个 前 台 Activity、 包 含 一 个 正 在 运 行 的 广 播 接 收 器 、 正 在 运 行 的 服 务 ( 当 前 用 户 所 需 的 Activity、

正 在 屏 幕 顶 层 运 行 的 Activity)

2 可 视 进 程 :

包 含 一 个 可 视 化 的 Activity(Activity 可 视 的 , 但 是 不 是 在 前 台 的 (onPause))、 例 如 显 示 在 一 个 前 台 对

话 框 之 后 的 以 前 的 Activity)

3 服 务 进 程 :

包 含 一 个 被 开 启 的 服 务 ( 处 理 服 务 , 不 是 直 接 可 视 , 例 如 媒 体 播 放 器 , 网 络 上 传 、 下 载 )

4 后 台 进 程 :

包 含 一 个 不 可 视 的 Activity( 带 有 一 个 当 前 不 可 视 的 Activity、 可 以 在 任 意 时 刻 杀 死 该 进 程 来 回 收 内 存 )

5

空 进 程

没 有 持 有 任 何 应 用 程 序 组 件

6


-----------------------------------Android 编 程 基 础

Android 应 用 开 发 1

分 析 Hello Android

打 开 Hello Android 工 程

src 文 件 夹 HelloAndroid.java R.java Android Library Assets 文 件 夹

源 文 件 主 程 序 文 件 资 源 文 件 Java 库 静 态 文 件 打 包

res 文 件 夹

drawable 文 件 夹 layout 文 件 夹 values 文 件 夹

程 序 图 标 (ico.png) 布 局 UI (main.xml) 程 序 用 到 的 String、 颜 色 **(string.xml)

AndroidMainfest.xml

描 述 应 用 程 序 、 构 成 、 组 件 、 权 限

bin 文 件 夹

classes.dex HelloAndroid.apk 自 定 义 的 包 文 件 夹

编 译 的 java 二 进 制 码 Android 安 装 包 (APK 包 ) 存 放 编 译 后 的 字 节 码 文 件

Main.xml

整 体 布 局 表 示 线 性 布 局

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" 控 件 布 局 垂 直 往 下 布 局

android:layout_width="fill_parent"

android:layout_height="fill_parent" 上 层 控 件 填 充 满

名 字 空 间

图 形 空 间 派 生 于 View


横 向 填 充 满

纵 向 按 实 际 高 度 填 充

要 引 用 到 的 hello 字 符 串

button 控 件 ID

按 实 际 宽 度 高 度 显 示 填 充

7


-----------------------------------Android 编 程 基 础

R.java

通 过 res 文 件 夹 下 的 xml 文 件 定 义 自 动 生 成 的 ,main.xml ico.png string.xml 是 配 套 的 关 联 , 进 行 修 改 后

R.java 自 动 重 新 生 成

AndroidManifest.xml

有 关 版 本 , 程 序 信 息 ,java 包 , 程 序 图 标 , 程 序 记 录 信 息 等 。

Manifest.xml 文 件 轮 廓













8


-----------------------------------Android 编 程 基 础

添 加 编 辑 框 与 按 钮

package zyf.Study.AndroidSturdyByMyself;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class AndroidSturdyByMyself extends Activity {

private EditText getNameEditText;

private Button button_Login;

private TextView show_Login_TextView;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

getNameEditText=(EditText)findViewById(R.id.widget29_getName_EditText);

button_Login=(Button)findViewById(R.id.widget30_Login_Button);

show_Login_TextView=(TextView)findViewById(R.id.widget31_showLogin_TextView);

button_Login.setOnClickListener(new

new OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

show_Login_TextView.setText(getNameEditText.getText()+" 欢 迎 您 进 入 ");

}

});

}

}

9


-----------------------------------Android 编 程 基 础

使 用 Intent 启 动 另 一 个 Activity

Intent showNextPage_Intent=new

new Intent();

showNextPage_Intent.setClass(UsingBundel.this

this,NextPageActivity.class

class);

startActivity(showNextPage_Intent);

在 多 个 Activity 之 间 切 换 时 候 , 注 意 每 个 Activity 都 应 在 AndroidManifest.xml 中 有 所 声

明 定 义 ( 如 下 )










新 的 Activity

AndroidManifest.xml 中

必 须 定 义 声 明

在 不 同 Task 中 启 动 Activity

Intent.FLAG_ACTIVITY_NEW_TASK

10


-----------------------------------Android 编 程 基 础

Android 应 用 开 发 2

Activity

何 谓 Activity:

最 简 单 的 就 是 你 可 以 把 Activity 看 成 一 个 User Interface Program, 原 则 上 它 会 提 供 使 用 者 一 个 交 互 式 的 接

口 功 能 , 那 一 个 Activity 只 有 一 个 UI 吗 ? 非 也 , 举 例 来 说 : 一 个 email 程 序 , 就 可 能 包 含 三 个 Activity:

• 邮 件 列 表 的 Activity

• 显 示 邮 件 内 容 的 Activity

• 写 新 邮 件 或 回 复 邮 件 的 Activity

所 有 的 Activity 在 系 统 里 由 Activity 堆 栈 所 管 理 , 当 一 个 新 的 Activity 被 执 行 后 , 它 将 会 被 放 置 到 堆 栈 的

最 顶 部 , 并 且 变 成 running Activity, 而 先 前 的 Activity 原 则 上 还 是 会 存 在 于 堆 栈 中 , 但 它 此 时 不 会 是 在 前 景

的 情 况 , 除 非 刚 刚 那 个 新 的 Activity 离 开 。

Intent 与 Intent filters

Intent:

Android 使 用 了 一 个 很 特 别 的 类 别 Intent, 用 来 从 一 个 画 面 跳 另 一 个 画 面 ,Intent 是 用 来 描 述 一 个 程

序 想 要 做 些 什 么 事 情 。 在 Intent 的 数 据 结 构 中 有 两 个 很 重 要 的 部 分 , 一 个 是 动 作 (action) 及 对 数 据 产 生

反 应 (data to act upon)。 Action 主 要 的 内 容 有 MAIN( 程 序 的 入 口 点 ),VIEW,PICK,EDIT 等 等 。Data

则 是 用 URI 的 形 式 来 表 示 。 比 如 : 想 要 查 看 一 个 人 的 联 络 数 据 时 , 你 需 要 建 立 一 个 Intent, 它 包 含 了 VIEW

的 动 作 (action) 及 指 向 该 人 数 据 的 URI 描 述 句 。

Intent Filter :

当 Intent 要 求 做 某 件 事 时 ,IntentFilter 被 用 来 描 述 这 个 Activity 能 够 做 些 什 么 事 情 。 比 如 一 个 Activity

要 能 够 显 示 个 人 联 络 数 据 , 你 就 必 需 要 在 intentFilter 说 明 你 要 如 何 处 理 个 人 联 络 数 据 , 并 用

ACTION_VIEW 呈 现 出 来 。IntentFilter 都 会 在 AndroidManifest.xml 清 单 里 面 声 明 。

11


-----------------------------------Android 编 程 基 础

Broadcast Intent Receiver

当 你 想 要 写 一 个 程 序 来 对 外 部 的 事 件 做 些 处 理 时 , 可 以 实 用 Broadcast Intent Receiver 。 比 如 :

当 电 话 响 铃 时 , 有 短 信 时 。 Broadcast Intent Receiver 它 并 不 能 够 拿 来 显 示 UI 画 面 , 它 必 需 利 用

NotificationManager 来 通 知 使 用 者 它 们 感 兴 趣 的 事 件 发 生 了 。

Broadcast Intent Receiver 同 样 的 可 以 在 AndroidManifest.xml 中 声 明 , 但 你 也 可 以 用 写

Context.registerReceiver() 程 序 的 方 式 来 注 册 你 自 己 的 Broadcast Intent Receiver。 你 自 己 的 程 序 并 不 会

因 为 Broadcast Receiver 被 呼 叫 而 被 它 执 行 起 来 , 而 是 当 BroadcastReceiver 被 触 发 时 系 统 会 依 据 需 求 来 执

行 相 应 的 程 序 。 程 序 可 以 利 用 Context.sendBroadcast() 来 发 出 它 们 自 己 的 IntentBroadcast 给 其 它 的 程 序 。

Intent 与 Activity

而 画 面 的 切 来 切 去 则 是 由 resolving Intent 来 实 现 的 。 当 你 想 产 生 新 的 画 面 时 , 现 行 的 Activity

就 使 用 startActivity(myIntent)。 然 后 系 统 就 会 根 据 所 有 已 安 装 的 程 序 所 定 义 的 Intent filter 来 看 哪 个 程 序

是 最 适 合 myIntent。 当 startActivity 被 呼 叫 时 ,resolving Intents 的 处 理 过 程 是 伴 随 而 来 的 。Resolving Intent

提 供 我 们 两 个 好 处 :

• 让 Activities 可 以 很 容 易 的 利 用 Intent 的 方 式 去 使 用 别 的 程 序 的 功 能 。

• Activities 可 以 很 容 易 的 在 任 何 情 况 下 由 新 的 Activity 所 取 代 。

12


-----------------------------------Android 编 程 基 础

添 加 新 的 Activity

package zyf.Android.Study;

import ……

import android.content.Intent;

import android.net.Uri;

import android.view.View.OnClickListener;

public class AndroidStudy_TWO extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

final EditText inName = (EditText) findViewById(R.id.name);

final TextView result = (TextView) findViewById(R.id.result);

Button button_Start_Browser = (Button) findViewById(R.id.submit_toNET);

Button button_Login=(Button) findViewById(R.id.show_Login);

Button button_showLoginName=

(Button)findViewById(R.id.submit_toshowLoingName);

button_Start_Browser.setOnClickListener(new

new OnClickListener(){

@Override

public void onClick(View v) {

Uri myUri = Uri.parse("http://www.flashwing.net");

Intent openBrowserIntent = new Intent(Intent.ACTION_VIEW,myUri);

startActivity(openBrowserIntent);

}

});

button_Login.setOnClickListener(new

new OnClickListener(){

@Override

public void onClick(View v) {

Intent openWelcomeActivityIntent=new

new Intent();

openWelcomeActivityIntent.setClass(AndroidStudy_TWO.this

this,

Welcome.class

class);

startActivity(openWelcomeActivityIntent);

}

});

button_showLoginName.setOnClickListener(new

new OnClickListener(){

@Override

public void onClick(View v) {

result.setText(inName.getText()+" 欢 迎 您 进 入 ");

}

});

}

}

13


-----------------------------------Android 编 程 基 础

封 面

14


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

Android 应 用 开 发 3

使 用 Bundle 在 Activity 间 传 递 数 据

从 源 Activity 中 传 递 数 据

// 数 据 写 入 Intent

Intent openWelcomeActivityIntent=new

new Intent();

Bundle myBundelForName=new

new Bundle();

myBundelForName.putString("Key_Name",inName.getText().toString());

myBundelForName.putString("Key_Age",inAge.getText().toString());

openWelcomeActivityIntent.putExtras(myBundelForName);

openWelcomeActivityIntent.setClass(AndroidBundel.this

this, Welcome.class

class);

startActivity(openWelcomeActivityIntent);

目 标 Activity 中 获 取 数 据

// 从 Intent 中 获 取 数 据

Bundle myBundelForGetName=this

this.getIntent().getExtras();

String name=myBundelForGetName.getString("Key_Name");

myTextView_showName.setText(" 欢 迎 您 进 入 :"+name);

使 用 Bundle 在 Activity 间 传 递 数 据 2

从 源 请 求 Activity 中 通 过 一 个 Intent 把 一 个 服 务 请 求 传 到 目 标 Activity 中

private Intent toNextIntent;//Intent 成 员 声 明

toNextIntent=new

new Intent();//Intent 定 义

toNextIntent.setClass(TwoActivityME3.this

this, SecondActivity3.class

class);

// 设 定 开 启 的 下 一 个 Activity

startActivityForResult(toNextIntent, REQUEST_ASK);

// 开 启 Intent 时 候 , 把 请 求 码 同 时 传 递

2


-----------------------------------Android 编 程 基 础

在 源 请 求 Activity 中 等 待 Intent 返 回 应 答 结 果 , 通 过 重 载 onActivityResult() 方 法

@Override

protected void onActivityResult(int

int requestCode,

int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

if(requestCode==REQUEST_ASK){

if(resultCode==RESULT_CANCELED){

}

}

setTitle("Cancel****");

}else

if(resultCode==RESULT_OK){

}

showBundle=data.getExtras();// 从 返 回 的 Intent 中 获 得 Bundle

Name=showBundle.getString("myName");// 从 bundle 中 获 得 相 应 数 据

text.setText("the name get from the second layout:\n"+Name);

☻ 第 一 个 参 数 是 你 开 启 请 求 Intent 时 的 对 应 请 求 码 , 可 以 自 己 定 义 。

☻ 第 二 个 参 数 是 目 标 Activity 返 回 的 验 证 结 果 码

☻ 第 三 个 参 数 是 目 标 Activity 返 回 的 Intent

目 标 Activity 中 发 送 请 求 结 果 代 码 , 连 同 源 Activity 请 求 的 数 据 一 同 绑 定 到 Bundle

中 通 过 Intent 传 回 源 请 求 Activity 中

backIntent=new

new Intent();

stringBundle=new

new Bundle();

stringBundle.putString("myName", Name);

backIntent.putExtras(stringBundle);

setResult(RESULT_OK, backIntent);// 返 回 Activity 结 果 码

finish();

Log 与 DDMS( 查 看 Log 等 信 息 )

Log.v("TAG", "nextPage_Activity onStart()");// 设 置 标 签 来 跟 踪 程 序

3


-----------------------------------Android 编 程 基 础

Activity 生 命 周 期

Activity 状 态

1

当 一 个 Activity 在 屏 幕 的 最 上 层 时 ( 对 堆 栈 的 最 顶 端 ), 它 就 是 属 于 active 或 者 running 的 状 态

2 如 果 一 个 Activity 失 去 焦 点 (focus) 但 还 看 得 到 它 的 画 面 ( 比 如 : 一 个 新 的 Activity 画 面 并 不 是 全

屏 幕 或 者 它 是 一 个 半 透 明 的 情 况 ), 那 失 去 焦 点 的 Activity 则 处 在 paused 的 状 态 。 像 这 个 失 去 焦 点 的 Activity

它 还 是 完 全 活 着 的 , 并 没 有 消 失 。( 活 着 的 意 思 是 指 ,Activity 自 己 本 身 所 有 的 状 态 及 数 据 都 还 是 存 在 的 , 也

跟 窗 口 管 理 程 序 window manager 保 持 联 系 着 ), 像 这 种 paused 的 Activity, 会 在 一 种 情 况 下 消 失 , 那 就 是 当

系 统 的 内 存 不 够 用 之 时 , 系 统 会 自 动 判 断 , 八 部 重 要 的 Activity 移 除 。

3 如 果 一 个 Activity 被 其 它 的 Activity 完 全 的 遮 盖 住 时 , 它 仍 然 保 有 全 部 的 状 态 及 数 据 , 但 因 为 它 已

不 再 被 使 用 者 看 见 , 所 以 它 的 画 面 是 被 隐 藏 起 来 的 ( 画 面 不 需 要 更 新 ), 当 系 统 内 存 不 足 时 , 这 种 stop 状 态

的 Activity 时 最 先 被 系 统 考 虑 拿 下 来 释 放 内 存 的 。

4

当 一 个 Activity 处 于 pause 或 stop 的 状 态 时 , 系 统 可 以 要 求 Activity 结 束 (finish) 或 直 接 移 除 (kill)

它 。 当 它 需 要 再 度 呈 现 在 使 用 者 面 前 时 , 它 必 须 要 能 完 整 的 重 新 启 动 及 回 复 先 前 的 状 态 。

Activity 状 态 转 换 图

4


-----------------------------------Android 编 程 基 础

Android 应 用 开 发 4 使 用 Service

什 么 是 服 务 (Service

Service)

服 务 是 运 行 在 后 台 的 一 段 代 码 。 它 可 以 运 行 在 它 自 己 的 进 程 , 也 可 以 运 行 在 其 他 应 用 程 序 的 上 下 文

(context) 里 面 , 这 取 决 于 自 身 的 需 要 。 其 他 的 组 件 可 以 绑 定 到 一 个 服 务 (Service) 上 面 , 通 过 远 程 过 程 调

用 (RPC) 来 调 用 这 个 方 法 。 例 如 : 媒 体 播 放 器 的 服 务 , 当 用 户 退 出 媒 体 选 择 用 户 界 面 , 仍 然 希 望 音 乐 可 以

继 续 播 放 , 这 时 就 是 由 服 务 (Service) 来 保 证 当 用 户 界 面 关 闭 时 音 乐 继 续 播 放 的 。

如 何 使 用 服 务



第 一 种 是 通 过 调 用 Context.startServece() 启 动 , 调 用 Context.stoptService() 结 束 ,startService() 可 以 传 递 参

数 给 Service。

第 二 种 方 式 是 通 过 调 用 Context.bindService() 启 动 , 调 用 Context.unbindService() 结 束 , 还 可 以 通 过

ServiceConnection 访 问 Service。 二 者 可 以 混 合 使 用 , 比 如 说 我 可 以 先 startServece() 再 unbindService()。

Service 的 生 命 周 期




startService() 后 , 即 使 调 用 startService() 的 进 程 结 束 了 ,Service 仍 然 还 存 在 , 知 道 有 进 程 调 用

stoptService(), 或 者 Service 自 己 自 杀 (stopSelf()) 就 没 法 了

bindService() 后 ,Service 就 和 调 用 bindService() 的 进 程 同 生 共 死 , 也 就 是 说 当 调 用 bindService() 的 进

程 死 了 , 那 么 它 bind 的 Service 也 要 跟 着 被 结 束 , 当 然 期 间 也 可 以 调 用 unbindService() 让 Service 结


两 种 方 式 混 合 使 用 时 , 比 如 说 你 startService() 了 , 我 bindService() 了 , 那 么 只 有 你 stoptService() 了 而

且 我 也 unbindService() 了 , 这 个 Service 才 会 被 结 束 。

进 程 生 命 周 期


Android 系 统 将 会 尝 试 保 留 那 些 启 动 了 的 或 者 时 绑 定 了 的 服 务 进 程


如 果 该 服 务 正 在 进 程 的 onCreate(),onStart() 或 者 onDestroy() 这 些 方 法 中 执 行 时 , 那 么 主 进 程 将 会 成 为

一 个 前 台 进 程 , 以 确 保 此 代 码 不 会 被 停 止


如 果 服 务 已 经 开 始 , 那 么 它 的 主 进 程 会 就 重 要 性 而 言 低 于 所 有 可 见 的 进 程 但 高 于 不 可 见 的 进 程 , 由

于 只 有 少 数 几 个 进 程 是 用 户 可 见 的 , 所 以 只 要 不 是 内 存 特 别 低 , 该 服 务 不 会 停 止 。


如 果 有 多 个 客 户 端 绑 定 了 服 务 , 只 要 客 户 端 中 的 一 个 对 于 用 户 是 可 见 的 , 即 认 为 该 服 务 可 见

5


-----------------------------------Android 编 程 基 础

使 用 服 务 进 行 音 乐 播 放

Manifest.xml

中 的 Service

定 义

Service 子 类

中 的 Player

Activity 中 定

义 的 Intent

开 启 相 应 的

Service







public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

player = MediaPlayer.create(this, R.raw.seven_days);

player.start();

}

public void onDestroy() {

super.onDestroy();

player.stop();

}

startService(new Intent("com.liangshan.wuyong.START_AUDIO_SERVICE"));

stopService(new Intent("com.liangshan.wuyong.START_AUDIO_SERVICE"));

6


-----------------------------------Android 编 程 基 础

Android UI 布 局

Activity



Android 应 用 程 序 基 本 功 能 单 元

本 身 没 有 任 何 屏 幕 存 在

View 和 Viewgroup


表 示 在 Android 平 台 上 的 基 本 用 户 界 面 单 元

Views

android.view.View

‣ 为 指 定 的 屏 幕 矩 形 区 域 存 储 布 局 和 内 容

‣ 处 理 尺 寸 和 布 局 , 绘 制 , 焦 点 改 变 , 翻 屏 , 按 键 、 手 势

‣ widget 基 类

文 本 TextView

输 入 框 EditText

输 入 法 InputMethod

活 动 方 法 MovementMethod

按 钮 Button

单 选 按 钮 RadioButton

复 选 框 Checkbox

滚 动 视 图 ScrollView

Viewgroups


android.view.Viewgroup

‣ 包 含 并 管 理 下 级 系 列 的 Views 和 其 他 Viewgroup

‣ 布 局 的 基 类

UI 树 状 结 构



Android 中 的 Activity

‣ 定 义 使 用 一 个 view 和 iewgroup 的 树 状 节 点

setContentView() 方 法

‣ 被 Activity 调 用 来 把 树 状 节 点 连 接 到 屏 幕 渲 染

7


-----------------------------------Android 编 程 基 础

LayoutParams ( 布 局 参 数 )


每 一 个 viewgroup 类 使 用 一 个 继 承 于 ViewGroup.LayoutParams 的 嵌 套 类

‣ 包 含 定 义 了 子 节 点 View 的 尺 寸 和 位 置 的 属 性 类 型

普 通 布 局 对 象

FrameLayout





最 简 单 的 布 局 对 象

在 屏 幕 上 故 意 保 留 的 空 白 空 间 , 你 可 以 之 后 填 充 一 个 单 独 的 对 象

‣ 例 如 : 一 个 你 要 更 换 的 图 片

所 有 子 元 素 都 钉 到 屏 幕 的 左 上 角

不 能 为 子 元 素 指 定 位 置

LinearLayout


在 一 个 方 向 上 ( 垂 直 或 水 平 ) 对 齐 所 有 子 元 素

‣ 所 有 子 元 素 一 个 跟 一 个 地 堆 放

一 个 垂 直 列 表 每 行 将 只 有 一 个 子 元 素 ( 无 论 它 们 有 多 宽 )

一 个 水 平 列 表 只 是 一 列 的 高 度 ( 最 高 子 元 素 的 高 度 来 填 充 )

8


-----------------------------------Android 编 程 基 础

TableLayout




把 子 元 素 放 入 到 行 与 列 中

不 显 示 行 、 列 或 是 单 元 格 边 界 线

单 元 格 不 能 横 跨 行 , 如 HTML 中 一 样

AbsoluteLayout

使 子 元 素 能 够 指 明 确 切 的 X / Y 坐 标 显 示 在 屏 幕 上

‣ (0,0) 是 左 上 角

‣ 当 你 下 移 或 右 移 时 , 坐 标 值 增 加

允 许 元 素 重 叠 ( 但 是 不 推 荐 )

注 意 :

‣ 一 般 建 议 不 使 用 AbsoluteLayout 除 非 你 有 很 好 的 理 由 来 使 用 它

‣ 因 为 它 相 当 严 格 并 且 在 不 同 的 设 备 显 示 中 不 能 很 好 地 工 作

RelativeLayout


让 子 元 素 指 定 它 们 相 对 于 其 他 元 素 的 位 置 ( 通 过 ID 来 指 定 ) 或 相 对 于 父 布 局 对 象

9


-----------------------------------Android 编 程 基 础

AndroidManifest.xml 中 修 改 程 序 布 局 的 Theme 主 题













10


-----------------------------------Android 编 程 基 础

封 面

11


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

Android 基 础 UI 编 程 1

更 改 与 显 示 文 字 标 签

TextView 标 签 的 使 用

1 导 入 TextView 包

import android.widget.TextView;

2 在 mainActivity.java 中 声 明 一 个 TextView

private TextView mTextView01;

3

在 main.xml 中 定 义 一 个 TextView



4

利 用 findViewById() 方 法 获 取 main.xml 中 的 TextView

mTextView01 = (TextView) findViewById(R.id.TextView01);

5

设 置 TextView 标 签 内 容

String str_2 = " 欢 迎 来 到 Android 的 TextView 世 界 ...";

mTextView01.setText(str_2);

6 设 置 文 本 超 级 链 接


2


-----------------------------------Android 编 程 基 础

android.graphics.Color 实 践 ----Color 颜 色 变 幻

android.graphics.Color 包 含 颜 色 值

Color.BLACK

Color.BLUE

Color.CYAN

Color.DKGRAY

Color.GRAY

Color.GREEN

Color.LTGRAY

Color.MAGENTA

Color.RED

Color.TRANSPARENT

Color.WHITE

Color.YELLOW

黑 色

蓝 色

青 绿 色

灰 黑 色

灰 色

绿 色

浅 灰 色

红 紫 色

红 色

透 明

白 色

黄 色

编 程 实 现 颜 色 变 幻

1

新 建 工 程

2 修 改 mainActivity.java 文 件 , 添 加 12 个 TextView 对 象 变 量 , 一 个 LinearLayout 对 象 变 量 、 一 个 WC

整 数 变 量 、 一 个 LinearLayout.LayoutParams 变 量 。

package zyf.ManyColorME;

/* 导 入 要 使 用 的 包 */

import android.app.Activity;

import android.graphics.Color;

import android.os.Bundle;

import android.widget.LinearLayout;

import android.widget.TextView;

public class ManyColorME extends Activity {

/** Called when the activity is first created. */

/* 定 义 使 用 的 对 象 */

private LinearLayout myLayout;

private LinearLayout.LayoutParams layoutP;

private int WC = LinearLayout.LayoutParams.WRAP_CONTENT;

private TextView black_TV, blue_TV, cyan_TV, dkgray_TV,

gray_TV, green_TV,ltgray_TV, magenta_TV, red_TV,

transparent_TV, white_TV, yellow_TV;

@Override

public void onCreate(Bundle savedInstanceState) {

3


-----------------------------------Android 编 程 基 础

}

super.onCreate(savedInstanceState);

/* 实 例 化 一 个 LinearLayout 布 局 对 象 */

myLayout = new LinearLayout(this

this);

/* 设 置 LinearLayout 的 布 局 为 垂 直 布 局 */

myLayout.setOrientation(LinearLayout.VERTICAL);

/* 设 置 LinearLayout 布 局 背 景 图 片 */

myLayout.setBackgroundResource(R.drawable.back);

/* 加 载 主 屏 布 局 */

setContentView(myLayout);

/* 实 例 化 一 个 LinearLayout 布 局 参 数 , 用 来 添 加 View */

layoutP = new LinearLayout.LayoutParams(WC, WC);

/* 构 造 实 例 化 TextView 对 象 */

constructTextView();

/* 把 TextView 添 加 到 LinearLayout 布 局 中 */

addTextView();

/* 设 置 TextView 文 本 颜 色 */

setTextViewColor();

/* 设 置 TextView 文 本 内 容 */

setTextViewText();

/* 设 置 TextView 文 本 内 容 */

public void setTextViewText() {

}

black_TV.setText(" 黑 色 ");

blue_TV.setText(" 蓝 色 ");

cyan_TV.setText(" 青 绿 色 ");

dkgray_TV.setText(" 灰 黑 色 ");

gray_TV.setText(" 灰 色 ");

green_TV.setText(" 绿 色 ");

ltgray_TV.setText(" 浅 灰 色 ");

magenta_TV.setText(" 红 紫 色 ");

red_TV.setText(" 红 色 ");

transparent_TV.setText(" 透 明 ");

white_TV.setText(" 白 色 ");

yellow_TV.setText(" 黄 色 ");

/* 设 置 TextView 文 本 颜 色 */

public void setTextViewColor() {

black_TV.setTextColor(Color.BLACK);

blue_TV.setTextColor(Color.BLUE);

dkgray_TV.setTextColor(Color.DKGRAY);

gray_TV.setTextColor(Color.GRAY);

green_TV.setTextColor(Color.GREEN);

ltgray_TV.setTextColor(Color.LTGRAY);

magenta_TV.setTextColor(Color.MAGENTA);

4


-----------------------------------Android 编 程 基 础

}

red_TV.setTextColor(Color.RED);

transparent_TV.setTextColor(Color.TRANSPARENT);

white_TV.setTextColor(Color.WHITE);

yellow_TV.setTextColor(Color.YELLOW);

}

/* 构 造 实 例 化 TextView 对 象 */

public void constructTextView() {

black_TV = new TextView(this

this);

blue_TV = new TextView(this

this);

cyan_TV = new TextView(this

this);

dkgray_TV = new TextView(this

this);

gray_TV = new TextView(this

this);

green_TV = new TextView(this

this);

ltgray_TV = new TextView(this

this);

magenta_TV = new TextView(this

this);

red_TV = new TextView(this

this);

transparent_TV = new TextView(this

this);

white_TV = new TextView(this

this);

yellow_TV = new TextView(this

this);

}

/* 把 TextView 添 加 到 LinearLayout 布 局 中 */

public void addTextView() {

myLayout.addView(black_TV, layoutP);

myLayout.addView(blue_TV, layoutP);

myLayout.addView(cyan_TV, layoutP);

myLayout.addView(dkgray_TV, layoutP);

myLayout.addView(gray_TV, layoutP);

myLayout.addView(green_TV, layoutP);

myLayout.addView(ltgray_TV, layoutP);

myLayout.addView(magenta_TV, layoutP);

myLayout.addView(red_TV, layoutP);

myLayout.addView(transparent_TV, layoutP);

myLayout.addView(white_TV, layoutP);

myLayout.addView(yellow_TV, layoutP);

}

5


-----------------------------------Android 编 程 基 础

3

结 果

6


-----------------------------------Android 编 程 基 础

android.graphics.Typeface 实 践

字 体 风 格 Typeface 种 类

int Style 类 型

BOLD

BOLD_ITALIC

ITALIC

NORMAL

粗 体

粗 斜 体

斜 体

普 通 字 体

Typeface 类 型

DEFAULT

DEFAULT_BOLD

MONOSPACE

SANS_SERIF

SERIF

默 认 字 体

默 认 粗 体

单 间 隔 字 体

无 衬 线 字 体

衬 线 字 体

Typeface.create(Typeface family,int style)

创 建 一 个 混 合 型 新 的 字 体 : 有 4*5 中 搭 配

Typeface.setTypeface (Typeface tf, int style)

设 置 一 个 混 合 型 字 体 : 有 4*5 中 搭 配

Typeface.setTypeface(Typeface tf)

设 置 一 个 只 有 Typeface 风 格 的 字 体 : 有 五 种 形 式

7


-----------------------------------Android 编 程 基 础

编 程 实 现 以 上 静 态 域 字 体

1

创 建 新 工 程

2 修 改 mianActivity.java, 实 现 多 种 字 体 TextView 显 示

package zyf.TypefaceStudy;

/* 导 入 要 使 用 的 包 */

import android.app.Activity;

import android.graphics.Color;

import android.graphics.Typeface;

import android.os.Bundle;

import android.view.ViewGroup;

import android.widget.LinearLayout;

import android.widget.TextView;

public class TypefaceStudy extends Activity {

/** Called when the activity is first created. */

/*

* android.graphics.Typeface java.lang.Object

Typeface 类 指 定 一 个 字 体 的 字 体 和 固 有 风 格 .

* 该 类 用 于 绘 制 , 与 可 选 绘 制 设 置 一 起 使 用 ,

如 textSize, textSkewX, textScaleX 当 绘 制 ( 测 量 ) 时 来 指 定 如 何 显 示 文 本 .

*/

/* 定 义 实 例 化 一 个 布 局 大 小 , 用 来 添 加 TextView */

final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;

/* 定 义 TextView 对 象 */

private TextView bold_TV, bold_italic_TV, default_TV,

default_bold_TV,italic_TV,monospace_TV,

normal_TV,sans_serif_TV,serif_TV;

/* 定 义 LinearLayout 布 局 对 象 */

private LinearLayout linearLayout;

/* 定 义 LinearLayout 布 局 参 数 对 象 */

private LinearLayout.LayoutParams linearLayouttParams;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

/* 定 义 实 例 化 一 个 LinearLayout 对 象 */

linearLayout = new LinearLayout(this

this);

/* 设 置 LinearLayout 布 局 为 垂 直 布 局 */

linearLayout.setOrientation(LinearLayout.VERTICAL);

/* 设 置 布 局 背 景 图 */

linearLayout.setBackgroundResource(R.drawable.back);

/* 加 载 LinearLayout 为 主 屏 布 局 , 显 示 */

setContentView(linearLayout);

8


-----------------------------------Android 编 程 基 础

/* 定 义 实 例 化 一 个 LinearLayout 布 局 参 数 */

linearLayouttParams =

new LinearLayout.LayoutParams(WRAP_CONTENT,WRAP_CONTENT);

constructTextView();

setTextSizeOf();

setTextViewText() ;

setStyleOfFont();

setFontColor();

toAddTextViewToLayout();

}

public void constructTextView() {

/* 实 例 化 TextView 对 象 */

bold_TV = new TextView(this

this);

bold_italic_TV = new TextView(this

this);

default_TV = new TextView(this

this);

default_bold_TV = new TextView(this

this);

italic_TV = new TextView(this

this);

monospace_TV=new

new TextView(this

this);

normal_TV=new

new TextView(this

this);

sans_serif_TV=new

new TextView(this

this);

serif_TV=new

TextView(this

this);

}

public void setTextSizeOf() {

// 设 置 绘 制 的 文 本 大 小 , 该 值 必 须 大 于 0

bold_TV.setTextSize(24.0f);

bold_italic_TV.setTextSize(24.0f);

default_TV.setTextSize(24.0f);

default_bold_TV.setTextSize(24.0f);

italic_TV.setTextSize(24.0f);

monospace_TV.setTextSize(24.0f);

normal_TV.setTextSize(24.0f);

sans_serif_TV.setTextSize(24.0f);

serif_TV.setTextSize(24.0f);

}

public void setTextViewText() {

/* 设 置 文 本 */

bold_TV.setText("BOLD");

bold_italic_TV.setText("BOLD_ITALIC");

default_TV.setText("DEFAULT");

default_bold_TV.setText("DEFAULT_BOLD");

italic_TV.setText("ITALIC");

monospace_TV.setText("MONOSPACE");

normal_TV.setText("NORMAL");

sans_serif_TV.setText("SANS_SERIF");

9


-----------------------------------Android 编 程 基 础

}

serif_TV.setText("SERIF");

}

public void setStyleOfFont() {

/* 设 置 字 体 风 格 */

bold_TV.setTypeface(null

null, Typeface.BOLD);

bold_italic_TV.setTypeface(null

null, Typeface.BOLD_ITALIC);

default_TV.setTypeface(Typeface.DEFAULT);

default_bold_TV.setTypeface(Typeface.DEFAULT_BOLD);

italic_TV.setTypeface(null

null, Typeface.ITALIC);

monospace_TV.setTypeface(Typeface.MONOSPACE);

normal_TV.setTypeface(null

null, Typeface.NORMAL);

sans_serif_TV.setTypeface(Typeface.SANS_SERIF);

serif_TV.setTypeface(Typeface.SERIF);

}

public void setFontColor() {

/* 设 置 文 本 颜 色 */

bold_TV.setTextColor(Color.BLACK);

bold_italic_TV.setTextColor(Color.CYAN);

default_TV.setTextColor(Color.GREEN);

default_bold_TV.setTextColor(Color.MAGENTA);

italic_TV.setTextColor(Color.RED);

monospace_TV.setTextColor(Color.WHITE);

normal_TV.setTextColor(Color.YELLOW);

sans_serif_TV.setTextColor(Color.GRAY);

serif_TV.setTextColor(Color.LTGRAY);

}

public void toAddTextViewToLayout() {

}

/* 把 TextView 加 入 LinearLayout 布 局 中 */

linearLayout.addView(bold_TV, linearLayouttParams);

linearLayout.addView(bold_italic_TV, linearLayouttParams);

linearLayout.addView(default_TV, linearLayouttParams);

linearLayout.addView(default_bold_TV, linearLayouttParams);

linearLayout.addView(italic_TV, linearLayouttParams);

linearLayout.addView(monospace_TV, linearLayouttParams);

linearLayout.addView(normal_TV, linearLayouttParams);

linearLayout.addView(sans_serif_TV, linearLayouttParams);

linearLayout.addView(serif_TV, linearLayouttParams);

10


-----------------------------------Android 编 程 基 础

3

结 果

11


-----------------------------------Android 编 程 基 础

更 改 手 机 窗 口 画 面 底 色

drawable 定 义 颜 色 常 数 的 方 法

1 编 写 main 布 局



android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android"


android:id="@+id/name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text=" 账 号 "

android:layout_x="61px"

android:layout_y="69px"



android:id="@+id/password"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text=" 密 码 "

android:layout_x="61px"

android:layout_y="158px"



android:id="@+id/name_in"

android:layout_width="120dip"

android:layout_height="wrap_content"

android:textSize="18sp"

android:layout_x="114px"

android:layout_y="57px"



-----------------------------------Android 编 程 基 础

android:textSize="18sp"

android:password="true"

android:layout_x="112px"

android:layout_y="142px"

>



2 在 values 文 件 夹 中 定 义 一 个 drawable.xml 文 件 用 来 存 放 颜 色 值



#FFFFFF

#938192

#7cd12e


3 修 改 main.xml 中 的 屏 幕 背 景 颜 色 和 TextView 的 字 体 颜 色


android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@color/white"

xmlns:android="http://schemas.android.com/apk/res/android"


android:id="@+id/name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text=" 账 号 "

android:textColor="@color/darkgray"

android:layout_x="61px"

android:layout_y="69px"



android:id="@+id/password"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text=" 密 码 "

android:textColor="@color/darkgray"

android:layout_x="61px"

android:layout_y="158px"

13


-----------------------------------Android 编 程 基 础

4 在 mainActivity.java 代 码 中 修 改 TextView 背 景 颜 色

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView text=(TextView)findViewById(R.id.name);

// 由 ID 获 得 资 源

Resources myColor=getBaseContext().getResources();

//getBaseContext() 获 得 基 础 Context

//getResources() 获 得 资 源

Drawable color_M=myColor.getDrawable(R.color.lightgreen);

// 由 资 源 myColor 来 获 得 Drawable R.color.lightgreen 是 颜 色 值 的 ID 引 用

}

text.setBackgroundDrawable(color_M);

// 设 置 背 景

5 结 果 :

14


-----------------------------------Android 编 程 基 础

代 码 中 更 改 TextView 文 字 颜 色

1

创 建 工 程

2 编 写 布 局 main.xml









3 新 加 drawable.xml, 其 中 添 加 一 个 white 颜 色 值



#ffffffff


4

在 代 码 中 由 ID 获 取 TextView

TextView text_A=(TextView)findViewById(R.id.TextView01);

TextView text_B=(TextView)findViewById(R.id.TextView02);

5 获 取 Resources 对 象

Resources myColor_R=getBaseContext().getResources();

//getBaseContext() 获 得 基 础 Context

//getResources() 从 Context 获 取 资 源 实 例 对 象

15


-----------------------------------Android 编 程 基 础

6 获 取 Drawable 对 象

Drawable myColor_D=myColor_R.getDrawable(R.color.white);

7 设 置 文 本 背 景 颜 色

text_A.setBackgroundDrawable(myColor_D);

8 利 用 android.graphics.Color 的 颜 色 静 态 变 量 来 改 变 文 本 颜 色

text_A.setTextColor(android.graphics.Color.GREEN);

9 利 用 Color 的 静 态 常 量 来 设 置 文 本 颜 色

text_B.setTextColor(Color.RED);

16


-----------------------------------Android 编 程 基 础

置 换 TextView 文 字

CharSequence 数 据 类 型 与 Resource ID 应 用

1

创 建 新 工 程

2 修 改 main.xml 布 局 , 新 增 一 个 TextView





3 在 string.xml 中 添 加 字 符 串 str_2:



Hello World, Ex4_UI!

Ex4_UI

我 是 Resource 里 的 " 字 符 串 "


4 在 mainActivity.java 中 findViewByID() 获 取 TextView

TextView myText=(TextView)findViewById(R.id.myTextView2);

5 getString(R.string.str_2) 得 到 原 字 符 串

CharSequence string2=getString(R.string.str_2);

6

定 义 新 字 符 串 str_3

String str_3=" 我 是 程 序 里 调 用 Resource 的 ";

7 两 个 字 符 串 连 接 并 重 新 设 置 TextView 内 容

myText.setText(str_3+string2);

17


-----------------------------------Android 编 程 基 础

取 得 手 机 屏 幕 大 小

DisplayMetrics 类 取 得 画 面 宽 高

1

创 建 新 工 程

2 修 改 main.xml 布 局 , 添 加 一 个 TextView





3

在 代 码 中 定 义 一 个 DisplayMetrics 类 对 象

DisplayMetrics displaysMetrics=new

DisplayMetrics();

//DisplayMetrics 一 个 描 述 普 通 显 示 信 息 的 结 构 , 例 如 显 示 大 小 、 密 度 、 字 体 尺 寸

4

获 取 手 机 窗 口 的 Display 来 初 始 化 DisplayMetrics 对 象

getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);

//getManager() 获 取 显 示 定 制 窗 口 的 管 理 器 。

// 获 取 默 认 显 示 Display 对 象

// 通 过 Display 对 象 的 数 据 来 初 始 化 一 个 DisplayMetrics 对 象

5

得 到 屏 幕 宽 高

String showSize=" 手 机 屏 幕 分 辨 率 : \n"+

displaysMetrics.widthPixels+"*"+displaysMetrics.heightPixels;

6

在 mainActivity.java 中 findViewByID() 获 取 TextView

TextView myShow=(TextView)findViewById(R.id.TextView01);

7

显 示 屏 幕 分 辨 率 信 息

myShow.setText(showSize);

18


-----------------------------------Android 编 程 基 础

封 面

19


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

Android 基 础 UI 编 程 2

标 题 、 状 态 栏 的 隐 藏

标 题 栏 隐 藏

在 Activity.setCurrentView(); 之 前 调 用 此 方 法

private void HideTitle() {

// TODO Auto-generated method stub

requestWindowFeature(Window.FEATURE_NO_TITLE);

}

状 态 栏 隐 藏 ( 全 屏 )

在 Activity.setCurrentView(); 之 前 调 用 此 方 法

private void HideStatusBar() {

// TODO Auto-generated method stub

}

// 隐 藏 标 题

requestWindowFeature(Window.FEATURE_NO_TITLE);

// 定 义 全 屏 参 数

int flag=WindowManager.LayoutParams.FLAG_FULLSCREEN;

// 获 得 窗 口 对 象

Window myWindow=this

this.getWindow();

// 设 置 Flag 标 识

myWindow.setFlags(flag,flag);

2


-----------------------------------Android 编 程 基 础

样 式 化 的 定 型 对 象

Style 样 式 的 定 义

1

新 建 工 程

2 定 义 一 个 style.xml 存 放 样 式




25sp

#80FF00



18sp

#0C688E

0.0

0.0



3 在 string.xml 中 添 加 字 符 串



应 用 myStyle_Text1

应 用 myStyle_Text2


4 修 改 布 局 main.xml, 添 加 两 个 TextView



3


-----------------------------------Android 编 程 基 础

5 加 入 Style






6 结 果 :

4


-----------------------------------Android 编 程 基 础

简 易 的 按 钮 事 件

Button 事 件 处 理

1

创 建 新 工 程

2 修 改 main.xml 布 局 , 添 加 一 个 TextView 和 一 个 Button






3

在 mainActivity.java 中 findViewByID() 获 取 TextView 和 Button 资 源

show= (TextView)findViewById(R.id.show_TextView);

press=(Button)findViewById(R.id.Click_Button);

4

给 Button 添 加 事 件 监 听 器 Button.OnClickListener()

press.setOnClickListener(new

new Button.OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

}

});

5


-----------------------------------Android 编 程 基 础

5

处 理 事 件

press.setOnClickListener(new

new Button.OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

show.setText("Hi , Google Android!");

}

});

6 结 果 :

6


-----------------------------------Android 编 程 基 础

手 机 页 面 的 转 换

setContentView 的 应 用

1

新 建 工 程

2 string 添 加 两 个 提 示 字 符 串



this is Layout 1

This is Layout 2

Ex8_UI


3 新 建 color.xml 保 存 两 个 颜 色 值



#000000

#FFFFFFFF


4 修 改 main.xml 布 局 , 添 加 一 个 TextView 和 一 个 Button





-----------------------------------Android 编 程 基 础

android:layout_y="82px"

android:text="Go to Layout2"

>


5 新 建 mylayout.xml 布 局 文 件 , 并 添 加 两 个 View:TextView 和 Button







6 编 写 mainActivity.java

package zyf.Ex8_UI;

import android.app.Activity;/* import 相 关 class */

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class Ex8_UI extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

8


-----------------------------------Android 编 程 基 础

}

}

super.onCreate(savedInstanceState);

/* 载 入 main.xml Layout */

setContentView(R.layout.main);// 默 认 启 动 布 局

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

Button b1 = (Button) findViewById(R.id.button1);

b1.setOnClickListener(new

new Button.OnClickListener() {

public void onClick(View v) {

});

}

jumpToLayout2();// 调 用 跳 转 方 法 jumpToLayout2()

/* method jumpToLayout2: 将 layout 由 main.xml 切 换 成 mylayout.xml */

public void jumpToLayout2() {

}

/* 将 layout 改 成 mylayout.xml */

setContentView(R.layout.mylayout);

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

Button b2 = (Button) findViewById(R.id.button2);

b2.setOnClickListener(new

new Button.OnClickListener() {

public void onClick(View v) {

});

}

jumpToLayout1();// 调 用 跳 转 方 法 jumpToLayout1()

/* method jumpToLayout1: 将 layout 由 mylayout.xml 切 换 成 main.xml */

public void jumpToLayout1() {

}

/* 将 layout 改 成 main.xml */

setContentView(R.layout.main);

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

Button b1 = (Button) findViewById(R.id.button1);

b1.setOnClickListener(new

new Button.OnClickListener() {

public void onClick(View v) {

});

}

jumpToLayout2();// 调 用 跳 转 方 法 jumpToLayout2()

7

结 果

9


-----------------------------------Android 编 程 基 础

调 用 另 一 个 Activity

Intent 对 象 的 使 用

1

新 建 工 程

2 在 string.xml 中 添 加 两 个 字 符 串



Hello World, Ex9_UI!

Ex9_UI

This is Activity 1!

This is Activity 2!


3 新 建 color.xml 存 放 颜 色 值



#000000

#FFFFFFFF


4 修 改 main.xml 布 局 , 添 加 一 个 TextView 和 一 个 Button





-----------------------------------Android 编 程 基 础

android:layout_x="100px"

android:layout_y="82px"

android:text="Go to Activity2"

>


5 新 建 一 个 secondlayout.xml 布 局 , 并 添 加 一 个 TextView 和 一 个 Button






6 新 建 SecondActivity.java 文 件 , 添 加 内 容

package zyf.Ex9_UI;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class SecondActivity extends Activity {

11


-----------------------------------Android 编 程 基 础

}

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

/* 载 入 mylayout.xml Layout */

setContentView(R.layout.mylayout);

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

Button b2 = (Button) findViewById(R.id.button2);

b2.setOnClickListener(new

new Button.OnClickListener() {

public void onClick(View v) {

});

}

/* new 一 个 Intent 对 象 , 并 指 定 要 启 动 的 class */

Intent intent = new Intent();

intent.setClass(SecondActivity.this

this, Ex9_UI.class

class);

/* 调 用 一 个 新 的 Activity */

startActivity(intent);

/* 关 闭 原 本 的 Activity */

SecondActivity.this

this.finish();

7 修 改 mainActivity.java, 添 加 代 码

package zyf.Ex9_UI;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class Ex9_UI extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 载 入 main.xml Layout */

setContentView(R.layout.main);

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

Button b1 = (Button) findViewById(R.id.button1);

b1.setOnClickListener(new

new Button.OnClickListener() {

public void onClick(View v) {

/* new 一 个 Intent 对 象 , 并 指 定 要 启 动 的 class */

Intent intent = new Intent();

12


-----------------------------------Android 编 程 基 础

}

}

});

}

intent.setClass(Ex9_UI.this

this, SecondActivity.class

class);

/* 调 用 一 个 新 的 Activity */

startActivity(intent);

/* 关 闭 原 本 的 Activity */

Ex9_UI.this

this.finish();

8 在 AndroidManifest.xml 文 件 中 添 加 SecondActivity














9

结 果

13


-----------------------------------Android 编 程 基 础

不 同 Activity 之 间 的 数 据 传 递

Bundle 对 象 的 实 现

1

新 建 工 程

2 修 改 main.xml 布 局 , 添 加 UI 元 素










-----------------------------------Android 编 程 基 础

android:layout_x="124px"

android:layout_y="101px">











3 新 建 mylayout.xml, 并 添 加 UI 元 素




-----------------------------------Android 编 程 基 础

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="20sp"

android:layout_x="50px"

android:layout_y="72px"

>


4 新 建 一 个 BMIActivity.java

package zyf.Ex10_UI;

import android.app.Activity;

import android.os.Bundle;

public class BMIActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

}

5 在 AndroidManifest.xml 添 加 Activity 定 义














16


-----------------------------------Android 编 程 基 础

6 修 改 BMIActivity.java 内 容

package zyf.Ex10_UI;

/* import 相 关 class */

import java.text.DecimalFormat;

import java.text.NumberFormat;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class BMIActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

/* 加 载 main.xml Layout */

setContentView(R.layout.mylayout);

/* 取 得 Intent 中 的 Bundle 对 象 */

Bundle bunde = this.getIntent().getExtras();

/* 取 得 Bundle 对 象 中 的 数 据 */

String sex = bunde.getString("sex");

double height = bunde.getDouble("height");

/* 判 断 性 别 */

String sexText = "";

if (sex.equals("M")) {

sexText = " 男 性 ";

} else {

}

sexText = " 女 性 ";

/* 取 得 标 准 体 重 */

String weight = this.getWeight(sex, height);

/* 设 置 输 出 文 字 */

TextView tv1 = (TextView) findViewById(R.id.text1);

tv1.setText(" 你 是 一 位 " + sexText + "\n 你 的 身 高 是 " + height +

" 厘 米 \n 你 的 标 准 体 重 是 "+ weight + " 公 斤 ");

/* 四 舍 五 入 的 method */

private String format(double

num) {

NumberFormat formatter = new DecimalFormat("0.00");

String s = formatter.format(num);

return s;

}

17


-----------------------------------Android 编 程 基 础

}

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

private String getWeight(String sex, double height) {

String weight = "";

if (sex.equals("M")) {

weight = format((height - 80) * 0.7);

} else {

weight = format((height - 70) * 0.6);

}

return weight;

}

7 修 改 mainActivity.java 内 容

package zyf.Ex10_UI;

/* import 相 关 class */

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.RadioButton;

public class Ex10_UI extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 载 入 main.xml Layout */

setContentView(R.layout.main);

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

Button ok = (Button) findViewById(R.id.button_OK);

ok.setOnClickListener(new

new Button.OnClickListener() {

public void onClick(View v) {

/* 取 得 输 入 的 身 高 */

EditText et = (EditText) findViewById(R.id.height_Edit);

double height = Double.parseDouble(et.getText().toString());

/* 取 得 选 择 的 性 别 */

String sex = "";

RadioButton rb1 = (RadioButton) findViewById(R.id.Sex_Man);

if (rb1.isChecked()) {

sex = "M";

} else {

18


-----------------------------------Android 编 程 基 础

}

}

});

}

}

sex = "F";

/* new 一 个 Intent 对 象 , 并 指 定 class */

Intent intent = new Intent();

intent.setClass(Ex10_UI.this

this, BMIActivity.class

class);

/* new 一 个 Bundle 对 象 , 并 将 要 传 递 的 数 据 传 入 */

Bundle bundle = new Bundle();

bundle.putDouble("height", height);

bundle.putString("sex", sex);

/* 将 Bundle 对 象 assign 给 Intent */

intent.putExtras(bundle);

/* 调 用 Activity EX03_10_1 */

startActivity(intent);

8 结 果 :

19


-----------------------------------Android 编 程 基 础

返 回 数 据 到 前 一 个 Activity

startActivityForResult 方 法

1

新 建 工 程

2 修 改 main.xml 布 局 , 添 加 UI 元 素










-----------------------------------Android 编 程 基 础

android:layout_x="124px"

android:layout_y="101px">











3 新 建 一 个 mylayout.xml 布 局 , 添 加 UI 元 素




-----------------------------------Android 编 程 基 础

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="20sp"

android:layout_x="50px"

android:layout_y="72px"

>



上 一 例 子 中 新 添 加

4 新 建 一 个 SecondActivity.java 的 Activity 子 类

package zyf.Ex11_UI_A;

import android.app.Activity;

import android.os.Bundle;

public class BMIActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

}

5 在 AndroidManifest.xml 中 添 加 SecondActivity 这 个 Activity









22


-----------------------------------Android 编 程 基 础




必 须 在 AndroidManifest 中 注 册 新 的


Activity, 否 则 程 序 出 错


6 修 改 mainActivity.java 代 码

package zyf.Ex11_UI_A;

import android.app.Activity;/* import 相 关 class */

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.RadioButton;

import android.widget.Toast;

public class Ex11_UI_A extends Activity {

protected int my_requestCode = 1550;

private EditText edit_height;

private RadioButton radiobutton_Man, radiobutton_Woman;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 载 入 main.xml Layout */

setContentView(R.layout.main);

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

Button ok = (Button) findViewById(R.id.button_OK);

edit_height = (EditText) findViewById(R.id.height_Edit);

radiobutton_Man = (RadioButton) findViewById(R.id.Sex_Man);

radiobutton_Woman = (RadioButton) findViewById(R.id.Sex_Woman);

ok.setOnClickListener(new

new Button.OnClickListener() {

public void onClick(View v) {

try {

/* 取 得 输 入 的 身 高 */

double height = Double.parseDouble(edit_height.getText()

.toString());

/* 取 得 选 择 的 性 别 */

String sex = "";

if (radiobutton_Man.isChecked()) {

sex = "M";

} else {

}

sex = "F";

23


-----------------------------------Android 编 程 基 础

}

}

});

}

/* new 一 个 Intent 对 象 , 并 指 定 class */

Intent intent = new Intent();

intent.setClass(Ex11_UI_A.this

this, BMIActivity.class

class);

/* new 一 个 Bundle 对 象 , 并 将 要 传 递 的 数 据 传 入 */

Bundle bundle = new Bundle();

bundle.putDouble("height", height);

bundle.putString("sex", sex);

/* 将 Bundle 对 象 assign 给 Intent */

intent.putExtras(bundle);

/* 调 用 Activity EX03_10_1 */

startActivityForResult(intent, my_requestCode);

} catch (Exception e) {

// TODO: handle exception

Toast.makeText(Ex11_UI_A.this

this,

}

R.string.errorString, Toast.LENGTH_LONG).show();

@Override

protected void onActivityResult(int

int requestCode, int resultCode,

}

Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

switch (resultCode) {

case RESULT_OK:

/* 取 得 来 自 Activity2 的 数 据 , 并 显 示 于 画 面 上 */

Bundle bunde = data.getExtras();

String sex = bunde.getString("sex");

double height = bunde.getDouble("height");

edit_height.setText("" + height);

if (sex.equals("M")) {

radiobutton_Man.setChecked(true

true);

} else {

radiobutton_Woman.setChecked(true

true);

}

break;

default:

break;

}

新 重 写 方 法 , 等 待 返 回 结 果

24


-----------------------------------Android 编 程 基 础

7 修 改 SecondActivity.java 代 码

package zyf.Ex11_UI_A;

/* import 相 关 class */

import java.text.DecimalFormat;

import java.text.NumberFormat;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class BMIActivity extends Activity {

private Intent intent;

private Bundle bunde;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 加 载 main.xml Layout */

setContentView(R.layout.mylayout);

/* 取 得 Intent 中 的 Bundle 对 象 */

intent = this.getIntent();

bunde = intent.getExtras();

/* 取 得 Bundle 对 象 中 的 数 据 */

String sex = bunde.getString("sex");

double height = bunde.getDouble("height");

/* 判 断 性 别 */

String sexText = "";

if (sex.equals("M")) {

sexText = " 男 性 ";

} else {

}

sexText = " 女 性 ";

/* 取 得 标 准 体 重 */

String weight = this.getWeight(sex, height);

/* 设 置 输 出 文 字 */

TextView tv1 = (TextView) findViewById(R.id.text1);

tv1.setText(" 你 是 一 位 " + sexText + "\n 你 的 身 高 是 " + height +

" 厘 米 \n 你 的 标 准 体 重 是 "+ weight + " 公 斤 ");

25


-----------------------------------Android 编 程 基 础

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

Button b1 = (Button) findViewById(R.id.button_back);

b1.setOnClickListener(new

new Button.OnClickListener() {

}

@Override

public void onClick(View v) {

返 回 刚 刚 接 收 的 Intent

// TODO Auto-generated method stub

/* 返 回 result 回 上 一 个 activity */

BMIActivity.this

this.setResult(RESULT_OK, intent);

/* 结 束 这 个 activity */

BMIActivity.this

this.finish();

}

});

}

/* 四 舍 五 入 的 method */

private String format(double

num) {

NumberFormat formatter = new DecimalFormat("0.00");

String s = formatter.format(num);

return s;

}

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */

private String getWeight(String sex, double height) {

String weight = "";

if (sex.equals("M")) {

weight = format((height - 80) * 0.7);

} else {

weight = format((height - 70) * 0.6);

}

return weight;

}

8

结 果

26


-----------------------------------Android 编 程 基 础

封 面

27


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

Android

UI 编 程 基 础 3

EditText 与 TextView 共 舞

setOnKeyListener 事 件

1

新 建 工 程

2 在 main.xml 布 局 中 添 加 UI 元 素 : 一 个 EditText 和 一 个 TextView







3 在 mainActivity.java 主 Activity 中 修 改 代 码

package zyf.EX_Ctrl_1;

import android.app.Activity;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;

public class EX_Ctrl_1 extends Activity {

private TextView mTextView01;

2


-----------------------------------Android 编 程 基 础

private EditText mEditText01;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* 取 得 TextView、EditText */

mTextView01 = (TextView) findViewById(R.id.myTextView);

mEditText01 = (EditText) findViewById(R.id.myEditText);

处 理 EditText 键 入 事 件

/* 设 置 EditText 用 OnKeyListener 事 件 来 启 动 */

mEditText01.setOnKeyListener(new

new EditText.OnKeyListener(){

}

}

@Override

public boolean onKey(View v, int keyCode, KeyEvent event) {

// TODO Auto-generated method stub

mTextView01.setText(mEditText01.getText().toString());

return false;

}

});

4

结 果

3


-----------------------------------Android 编 程 基 础

设 计 具 有 背 景 图 的 按 钮

ImageButton 的 焦 点 及 事 件 处 理

1

新 建 工 程

2

准 备 png 图 片 资 源 clickimage.png、lostfocusimage.png、onfocusimage.png

3 在 string.xml 中 添 加 字 符 串



EX_Ctrl_2

图 片 按 钮 状 态 : 未 知

图 片 按 钮 状 态 :Got Focus

图 片 按 钮 状 态 :Lost Focus

图 片 按 钮 状 态 :Got Click

一 般 按 钮


4 修 改 main.xml 布 局 , 添 加 布 局 元 素





-----------------------------------Android 编 程 基 础

android:layout_width="wrap_content"

android:layout_height="wrap_content"

/>



5 修 改 mainActivity.java

package zyf.EX_Ctrl_2;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnFocusChangeListener;

import android.widget.Button;

import android.widget.ImageButton;

import android.widget.TextView;

public class EX_Ctrl_2 extends Activity {

/** Called when the activity is first created. */

/* 声 明 三 个 对 象 变 量 ( 图 片 按 钮 , 按 钮 , 与 TextView) */

private ImageButton mImageButton1;

private Button mButton1;

private TextView mTextView1;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* 通 过 findViewById 构 造 三 个 对 象 */

mImageButton1 = (ImageButton) findViewById(R.id.image_Button);

mButton1 = (Button) findViewById(R.id.normal_Button);

mTextView1 = (TextView) findViewById(R.id.show_TextView);

/* 通 过 OnFocusChangeListener 来 响 应 ImageButton 的 onFous 事 件 */

mImageButton1.setOnFocusChangeListener(new

new OnFocusChangeListener() {

public void onFocusChange(View arg0, boolean isFocused) {

// TODO Auto-generated method stub

/* 若 ImageButton 状 态 为 onFocus 改 变 ImageButton 的 图 片

并 改 变 textView 的 文 字 */

if (isFocused == true) {

mTextView1.setText(R.string.onfocus);

mImageButton1.setImageResource(R.drawable.onfocusimage);

5


-----------------------------------Android 编 程 基 础

});

}

}

/* 若 ImageButton 状 态 为 offFocus 改 变 ImageButton 的 图 片

并 改 变 textView 的 文 字 */

else {

}

mTextView1.setText(R.string.lostfocus);

mImageButton1.setImageResource(R.drawable.lostfocusimage);

/* 通 过 onClickListener 来 响 应 ImageButton 的 onClick 事 件 */

mImageButton1.setOnClickListener(new

new OnClickListener() {

public void onClick(View v){

// TODO Auto-generated method stub

});

}

/* 若 ImageButton 状 态 为 onClick 改 变 ImageButton 的 图 片

并 改 变 textView 的 文 字 */

mTextView1.setText(R.string.onclick);

mImageButton1.setImageResource(R.drawable.clickimage);

}

}

/* 通 过 onClickListener 来 响 应 Button 的 onClick 事 件 */

mButton1.setOnClickListener(new

new OnClickListener(){

});

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

}

/* 若 Button 状 态 为 onClick 改 变 ImageButton 的 图 片

* 并 改 变 textView 的 文 字 */

mTextView1.setText(R.string.lostfocus);

mImageButton1.setImageResource(R.drawable.lostfocusimage);

6

结 果

6


-----------------------------------Android 编 程 基 础

使 用 XML 实 现 按 钮 改 变 焦 点 设 置 背 景 图

Button 的 android:background 属 性

设 置 按 钮 背 景 图 片 :

‣ onFocus() 与 onClick() 事 件 处 理

‣ Item 的 android:state_focused 和 android:state_pressed 属 性


实 现

1

新 建 工 程

2

准 备 png 背 景 图 片 defaultimage.png 、onfocusimage.png、clickimage.png

clickimage defaultimage.png onfocusimage.png

3 在 main.xml 布 局 中 添 加 一 个 ImageButton 和 一 个 Button( 作 对 比 )




-----------------------------------Android 编 程 基 础

4 在 drawable 文 件 夹 中 添 加 一 个 advancedbutton.xml 设 置 和 标 签






默 认 时



5 设 置 ImageButton 的 android:background 属 性 值


利 用 XML 来 改 变 按 钮 背 景 图 片

6

结 果

8


-----------------------------------Android 编 程 基 础

给 圣 诞 老 人 的 信 息

Toast--Android 专 属 浮 动 小 提 示

1

新 建 工 程

2 在 string.xml 中 添 加 字 符 串



EX_Ctrl_3

亲 爱 的 圣 诞 老 人 :

送 出 愿 望

你 的 愿 望 :

已 送 达 圣 诞 老 人 信 箱 !


3 在 main.xml 布 局 中 添 加 UI 元 素 : 一 个 TextView、 一 个 EditView 和 一 个 Button







9


-----------------------------------Android 编 程 基 础

4 修 改 mainActivity.java 文 件

package zyf.EX_Ctrl_3;

import android.app.Activity;

import android.os.Bundle;

import android.text.Editable;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class EX_Ctrl_3 extends Activity {

/** Called when the activity is first created. */

/* 声 明 两 个 对 象 变 量 ( 按 钮 与 编 辑 文 字 )*/

private Button mButton;

private EditText mEditText;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* 通 过 findViewById() 取 得 对 象 */

mButton=(Button)findViewById(R.id.Button_Send);

mEditText=(EditText)findViewById(R.id.EditText_Wish);

/* 设 置 onClickListener 给 Button 对 象 聆 听 onClick 事 件 */

mButton.setOnClickListener(new

new Button.OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Toast.makeText(

_LONG).show();

}

}

});

}

/* 声 明 字 符 串 变 量 并 取 得 用 户 输 入 的 EditText 字 符 串 */

Editable Str;

Str=mEditText.getText();

/* 使 用 CharSequence 类 getString() 方 法 从 XML 中 获 取 String*/

CharSequence string2=getString(R.string.yourWish);

CharSequence string3=getString(R.string.hasSend);

/* 使 用 系 统 标 准 的 makeText() 方 式 来 产 生 Toast 信 息 */

EX_Ctrl_3.this

this,string2+Str.toString()+string3,Toast.LENGTH

/* 清 空 EditText*/

mEditText.setText("");

10


-----------------------------------Android 编 程 基 础

5

结 果

11


-----------------------------------Android 编 程 基 础

Toast-- 显 示 View 的 提 示

Toast 显 示 一 个 ImageView

1

新 建 工 程

2

在 drawable 文 件 夹 中 添 加 一 副 png 图 片 :argon.png

3 修 改 mainActivity.java 文 件

package zyf.EX_Ctrl_3_B;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ImageView;

import android.widget.Toast;

public class EX_Ctrl_3_B extends Activity {

}

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

/* 设 置 主 屏 布 局 */

setContentView(R.layout.main);

/* 创 建 新 Toast 对 象 */

Toast showImageToast=new

Toast(this

this);

/* 创 建 新 ImageView 对 象 */

ImageView imageView=new

ImageView(this

this);

/* 从 资 源 中 获 取 图 片 */

imageView.setImageResource(R.drawable.argon);

/* 设 置 Toast 上 的 View--(ImageView)*/

showImageToast.setView(imageView);

/* 设 置 Toast 显 示 时 间 */

showImageToast.setDuration(Toast.LENGTH_LONG);

/* 显 示 Toast*/

showImageToast.show();

12


-----------------------------------Android 编 程 基 础

4

结 果

13


-----------------------------------Android 编 程 基 础

Toast 显 示 一 个 Button

1

新 建 工 程

2 修 改 mainActivity.java 文 件

package zyf.EX_Ctrl_3_B;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class EX_Ctrl_3_B extends Activity {

}

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

/* 设 置 主 屏 布 局 */

setContentView(R.layout.main);

/* 创 建 新 Toast 对 象 */

Toast showImageToast = new Toast(this

this);

// /* 新 建 Button 对 象 */

Button button = new Button(this

this);

button.setText("OK");

/* 设 置 Toast 上 的 View--(Button) */

showImageToast.setView(button);

/* 设 置 Toast 显 示 时 间 */

showImageToast.setDuration(Toast.LENGTH_LONG);

/* 显 示 Toast */

showImageToast.show();

3

结 果

14


-----------------------------------Android 编 程 基 础

Toast 显 示 一 个 TextView

1

新 建 工 程

2 修 改 mainActivity.java 文 件

package zyf.EX_Ctrl_3_B;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

import android.widget.Toast;

public class EX_Ctrl_3_B extends Activity {

}

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

3

/* 设 置 主 屏 布 局 */

setContentView(R.layout.main);

/* 创 建 新 Toast 对 象 */

Toast showImageToast = new Toast(this

this);

/* 新 建 TextView 对 象 */

TextView text=new

TextView(this

this);

/* 设 置 TextView 内 容 */

text.setText(" 显 示 在 Toast 中 的 TextView");

/* 设 置 Toast 上 的 View--(TextView) */

showImageToast.setView(text);

/* 设 置 Toast 显 示 时 间 */

showImageToast.setDuration(Toast.LENGTH_LONG);

/* 显 示 Toast */

showImageToast.show();

结 果

15


-----------------------------------Android 编 程 基 础

AlertDialog.Builder 提 示 对 话 框

1

新 建 工 程

2 修 改 mainActivity.java 文 件

package zyf.EX_Ctrl_3_B;

import android.app.Activity;

import android.app.AlertDialog;

import android.os.Bundle;

public class EX_Ctrl_3_B extends Activity {

}

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

/* 设 置 主 屏 布 局 */

setContentView(R.layout.main);

/* 新 建 一 个 AlertDialog.Builder 对 象 */

AlertDialog.Builder my_ADialog =new

AlertDialog.Builder(this

this);

/* 设 置 标 题 */

my_ADialog.setTitle("Android 提 示 ");

/* 设 置 显 示 消 息 */

my_ADialog.setMessage("AlertDialog.Builder 提 示 对 话 框 消 息 !!");

/* 显 示 */

my_ADialog.show();

3

结 果

16


-----------------------------------Android 编 程 基 础

同 意 条 款

CheckBox 的 isChecked 属 性

1

创 建 新 工 程

2 在 string.xml 中 添 加 字 符 串



Ex_Ctrl_4

请 勾 选 我 同 意

您 已 接 受 同 意 !!

您 未 同 意 !!

全 部 许 可


3 修 改 main.xml 布 局 , 添 加 UI 元 素








17


-----------------------------------Android 编 程 基 础

4 修 改 mainActivity.java 文 件

package zyf.Ex_Ctrl_4;

import android.app.Activity;

import android.graphics.Color;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.CheckBox;

import android.widget.TextView;

public class Ex_Ctrl_4 extends Activity {

/** Called when the activity is first created. */

private TextView showAdvice,yourChoiceshow;

private CheckBox iAccept;

private Button ok;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/*findViewById() 从 资 源 ID 获 取 资 源 对 象 */

showAdvice=(TextView)findViewById(R.id.TextView_Guide);

yourChoiceshow=(TextView)findViewById(R.id.TextView_youChoiceShow);

iAccept=(CheckBox)findViewById(R.id.CheckBox_Accept);

ok=(Button)findViewById(R.id.Button_OK);

/* 获 取 XML 中 字 符 串 */

CharSequence titleString=getString(R.string.allOK);

/* 设 置 复 选 框 标 题 */

iAccept.setHint(titleString);

/* 设 置 复 选 框 标 题 字 体 颜 色 */

iAccept.setHintTextColor(Color.RED);

/* 将 CheckBox 设 置 成 未 选 中 */

iAccept.setChecked(false

false);

/* 将 Button 设 置 成 不 可 选 */

ok.setEnabled(false

false);

iAccept.setOnClickListener(new

new CheckBox.OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

if(iAccept.isChecked()){

18


-----------------------------------Android 编 程 基 础

}

ok.setEnabled(true

true);

yourChoiceshow.setText(R.string.accept);

}else

else{

ok.setEnabled(false

false);

yourChoiceshow.setText(R.string.Notaccept);

}

});

ok.setOnClickListener(new

new Button.OnClickListener(){

}

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

if(iAccept.isChecked()){

showAdvice.setText(R.string.accept);

}

}

});

5

结 果

19


-----------------------------------Android 编 程 基 础

购 物 列 表

多 选 项 CheckBox 的 应 用

1

新 建 工 程

2 在 string.xml 中 添 加 字 符 串



Ex_Ctrl_5

网 上 购 物 商 品 清 单

您 选 择 购 买 的 商 品 :

纽 曼 MP4

Beyond 乐 队 CD

Android 程 序 员 指 南


3 修 改 main.xml 布 局 , 添 加 UI 元 素







-----------------------------------Android 编 程 基 础

android:id="@+id/CheckBox_book"

android:layout_width="180px">




4 修 改 mainActivity.java, 添 加 逻 辑 判 断

package zyf.Ex_Ctrl_5;

import android.app.Activity;

import android.os.Bundle;

import android.widget.CheckBox;

import android.widget.CompoundButton;

import android.widget.TextView;

import android.widget.CompoundButton.OnCheckedChangeListener;

public class Ex_Ctrl_5 extends Activity {

/** Called when the activity is first created. */

private TextView showyourChoice_TextView;

private CheckBox mp4_CheckBox, musicCD_CheckBox, book_CheckBox;

private String showinfo;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* findViewById() 从 XML 中 获 取 资 源 对 象 */

showyourChoice_TextView = (TextView)

findViewById(R.id.TextView_yourWoodsList);

mp4_CheckBox = (CheckBox) findViewById(R.id.CheckBox_MP4);

musicCD_CheckBox = (CheckBox) findViewById(R.id.CheckBox_musicCD);

book_CheckBox = (CheckBox) findViewById(R.id.CheckBox_book);

/* 为 三 个 CheckBox 设 置 选 择 状 态 改 变 事 件 监 听 器 */

21


-----------------------------------Android 编 程 基 础

mp4_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);

musicCD_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);

book_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);

}

/* 从 XML 中 获 取 显 示 信 息 String */

showinfo = getString(R.string.yourChocieWoods_text);

/* 内 部 接 口 实 现 */

private OnCheckedChangeListener CheckedChangeListener = new

OnCheckedChangeListener() {

@Override

public void onCheckedChanged(CompoundButton buttonView,

boolean isChecked) {

// TODO Auto-generated method stub

/* 处 理 选 中 状 态 改 变 事 件 , 动 态 显 示 选 择 结 果 */

if (mp4_CheckBox.isChecked()) {

showinfo = getString(R.string.woods_Text_MP4) + "\n";

showString();

} else if (musicCD_CheckBox.isChecked()) {

showinfo = getString(R.string.woods_Text_musicCD) + "\n";

showString();

} else if (book_CheckBox.isChecked()) {

showinfo = getString(R.string.woods_Text_book) + "\n";

showString();

}

if (mp4_CheckBox.isChecked() && musicCD_CheckBox.isChecked()) {

showinfo = getString(R.string.woods_Text_MP4) + "\n"

+ getString(R.string.woods_Text_musicCD) + "\n";

showString();

} else if (mp4_CheckBox.isChecked() && book_CheckBox.isChecked()) {

showinfo = getString(R.string.woods_Text_MP4) + "\n"

+ getString(R.string.woods_Text_book) + "\n";

showString();

} else if (musicCD_CheckBox.isChecked()

&& book_CheckBox.isChecked()) {

showinfo = getString(R.string.woods_Text_musicCD) + "\n"

+ getString(R.string.woods_Text_book) + "\n";

showString();

}

if (mp4_CheckBox.isChecked() && musicCD_CheckBox.isChecked()

&& book_CheckBox.isChecked()) {

showinfo = getString(R.string.woods_Text_MP4) + "\n"

22


-----------------------------------Android 编 程 基 础

}

+ getString(R.string.woods_Text_musicCD) + "\n"

+ getString(R.string.woods_Text_book) + "\n";

showString();

}

if (mp4_CheckBox.isChecked() == false

&& musicCD_CheckBox.isChecked() == false

&& book_CheckBox.isChecked() == false) {

showyourChoice_TextView.setText("");

}

}

};

public void showString() {

showyourChoice_TextView.setText(showinfo);

}

5

结 果

23


-----------------------------------Android 编 程 基 础

RadioButton 单 选

RadioGroup 组 与 onCheckedChanged 事 件

1

新 建 工 程

2 string.xml 中 添 加 字 符 串



Ex_Ctrl_6

帅 哥

美 女

请 问 你 是 ??


3 修 改 mian.xml 布 局 , 添 加 UI 元 素









24


-----------------------------------Android 编 程 基 础

4 修 改 mainActivity.java 文 件

package zyf.Ex_Ctrl_6;

import android.app.Activity;

import android.os.Bundle;

import android.widget.RadioButton;

import android.widget.RadioGroup;

import android.widget.TextView;

public class Ex_Ctrl_6 extends Activity {

/** Called when the activity is first created. */

private TextView answer_TextView;

private RadioButton boy_RadioButton,girl_RadioButton;

private RadioGroup radioGroup;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* findViewById() 从 XML 中 获 取 资 源 对 象 */

answer_TextView=(TextView)findViewById(R.id.TextView_Ask_And_Show);

radioGroup=(RadioGroup)findViewById(R.id.RadioGroup);

boy_RadioButton=(RadioButton)findViewById(R.id.RadioButton_Boy);

girl_RadioButton=(RadioButton)findViewById(R.id.RadioButton_Gril);

/* 给 单 RadioGroup 添 加 状 态 改 变 监 听 器 */

radioGroup.setOnCheckedChangeListener(new

new

RadioGroup.OnCheckedChangeListener(){

}

}

@Override

public void onCheckedChanged(RadioGroup group, int checkedId) {

// TODO Auto-generated method stub

if(boy_RadioButton.isChecked()){

answer_TextView.setText(R.string.iam_Boy);

}else

else{

answer_TextView.setText(R.string.iamGirl);

}

}

});

25


-----------------------------------Android 编 程 基 础

5

结 果

26


-----------------------------------Android 编 程 基 础

RadioButton 猜 猜 看

猜 猜 我 是 ??

1

新 建 项 目

2

准 备 三 张 png 图 片

ic_menu_close_clear_cancel.png right.png wrong.png

3 在 string.xml 中 添 加 要 使 用 的 字 符 串



Ex_Ctrl_6

帅 哥

美 女

猜 猜 我 是 ??

回 答

清 空

恭 喜 !

很 遗 憾 !

OK

您 答 对 了 !!

哈 哈 , 错 误 !

正 确 答 案 是 :


4 在 main.xml 中 添 加 UI 元 素




27


-----------------------------------Android 编 程 基 础












5 修 改 mainActivity.java 文 件

package zyf.Ex_Ctrl_6;

import java.util.Random;

import android.app.Activity;

import android.app.AlertDialog;

import android.os.Bundle;

import android.view.Menu;

28


-----------------------------------Android 编 程 基 础

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.RadioButton;

import android.widget.RadioGroup;

import android.widget.TextView;

import android.widget.Toast;

public class Ex_Ctrl_6 extends Activity implements Button.OnClickListener {

/** Called when the activity is first created. */

private TextView answer_TextView;

private RadioButton boy_RadioButton, girl_RadioButton;

private RadioGroup radioGroup;

private Button answer_Button, clean_Button;

private String[] boy_girl;

private AlertDialog.Builder showRightorNot;

private MenuItem exit;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* 结 果 显 示 对 话 框 */

showRightorNot = new AlertDialog.Builder(this

this);

/* findViewById() 从 XML 中 获 取 资 源 对 象 */

answer_TextView = (TextView) findViewById(R.id.TextView_Ask_And_Show);

radioGroup = (RadioGroup) findViewById(R.id.RadioGroup);

boy_RadioButton = (RadioButton) findViewById(R.id.RadioButton_Boy);

girl_RadioButton = (RadioButton) findViewById(R.id.RadioButton_Gril);

answer_Button = (Button) findViewById(R.id.answer_The_Q_button);

clean_Button = (Button) findViewById(R.id.clean_The_Q_button);

/* 答 案 数 组 */

boy_girl = new String[] { "Boy", "Girl","Boy", "Girl",

"Boy", "Girl","Boy", "Girl",

"Boy" };

/* 按 钮 设 置 成 不 可 选 */

answer_Button.setEnabled(false

false);

clean_Button.setEnabled(false

false);

29


-----------------------------------Android 编 程 基 础

/* 给 单 RadioGroup 添 加 状 态 改 变 监 听 器 */

radioGroup.setOnCheckedChangeListener(new

new

RadioGroup.OnCheckedChangeListener() {

@Override

public void onCheckedChanged(RadioGroup group,int

checkedId){

// TODO Auto-generated method stub

/* 判 断 显 示 */

if (boy_RadioButton.isChecked()) {

answer_TextView.setText(R.string.iam_Boy);

} else {

answer_TextView.setText(R.string.iamGirl);

}

}

});

boy_RadioButton.setOnClickListener(new

new RadioGroup.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

/* 按 钮 设 置 成 可 选 */

answer_Button.setEnabled(true

true);

clean_Button.setEnabled(true

true);

}

});

girl_RadioButton.setOnClickListener(new

new RadioGroup.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

/* 按 钮 设 置 成 可 选 */

answer_Button.setEnabled(true

true);

clean_Button.setEnabled(true

true);

}

}

});

/* 设 置 按 钮 事 件 监 听 器 */

answer_Button.setOnClickListener(this

this);

clean_Button.setOnClickListener(this

this);

30


-----------------------------------Android 编 程 基 础

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

if (v.getId() == R.id.answer_The_Q_button) {

if (boy_RadioButton.isChecked()) {

checkTheAnswer("Boy");

} else if (girl_RadioButton.isChecked()) {

checkTheAnswer("Girl");

}

}

if (v.getId() == R.id.clean_The_Q_button) {

/* 按 钮 设 置 成 未 选 取 */

boy_RadioButton.setChecked(false

false);

girl_RadioButton.setChecked(false

false);

/* 按 钮 设 置 成 不 可 选 */

answer_Button.setEnabled(false

false);

clean_Button.setEnabled(false

false);

answer_TextView.setText(R.string.ask);

}

}

private void checkTheAnswer(String checkstring) {

// TODO Auto-generated method stub

/* 检 测 提 示 */

Toast.makeText(this

this, " 检 测 答 案 …………", Toast.LENGTH_SHORT).show();

/* 获 取 随 机 数 */

Random random = new Random();

int index = random.nextInt(9);

if (boy_girl[index].equals(checkstring)) {

/* 回 答 正 确 , 设 置 提 示 对 话 框 , 显 示 结 果 */

showRightorNot.setIcon(R.drawable.right);

showRightorNot.setTitle(R.string.showAnswerTitle_YES);

showRightorNot.setPositiveButton(R.string.about_dialog_ok, null);

showRightorNot.setMessage(R.string.right).show();

Toast.makeText(this

this,getString(R.string.answerIS)

} else {

/* 回 答 错 误 , 设 置 提 示 对 话 框 , 显 示 结 果 */

showRightorNot.setIcon(R.drawable.wrong);

+boy_girl[index],Toast.LENGTH_LONG).show();

showRightorNot.setTitle(R.string.showAnswerTitle_NO);

showRightorNot.setPositiveButton(R.string.about_dialog_ok, null);

31


-----------------------------------Android 编 程 基 础

showRightorNot.setMessage(R.string.wrong).show();

}

}

Toast.makeText(this

this,getString(R.string.answerIS)+

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// TODO Auto-generated method stub

}

/* 添 加 退 出 菜 单 */

exit=menu.add("Exit");

boy_girl[index], Toast.LENGTH_LONG).show();

/* 设 置 退 出 菜 单 图 片 */

exit.setIcon(R.drawable.ic_menu_close_clear_cancel);

return super.onCreateOptionsMenu(menu);

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// TODO Auto-generated method stub

}

6

/* 结 束 Activity*/

finish();

return super.onOptionsItemSelected(item);

结 果

32


-----------------------------------Android 编 程 基 础

封 面

33


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

Android 基 础 UI 编 程 4

专 业 相 框 设 计

ImageView 的 堆 叠 应 用

1

新 建 工 程

2

准 备 三 张 png 图 片

left.png right.png photo.png

3 修 改 main.xml 布 局 , 添 加 UI 元 素




android:id="@+id/myImageView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_x="0px"

android:layout_y="36px"



android:id="@+id/myImageView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_x="0px"

android:layout_y="36px"



-----------------------------------Android 编 程 基 础

/>

android:id="@+id/myButton1"

android:layout_width="105px"

android:layout_height="66px"

android:text="pic1"

android:layout_x="9px"

android:layout_y="356px"



android:id="@+id/myButton2"

android:layout_width="105px"

android:layout_height="66px"

android:text="pic2"

android:layout_x="179px"

android:layout_y="356px"


4 修 改 mainActivity.java

package zyf.Ex_Ctrl_7;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.ImageView;

public class Ex_Ctrl_7 extends Activity {

/** Called when the activity is first created. */

/* 声 明 Button、ImageView 对 象 */

private ImageView mImageView01;

private ImageView mImageView02;

private Button mButton01;

private Button mButton02;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* 取 得 Button、ImageView 对 象 */

mImageView01 = (ImageView) findViewById(R.id.myImageView1);

mImageView02 = (ImageView) findViewById(R.id.myImageView2);

mButton01 = (Button) findViewById(R.id.myButton1);

mButton02 = (Button) findViewById(R.id.myButton2);

/* 设 置 ImageView 背 景 图 */

mImageView01.setImageDrawable(getResources().getDrawable(

R.drawable.right));

3


-----------------------------------Android 编 程 基 础

}

}

mImageView02.setImageDrawable(getResources().getDrawable(

R.drawable.photo));

/* 用 OnClickListener 事 件 来 启 动 */

mButton01.setOnClickListener(new

new Button.OnClickListener() {

@Override

public void onClick(View v) {

}

/* 当 启 动 后 , ImageView 立 刻 换 背 景 图 */

mImageView01.setImageDrawable(getResources().getDrawable(

R.drawable.right));

});

mButton02.setOnClickListener(new

new Button.OnClickListener() {

});

@Override

public void onClick(View v) {

}

mImageView01.setImageDrawable(getResources().getDrawable(

R.drawable.left));

5

结 果

4


-----------------------------------Android 编 程 基 础

ImageButton 的 堆 叠 应 用

1

新 建 项 目

2

准 备 三 张 png 图 片

left.png right.png photo.png

3 修 改 main.xml 布 局 , 添 加 UI 元 素




设 置 成 堆 叠



4 修 改 mainActivity.java

package zyf.Ex_Ctrl_7_B;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.ImageButton;

5


-----------------------------------Android 编 程 基 础

public class Ex_Ctrl_7_B extends Activity {

/** Called when the activity is first created. */

/* 声 明 ImageButton*/

private ImageButton back_Imagebutton,photo_Imagebutton;

private boolean Tag=true

true;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* 从 XML 中 获 取 控 件 对 象 */

back_Imagebutton=(ImageButton)findViewById(R.id.myImageButton_Back);

photo_Imagebutton=(ImageButton)findViewById(R.id.myImageButton_Photo);

}

}

// 设 置 默 认 的 背 景 图 片

back_Imagebutton.setBackgroundResource(R.drawable.left);

photo_Imagebutton.setBackgroundResource(R.drawable.photo);

// 给 ImageButton 设 置 事 件 监 听 器

photo_Imagebutton.setOnClickListener(new

new ImageButton.OnClickListener(){

});

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

}

Tag=!Tag;// 更 改 背 景 图 片

if(Tag){

back_Imagebutton.setBackgroundResource(R.drawable.right);

}else

else{

}

back_Imagebutton.setBackgroundResource(R.drawable.left);

5

结 果

6


-----------------------------------Android 编 程 基 础

自 定 义 下 拉 菜 单

Spinner 与 setDropDownViewResource

1

新 建 项 目 , 在 res 目 录 下 新 建 一 个 anim 文 件 夹 , 存 放 动 画 效 果 用 , 在 其 中 新 建 一 个 my_anim.xml 文









2 在 res 目 录 下 的 layout 文 件 夹 中 新 建 一 个 myspinner_dropdown.xml 文 件 , 用 来 存 放 下 拉 菜 单 弹 出 内

容 的 布 局



3 修 改 main.xml, 添 加 UI 元 素




-----------------------------------Android 编 程 基 础

android:layout_height="wrap_content"

android:text=" 你 选 择 的 是 "

android:textSize="25sp">





4

定 义 一 个 下 拉 菜 单

private Spinner mySpinner;

/* 以 findViewById() 取 得 对 象 */

mySpinner = (Spinner) findViewById(R.id.spinner_City);

5 定 义 一 个 字 符 串 数 组 和 一 个 ArrayAdepter

private static final String[] countriesStr =

{ " 北 京 市 ", " 上 海 市 ", " 天 津 市 ", " 重 庆 市 " };

private ArrayAdapter adapter;

adapter=new

ArrayAdapter(this

this,

android.R.layout.simple_spinner_item, countriesStr);

6

给 下 拉 菜 单 内 容 设 置 样 式

/* myspinner_dropdown 为 自 定 义 下 拉 菜 单 样 式 定 义 在 res/layout 目 录 下 */

adapter.setDropDownViewResource(R.layout.myspinner_dropdown);

7

给 下 拉 菜 单 设 置 内 容 适 配 器

/* 将 ArrayAdapter 添 加 Spinner 对 象 中 */

mySpinner.setAdapter(adapter);

8

给 下 拉 菜 单 添 加 动 画

/* 取 得 Animation 定 义 在 res/anim 目 录 下 */

myAnimation = AnimationUtils.loadAnimation(this

this, R.anim.my_anim);

/* 将 mySpinner 运 行 Animation */

mySpinner.startAnimation(myAnimation);

9 mainActivity.java 完 整 代 码

package zyf.Ex_Ctrl_8;

import android.app.Activity;

import android.os.Bundle;

8


-----------------------------------Android 编 程 基 础

import android.view.MotionEvent;

import android.view.View;

import android.view.animation.Animation;

import android.view.animation.AnimationUtils;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.Spinner;

import android.widget.TextView;

public class Ex_Ctrl_8 extends Activity {

/** Called when the activity is first created. */

private static final String[] countriesStr =

{ " 北 京 市 ", " 上 海 市 ", " 天 津 市 ", " 重 庆 市 " };

private TextView myTextView;

private Spinner mySpinner;

private ArrayAdapter adapter;

Animation myAnimation;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 载 入 main.xml Layout */

setContentView(R.layout.main);

/* 以 findViewById() 取 得 对 象 */

myTextView = (TextView) findViewById(R.id.TextView_Show);

mySpinner = (Spinner) findViewById(R.id.spinner_City);

/* 取 得 Animation 定 义 在 res/anim 目 录 下 */

myAnimation = AnimationUtils.loadAnimation(this

this, R.anim.my_anim);

adapter=new

android.R.layout.simple_spinner_item, countriesStr);

ArrayAdapter(this

this,

/* myspinner_dropdown 为 自 定 义 下 拉 菜 单 样 式 定 义 在 res/layout 目 录 下 */

adapter.setDropDownViewResource(R.layout.myspinner_dropdown);

/* 将 ArrayAdapter 添 加 Spinner 对 象 中 */

mySpinner.setAdapter(adapter);

/* 下 拉 菜 单 弹 出 的 内 容 选 项 被 选 中 事 件 处 理 */

mySpinner.setOnItemSelectedListener(new

new

Spinner.OnItemSelectedListener(){

public void onItemSelected(AdapterView arg0, View arg1,

int arg2, long arg3) {

// TODO Auto-generated method stub

/* 将 所 选 mySpinner 的 值 带 入 myTextView 中 */

myTextView.setText(" 您 选 择 的 是 :"+ countriesStr[arg2]);

/* 将 mySpinner 显 示 */

9


-----------------------------------Android 编 程 基 础

}

arg0.setVisibility(View.VISIBLE);

public void onNothingSelected(AdapterView arg0) {

// TODO Auto-generated method stub

myTextView.setText("NONE");

}

});

/* 下 拉 菜 单 弹 出 的 内 容 选 项 触 屏 事 件 处 理 */

mySpinner.setOnTouchListener(new

new Spinner.OnTouchListener(){

});

public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub

}

/* 将 mySpinner 运 行 Animation */

v.startAnimation(myAnimation);

/* 将 mySpinner 隐 藏 */

v.setVisibility(View.INVISIBLE);

return false;

/* 下 拉 菜 单 弹 出 的 内 容 选 项 焦 点 改 变 事 件 处 理 */

mySpinner.setOnFocusChangeListener(new

new Spinner.OnFocusChangeListener(){

}

}

public void onFocusChange(View v, boolean hasFocus) {

// TODO Auto-generated method stub

}

});

10

结 果

10


-----------------------------------Android 编 程 基 础

动 态 添 加 ╱ 删 除 的 Spinner 菜 单

ArrayList 与 Widget 的 依 赖 性

1

创 建 新 工 程

2 修 改 mian.xml 布 局 , 添 加 UI 元 素










-----------------------------------Android 编 程 基 础

android:text=" 删 除 "

>





3

定 义 创 建 一 个 List

/* 定 义 */

private String[] cities;

private List cityList;

/* 初 始 化 字 符 串 数 组 */

cities = new String[] { "Android", "BlackBerry", "J2ME", "Symbian",

"Broncho", "LinuxMobile", "Palm", "WindwosMobile" };

/* 初 始 化 List 实 例 ArrayList 的 对 象 */

cityList = new ArrayList();

/* 遍 历 , 把 字 符 串 数 组 添 加 到 ArrayList 中 */

for (int

i = 0; i < cities.length; i++) {

cityList.add(cities[i]);

}

4

定 义 创 建 一 个 ArrayAdapter

/* 定 义 */

private ArrayAdapter arrayAdapter;

/* 这 里 应 该 使 用 List , 如 果 使 用 String[] 则 会 出 错 */

/* 初 始 化 下 拉 菜 单 的 内 容 适 配 器 */

arrayAdapter = new ArrayAdapter(this

this,

android.R.layout.simple_spinner_item, cityList);

5

设 置 ArrayAdapter 在 下 拉 菜 单 中 的 显 示 布 局

/* 设 置 下 拉 菜 单 显 示 内 容 的 风 格 */

arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_

item);

6

给 下 拉 菜 单 添 加 内 容 Adapter 适 配 器

/* 给 下 拉 菜 单 对 象 添 加 内 容 适 配 器 */

city_Spinner.setAdapter(arrayAdapter);

12


-----------------------------------Android 编 程 基 础

7 修 改 该 mainActivity.java, 实 现 动 态 添 加 和 删 除

package zyf.Ex_Ctrl_9ME;

/* 使 用 的 包 导 入 */

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Spinner;

import android.widget.TextView;

import android.widget.Toast;

public class Ex_Ctrl_9ME extends Activity implements Button.OnClickListener,

Spinner.OnItemSelectedListener {

/** Called when the activity is first created. */

/* 声 明 程 序 使 用 的 对 象 */

private TextView show_yourChoice_TextView;

private EditText input_City_EditText;

private Button Add_Button, Del_Button;

private Spinner city_Spinner;

private ArrayAdapter arrayAdapter;

private String[] cities;

private String addString;

private List cityList;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 设 置 主 屏 显 示 布 局 为 main.xml*/

setContentView(R.layout.main);

/*findViewByID() 获 取 XML 中 的 UI 元 素 */

show_yourChoice_TextView =

(TextView) findViewById(R.id.TextView_Show_yourChoice);

input_City_EditText = (EditText) findViewById(R.id.EditView_Input);

Add_Button = (Button) findViewById(R.id.Button_ADD);

Del_Button = (Button) findViewById(R.id.Button_DEL);

city_Spinner = (Spinner) findViewById(R.id.Spinner_Slecte);

/* 初 始 化 字 符 串 数 组 */

cities = new String[] { "Android", "BlackBerry", "J2ME",

13


-----------------------------------Android 编 程 基 础

/* 初 始 化 List 实 例 ArrayList 的 对 象 */

cityList = new ArrayList();

"Symbian","Broncho", "LinuxMobile",

"Palm", "WindwosMobile" };

/* 遍 历 , 把 字 符 串 数 组 添 加 到 ArrayList 中 */

for (int

i = 0; i < cities.length; i++) {

}

cityList.add(cities[i]);

/* 这 里 应 该 使 用 List , 如 果 使 用 String[] 则 会 出 错 */

/* 初 始 化 下 拉 菜 单 的 内 容 适 配 器 */

arrayAdapter = new ArrayAdapter(this

this,

android.R.layout.simple_spinner_item, cityList);

/* 设 置 下 拉 菜 单 显 示 内 容 的 风 格 */

arrayAdapter

.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

}

/* 给 下 拉 菜 单 对 象 添 加 内 容 适 配 器 */

city_Spinner.setAdapter(arrayAdapter);

/* 默 认 启 动 时 文 本 标 题 显 示 */

show_yourChoice_TextView.setText(arrayAdapter.getItem(0));

/* 默 认 启 动 时 下 拉 菜 单 第 一 项 被 选 中 */

city_Spinner.setSelection(0);

/* 为 按 钮 添 加 点 击 事 件 监 听 器 */

Add_Button.setOnClickListener(this

this);

Del_Button.setOnClickListener(this

this);

/* 为 下 拉 菜 单 添 加 选 项 选 中 事 件 监 听 器 */

city_Spinner.setOnItemSelectedListener(this

this);

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

/* 区 别 按 钮 来 进 行 不 同 动 作 */

case R.id.Button_ADD:

/* 显 示 Toast 提 示 */

Toast.makeText(this

this, " 添 加 ", Toast.LENGTH_SHORT).show();

/* 获 得 输 入 框 中 的 将 要 添 加 的 字 符 串 */

addString = input_City_EditText.getText().toString();

/* 遍 历 , 比 较 是 否 和 下 拉 菜 单 中 内 容 重 复 */

for (int

i = 0; i < arrayAdapter.getCount(); i++) {

if (addString.equals(arrayAdapter.getItemId(i))) {

return;

}

/* 重 复 了 , 则 跳 出 */

14


-----------------------------------Android 编 程 基 础

}

/* 如 果 添 加 字 符 串 不 为 ""*/

if (!addString.equals("")) {

/* 添 加 进 适 配 器 中 */

arrayAdapter.add(addString);

/* 获 取 刚 刚 添 加 进 的 字 符 串 位 置 */

int post = arrayAdapter.getPosition(addString);

/* 设 置 刚 刚 添 加 进 的 下 拉 菜 单 内 容 被 选 中 */

city_Spinner.setSelection(post);

/* 清 空 输 入 框 */

input_City_EditText.setText("");

}

break;

case R.id.Button_DEL:

if (city_Spinner.getSelectedItem() != null) {

/* 删 除 mySpinner 的 值 */

arrayAdapter.remove(city_Spinner.getSelectedItem().toString());

}

/* 将 myEditText 清 空 */

input_City_EditText.setText("");

if (arrayAdapter.getCount() == 0) {

}

}

break;

default:

break;

}

/* 将 myTextView 清 空 */

Toast.makeText(this

this, " 删 完 了 ", Toast.LENGTH_SHORT).show();

show_yourChoice_TextView.setText("");

/* 下 拉 菜 单 选 项 被 选 中 事 件 处 理 */

@Override

public void onItemSelected(AdapterView arg0, View arg1, int arg2,

long arg3) {

// TODO Auto-generated method stub

}

show_yourChoice_TextView.setText(arrayAdapter.getItem(arg2));

/* 未 被 选 中 事 件 处 理 */

@Override

public void onNothingSelected(AdapterView arg0) {

// TODO Auto-generated method stub

15


-----------------------------------Android 编 程 基 础

}

}

/* 添 加 Menu 菜 单 进 行 退 出 操 作 */

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// TODO Auto-generated method stub

}

menu.add("Exit");

return super.onCreateOptionsMenu(menu);

/*Menu 菜 单 退 出 */

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// TODO Auto-generated method stub

}

finish();

return super.onOptionsItemSelected(item);

8

结 果

16


-----------------------------------Android 编 程 基 础

相 簿 浏 览 Gallery

Gallery 与 衍 生 BaseAdapter 容 器

1

新 建 项 目

2 定 义 layout 外 部 resource 的 xml 文 件 , 用 来 改 变 layout 的 背 景








3 修 改 main.xml 布 局 , 添 加 一 个 Gallery 和 一 个 ImageView








17


-----------------------------------Android 编 程 基 础

4 新 建 一 个 myImageAdapter 类 --Gallery 的 适 配 器 , 它 继 承 于 BaseAdapter 类 .

package zyf.Ex_Ctrl_10ME;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

public class myImageAdapter extends BaseAdapter {

@Override

public int getCount() {

// TODO Auto-generated method stub

return 0;

}

@Override

public Object getItem(int

position) {

// TODO Auto-generated method stub

return null;

}

@Override

public long getItemId(int

position) {

// TODO Auto-generated method stub

return 0;

}

@Override

public View getView(int

int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

return null;

}

}

5 修 改 mainActivity.java, 添 加 Gallery 相 关 操 作

package zyf.Ex_Ctrl_10ME;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.Gallery;

import android.widget.ImageView;

import android.widget.Toast;

public class Ex_Ctrl_10ME extends Activity {

/** Called when the activity is first created. */

/* 定 义 要 使 用 的 对 象 */

private Gallery gallery;

private ImageView imageview;

18


-----------------------------------Android 编 程 基 础

private myImageAdapter imageadapter;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

imageadapter=new

myImageAdapter(this

this);

/* 通 过 findViewById 取 得 资 源 对 象 */

gallery=(Gallery)findViewById(R.id.Gallery_preView);

imageview=(ImageView)findViewById(R.id.ImageView_photo);

/* 给 Gallery 设 置 适 配 器 把 Ex_Ctrl_10ME 类 传 入 参 数 */

gallery.setAdapter(imageadapter);

/* 设 置 Gallery 的 点 击 事 件 监 听 器 */

gallery.setOnItemClickListener(new

new Gallery.OnItemClickListener(){

@Override

public void onItemClick(AdapterView parent, View v, int position,

long id) {

// TODO Auto-generated method stub

/* 显 示 该 图 片 是 几 号 */

Toast.makeText(Ex_Ctrl_10ME.this

this,

" 这 是 图 片 :"+position+" 号 ", Toast.LENGTH_SHORT).show();

}

}

});

/* 设 置 大 图 片 */

imageview.setBackgroundResource(imageadapter.myImageIds[position]);

}

6 修 改 myImageAdapter.java 文 件 , 实 现 相 簿 浏 览 效 果

package zyf.Ex_Ctrl_10ME;

import android.content.Context;

import android.content.res.TypedArray;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.Gallery;

import android.widget.ImageView;

public class myImageAdapter extends BaseAdapter{// 自 定 义 的 类 变 量

/* 变 量 声 明 */

int mGalleryItemBackground;

private Context context;// 上 下 文

/* 构 建 一 Integer array 并 取 得 预 加 载 Drawable 的 图 片 id */

19


-----------------------------------Android 编 程 基 础

public Integer[] myImageIds = { R.drawable.photo1, R.drawable.photo2,

R.drawable.photo3, R.drawable.photo4, R.drawable.photo5,

R.drawable.photo6, };

/* 自 定 义 的 构 造 方 法 */

public myImageAdapter(Context context) {

// TODO Auto-generated constructor stub

this.context=context;

/*

* 使 用 在 res/values/attrs.xml 中 的 定 义 的 Gallery 属 性 .

*/

TypedArray

typed_array=context.obtainStyledAttributes(R.styleable.Gallery);

/* 取 得 Gallery 属 性 的 Index id */

mGalleryItemBackground=typed_array.getResourceId(R.styleable.Gallery_andro

id_galleryItemBackground, 0);

}

/* 让 对 象 的 styleable 属 性 能 够 反 复 使 用 */

typed_array.recycle();

/* 重 写 的 方 法 getCount, 返 回 图 片 数 目 */

@Override

public int getCount() {

// TODO Auto-generated method stub

return myImageIds.length;

}

/* 重 写 的 方 法 getItemId, 返 回 图 像 的 数 组 id */

@Override

public Object getItem(int

position) {

// TODO Auto-generated method stub

return position;

}

@Override

public long getItemId(int

position) {

// TODO Auto-generated method stub

return position;

}

/* 重 写 的 方 法 getView, 返 回 一 View 对 象 */

@Override

public View getView(int

int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

/* 产 生 ImageView 对 象 */

ImageView imageview = new ImageView(context);

/* 设 置 图 片 给 imageView 对 象 */

imageview.setImageResource(myImageIds[position]);

20


-----------------------------------Android 编 程 基 础

}

}

/* 重 新 设 置 图 片 的 宽 高 */

imageview.setScaleType(ImageView.ScaleType.FIT_XY);

/* 重 新 设 置 Layout 的 宽 高 */

imageview.setLayoutParams(new

Gallery.LayoutParams(128, 128));

/* 设 置 Gallery 背 景 图 */

imageview.setBackgroundResource(mGalleryItemBackground);

/* 返 回 imageView 对 象 */

return imageview;

7

结 果

21


-----------------------------------Android 编 程 基 础

文 件 搜 索 引 擎 FileSearch

SDCard 中 文 件 搜 索 与 File 类

1

创 建 新 工 程

2 在 string.xml 添 加 程 序 中 要 使 用 的 字 符 串



myFileTest

输 入 关 键 字

搜 索

系 统 SDCard 目 录 文 件 路 径 :\n

请 输 入 关 键 字 !!

没 有 找 到 相 关 文 件 !!

读 取 路 径 出 错 !!


3 修 改 main.xml 布 局 , 添 加 两 个 TextView、 一 个 EditText、 一 个 Button







22


-----------------------------------Android 编 程 基 础






4 修 改 mainActivity.java 文 件 , 添 加 搜 索 功 能

package zyf.myFileTest;

/* 导 入 程 序 使 用 的 包 */

import java.io.File;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

public class myFileTest extends Activity implements Button.OnClickListener {

/** Called when the activity is first created. */

/* 定 义 程 序 要 使 用 的 类 对 象 */

private File file;

private String path;

private String info;

private String theKey_formInput;

private TextView show_Result;

private EditText input_SearchKey_Edit;

private Button toSearch_Button;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

23


-----------------------------------Android 编 程 基 础

}

/* 设 置 主 屏 布 局 为 main.xml*/

setContentView(R.layout.main);

/* 通 过 findViewById() 获 取 XML 中 的 UI 对 象 */

show_Result = (TextView) findViewById(R.id.TextView_Result);

input_SearchKey_Edit = (EditText) findViewById(R.id.input_KEY_EditText);

toSearch_Button = (Button) findViewById(R.id.Button_Search);

/* 为 搜 索 按 钮 添 加 点 击 事 件 监 听 器 */

toSearch_Button.setOnClickListener(this

this);

/* 初 始 化 一 个 Field 对 象 , 指 定 路 径 为 /sdcard*/

file = new File("/sdcard");

/* 从 xml 中 获 取 字 符 串 */

info = getString(R.string.info);

/* 按 钮 点 击 事 件 处 理 */

public void onClick(View v) {

// TODO Auto-generated method stub

}

/* 清 空 */

path = "";

show_Result.setText("");

/* 取 得 输 入 框 中 的 要 查 询 的 Key*/

theKey_formInput = input_SearchKey_Edit.getText().toString();

/* 浏 览 文 件 */

BrowserFile(file);

/* 浏 览 文 件 方 法 */

public void BrowserFile(File file) {

if (theKey_formInput.equals("")) {

}

/* 如 果 输 入 框 没 有 输 入 点 击 搜 索 按 钮 , 提 示 输 入 */

Toast.makeText(this

this, getString(R.string.pleaseInput),

} else {

}

Toast.LENGTH_SHORT).show();

/* 开 始 搜 索 文 件 */

ToSearchFiles(file);

/* 搜 索 完 毕 后 , 如 果 搜 到 结 果 为 空 , 提 示 没 有 找 到 */

if (show_Result.getText().equals("")) {

Toast.makeText(this

this, getString(R.string.notFond),

}

Toast.LENGTH_SHORT).show();

/* 开 始 搜 索 文 件 方 法 */

public void ToSearchFiles(File file) {

/* 定 义 一 个 File 文 件 数 组 , 用 来 存 放 /sdcard 目 录 下 的 文 件 或 文 件 夹 */

File[] the_Files = file.listFiles();

24


-----------------------------------Android 编 程 基 础

}

}

/* 通 过 遍 历 所 有 文 件 和 文 件 夹 */

for (File tempF : the_Files) {

if (tempF.isDirectory()) {

}

ToSearchFiles(tempF);

/* 如 果 是 文 件 夹 的 话 继 续 遍 历 搜 索 */

} else {

try {

}

/* 是 文 件 , 进 行 比 较 , 如 果 文 件 名 称 中 包 含 输 入 搜 索 Key, 则 返 回 大 于 -1 的 值 */

if (tempF.getName().indexOf(theKey_formInput) > -1) {

/* 获 取 符 合 条 件 文 件 的 路 径 , 进 行 累 加 */

path += "\n" + tempF.getPath();

/* 显 示 结 果 的 TextView 显 示 信 息 和 搜 索 到 的 路 径 */

show_Result.setText(info + path);

}

} catch (Exception e) {

// TODO: handle exception

}

/* 如 果 路 径 找 不 到 , 提 示 出 错 */

Toast.makeText(this

this, getString(R.string.pathError),

Toast.LENGTH_SHORT).show();

5

结 果

25


-----------------------------------Android 编 程 基 础

按 钮 点 击 变 换

ImageButton 选 择 特 效

1

新 建 工 程

2 修 改 main.xml 布 局 , 添 加 一 个 TextView、 两 个 ImageButton



android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android"


android:id="@+id/showinform_TextView"

android:layout_width="259px"

android:layout_height="80px"

android:text=" 没 有 按 钮 事 件 "

android:textSize="20px"

android:layout_x="32px"

android:layout_y="33px"







26


-----------------------------------Android 编 程 基 础

3 修 改 mainActivity.java 文 件 , 实 现 选 择 效 果

package zyf.Ex_Ctrl_12ME;

/* 导 入 使 用 的 包 */

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.ImageButton;

import android.widget.TextView;

public class Ex_Ctrl_12ME extends Activity implements

ImageButton.OnClickListener {

/** Called when the activity is first created. */

/* 定 义 使 用 的 类 对 象 */

private TextView showyourClick;

private ImageButton button_A, button_B;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

/* 载 入 主 屏 布 局 main.xml */

setContentView(R.layout.main);

/* 从 XML 中 获 取 UI 元 素 对 象 */

showyourClick = (TextView) findViewById(R.id.showinform_TextView);

button_A = (ImageButton) findViewById(R.id.ImageButton_A);

button_B = (ImageButton) findViewById(R.id.ImageButton_B);

/* 给 两 个 ImageButton 添 加 点 击 事 件 监 听 器 */

button_A.setOnClickListener(this

this);

button_B.setOnClickListener(this

this);

/* button 点 击 事 件 处 理 */

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.ImageButton_A: {

}

/*button_A 按 钮 被 点 击 */

/* 显 示 信 息 */

showyourClick.setText(" 你 点 击 了 :\nbutton_A");

/* 切 换 背 景 图 片 */

button_A.setBackgroundResource(R.drawable.android);

button_B.setBackgroundResource(R.drawable.installer);

27


-----------------------------------Android 编 程 基 础

}

}

break;

case R.id.ImageButton_B: {

/*button_B 按 钮 被 点 击 */

/* 显 示 信 息 */

showyourClick.setText(" 你 点 击 了 :\nbutton_B");

/* 切 换 背 景 图 片 */

button_B.setBackgroundResource(R.drawable.android);

button_A.setBackgroundResource(R.drawable.ipod);

}

break;

default:

break;

}

4

结 果

28


-----------------------------------Android 编 程 基 础

自 动 完 成 输 入 框 自 动 提 示 功 能 的 菜 单

AutoCompleteTextView 与 数 组

1

新 建 工 程

2 修 改 main.xml 布 局 , 添 加 一 个 TextView、 一 个 AutoCompleteTextView、 一 个 Button



android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android"


android:id="@+id/TextView_InputShow"

android:layout_width="228px"

android:layout_height="47px"

android:text=" 请 输 入 "

android:textSize="25px"

android:layout_x="42px"

android:layout_y="37px"



android:id="@+id/AutoCompleteTextView_input"

android:layout_width="275px"

android:layout_height="wrap_content"

android:text=""

android:textSize="18sp"

android:layout_x="23px"

android:layout_y="98px"





29


-----------------------------------Android 编 程 基 础

3 修 改 mainActivity.java, 添 加 自 动 完 成 功 能

package zyf.Ex_Ctrl_13ME;

/* 导 入 使 用 的 包 */

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.AutoCompleteTextView;

import android.widget.Button;

import android.widget.TextView;

public class Ex_Ctrl_13ME extends Activity {

/** Called when the activity is first created. */

/* 定 义 要 使 用 的 类 对 象 */

private String[] normalString =

new String[] {

"Android", "Android Blog","Android Market", "Android SDK",

"Android AVD","BlackBerry","BlackBerry JDE", "Symbian",

"Symbian Carbide", "Java 2ME","Java FX", "Java 2EE",

"Java 2SE", "Mobile", "Motorola", "Nokia", "Sun",

"Nokia Symbian", "Nokia forum", "WindowsMobile", "Broncho",

"Windows XP", "Google", "Google Android ", "Google 浏 览 器 ",

"IBM", "MicroSoft", "Java", "C++", "C", "C#", "J#", "VB" };

@SuppressWarnings("unused")

private TextView show;

private AutoCompleteTextView autoTextView;

private Button clean;

private ArrayAdapter arrayAdapter;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 装 入 主 屏 布 局 main.xml*/

setContentView(R.layout.main);

/* 从 XML 中 获 取 UI 元 素 对 象 */

show = (TextView) findViewById(R.id.TextView_InputShow);

autoTextView =

(AutoCompleteTextView) findViewById(R.id.AutoCompleteTextView_input);

clean = (Button) findViewById(R.id.Button_clean);

/* 实 现 一 个 适 配 器 对 象 , 用 来 给 自 动 完 成 输 入 框 添 加 自 动 装 入 的 内 容 */

arrayAdapter = new ArrayAdapter(this

this,

android.R.layout.simple_dropdown_item_1line, normalString);

/* 给 自 动 完 成 输 入 框 添 加 内 容 适 配 器 */

autoTextView.setAdapter(arrayAdapter);

/* 给 清 空 按 钮 添 加 点 击 事 件 处 理 监 听 器 */

30


-----------------------------------Android 编 程 基 础

}

}

clean.setOnClickListener(new

new Button.OnClickListener() {

});

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

}

/* 清 空 */

autoTextView.setText("");

4

结 果

31


-----------------------------------Android 编 程 基 础

MultiAutoCompleteTextView 与 数 组

1

新 建 工 程

2 修 改 main.xml 布 局 , 添 加 一 个 TextView、 一 个 MultiAutoCompleteTextView、 一 个 Button







3

MultiAutoCompleteTextView 是 可 以 自 动 完 成 用 户 输 入 , 能 够 添 加 多 个 输 入 , 注 意 设 置 Tokenizer

/* 设 置 Tokenizer 来 确 定 用 户 输 入 文 本 的 相 关 范 围 */

myAutoCompleteTextView

.setTokenizer(new

new MultiAutoCompleteTextView.CommaTokenizer());

32


-----------------------------------Android 编 程 基 础

4 修 改 mainActivity.java, 实 现 动 态 自 动 完 成 用 户 输 入 相 关 内 容

package zyf.Ex_Ctrl_13_B;

/* 导 入 使 用 的 包 */

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.MultiAutoCompleteTextView;

public class Ex_Ctrl_13_B extends Activity {

/** Called when the activity is first created. */

/* 定 义 要 使 用 的 类 对 象 */

private String[] normalString =

new String[] {

"Android", "Android Blog","Android Market", "Android SDK",

"Android AVD","BlackBerry","BlackBerry JDE", "Symbian",

"Symbian Carbide", "Java 2ME","Java FX", "Java 2EE",

"Java 2SE", "Mobile", "Motorola", "Nokia", "Sun",

"Nokia Symbian", "Nokia forum", "WindowsMobile", "Broncho",

"Windows XP", "Google", "Google Android ", "Google 浏 览 器 ",

"IBM", "MicroSoft", "Java", "C++", "C", "C#", "J#", "VB" };

private Button clean;

private MultiAutoCompleteTextView myAutoCompleteTextView;

private ArrayAdapter adapter;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 装 入 主 屏 布 局 main.xml */

setContentView(R.layout.main);

/* 以 findViewById() 从 XML 中 获 取 UI 元 素 对 象 */

myAutoCompleteTextView =

(MultiAutoCompleteTextView) findViewById(R.id.MultiAutoCompleteTextView);

clean = (Button) findViewById(R.id.Button_clean);

/* new ArrayAdapter 对 象 并 将 normalString 字 符 串 数 组 传 入 */

/* 实 现 一 个 适 配 器 对 象 , 用 来 给 自 动 完 成 输 入 框 添 加 自 动 装 入 的 内 容 */

adapter = new ArrayAdapter(this

this,

android.R.layout.simple_dropdown_item_1line, normalString);

/* 将 ArrayAdapter 添 加 AutoCompleteTextView 对 象 中 */

/* 给 自 动 完 成 输 入 框 添 加 内 容 适 配 器 */

myAutoCompleteTextView.setAdapter(adapter);

/* 设 置 Tokenizer 来 确 定 用 户 输 入 文 本 的 相 关 范 围 */

myAutoCompleteTextView

33


-----------------------------------Android 编 程 基 础

}

}

.setTokenizer(new

new MultiAutoCompleteTextView.CommaTokenizer());

/* 给 清 空 按 钮 添 加 点 击 事 件 处 理 监 听 器 */

clean.setOnClickListener(new

new Button.OnClickListener() {

});

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

}

/* 清 空 */

myAutoCompleteTextView.setText("");

5

结 果

34


-----------------------------------Android 编 程 基 础

模 拟 / 数 字 / 线 程 小 时 钟 设 计

AnalogClock 与 DigitalClock 的 原 理 -- 线 程 时 钟 实 现

1

新 建 工 程

2 修 改 man.xml 布 局 , 添 加 一 个 AnalogClock、 一 个 DigitalClock、 一 个 TextView










-----------------------------------Android 编 程 基 础

android:layout_y="46px">







3

模 拟 时 钟 的 实 现 不 需 要 额 外 代 码 , 只 需 要 UI 中 添 加 , 其 自 动 显 示 时 间

/* 定 义 模 拟 时 钟 对 象 */

AnalogClock myClock;

/* 从 XML 中 获 取 模 拟 时 钟 UI 对 象 */

myClock=(AnalogClock)findViewById(R.id.Clock);

4

数 字 时 钟 的 实 现 也 不 需 要 额 外 代 码 , 只 需 要 UI 中 添 加 , 其 自 动 显 示 时 间

/* 定 义 数 字 时 钟 对 象 */

DigitalClock myDigClock;

/* 从 XML 中 获 取 数 字 时 钟 UI 对 象 */

myDigClock=(DigitalClock)findViewById(R.id.DigitalClock01);

5 而 使 用 线 程 实 现 的 TextView 时 钟 则 需 要 线 程 Thread、Handler( 发 送 、 处 理 消 息 ) 辅 助 实 现

import android.os.Handler;

import android.os.Message;

public class Clock extends Activity implements Runnable{

public Handler myHandler;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.gh);

myHandler = new Handler() {

@Override

36


-----------------------------------Android 编 程 基 础

}

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

}

};

Thread myT = new Thread(this

this);

myT.start();

}

@Override

public void run() {

// TODO Auto-generated method stub

}

6 修 改 mianActivity.java, 实 现 线 程 控 制 , 以 及 模 拟 / 数 字 时 钟 的 实 现

package zyf.three.clock;

/* 导 入 要 使 用 的 包 */

import java.util.Calendar;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.widget.AnalogClock;

import android.widget.DigitalClock;

import android.widget.TextView;

public class Clock extends Activity implements Runnable {

/* 定 义 要 使 用 的 类 对 象 */

private TextView showTime;// 显 示 进 程 时 钟 的 TextView

AnalogClock myClock;// 模 拟 时 钟

DigitalClock myDigClock;// 数 字 时 钟

private final int msg_Key = 0x1234;// 发 送 的 消 息 内 容

public Handler myHandler;// 发 送 、 处 理 消 息 的 类

public Calendar myCalendar;// 日 历 类

private int my_Hour, my_Minute, my_Second;// 时 、 分 、 秒

private Thread myT;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

/* 导 入 主 屏 布 局 main.xml */

setContentView(R.layout.gh);

/* 从 XML 中 获 取 模 拟 时 钟 UI 对 象 */

37


-----------------------------------Android 编 程 基 础

myClock = (AnalogClock) findViewById(R.id.Clock);

/* 从 XML 中 获 取 数 字 时 钟 UI 对 象 */

myDigClock = (DigitalClock) findViewById(R.id.DigitalClock01);

/* 从 XML 中 获 取 TextView UI 对 象 */

showTime = (TextView) findViewById(R.id.TextView_showTime);

/* 通 过 Handler 来 接 收 进 程 所 传 递 的 信 息 并 更 新 TextView */

myHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

/* 这 里 是 处 理 信 息 的 方 法 */

// TODO Auto-generated method stub

super.handleMessage(msg);

switch (msg.what) {

case msg_Key:

/* 在 这 处 理 要 TextView 对 象 Show 时 间 的 事 件 */

showTime.setText(my_Hour + " : " + my_Minute + " : "

+ my_Second);

break;

}

default:

break;

}

}

};

/* 通 过 进 程 来 持 续 取 得 系 统 时 间 */

myT = new Thread(this

this);

myT.start();

/* 实 现 一 个 Runable 接 口 , 实 例 化 一 个 进 程 对 象 , 用 来 持 续 取 得 系 统 时 间 */

@Override

public void run() {

// TODO Auto-generated method stub

try {

do {

/* 取 得 系 统 时 间 */

long Time = System.currentTimeMillis();

myCalendar = Calendar.getInstance();

myCalendar.setTimeInMillis(Time);

my_Hour = myCalendar.get(Calendar.HOUR);

my_Minute = myCalendar.get(Calendar.MINUTE);

my_Second = myCalendar.get(Calendar.SECOND);

/* 让 进 程 休 息 一 秒 */

Thread.sleep(1000);

38


-----------------------------------Android 编 程 基 础

}

}

/* 重 要 关 键 程 序 : 取 得 时 间 后 发 出 信 息 给 Handler */

Message msg = new Message();

msg.what = msg_Key;

myHandler.sendMessage(msg);

/* 重 要 关 键 程 序 : 取 得 时 间 后 发 出 信 息 给 Handler */

} while (myT.interrupted() == false);

/* 当 系 统 发 出 中 断 信 息 时 停 止 本 循 环 */

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

7

结 果

39


-----------------------------------Android 编 程 基 础

动 态 输 入 日 期 与 时 间

DatePicker 与 TimePicker 应 用

1

新 建 工 程

2 修 改 main.xml 布 局 , 添 加 一 个 DatePicker、 一 个 TimePicker、 一 个 TextView










3

DatePicker 的 初 始 化 与 日 期 改 变 事 件 的 处 理

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 日 历 设 置 器 */

DatePicker my_datePicker;

/* findViewById() 从 XML 中 获 取 UI 元 素 对 象 */

my_datePicker = (DatePicker) findViewById(R.id.my_DatePicker);

40


-----------------------------------Android 编 程 基 础

/* 为 日 历 设 置 器 添 加 点 击 事 件 监 听 器 , 处 理 设 置 日 期 事 件 */

my_datePicker.init(my_Year, my_Month, my_Day,

new DatePicker.OnDateChangedListener(){

});

@Override

public void onDateChanged(DatePicker view, int year,

int monthOfYear, int dayOfMonth) {

// TODO Auto-generated method stub

}

/* 日 期 改 变 事 件 处 理 */

4

TimePicker 的 初 始 化 与 时 间 改 变 事 件 的 处 理

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 时 间 设 置 器 */

TimePicker my_timePicker;

/* findViewById() 从 XML 中 获 取 UI 元 素 对 象 */

my_timePicker = (TimePicker) findViewById(R.id.my_TimePicker);

/* 把 时 间 设 置 成 24 小 时 制 */

my_timePicker.setIs24HourView(true

true);

/* 为 时 间 设 置 器 添 加 点 击 事 件 监 听 器 , 处 理 设 置 时 间 事 件 */

my_timePicker.setOnTimeChangedListener(new

new

});

TimePicker.OnTimeChangedListener(){

@Override

public void onTimeChanged(TimePicker view, int hourOfDay,

int minute) {

// TODO Auto-generated method stub

}

/* 时 间 改 变 事 件 处 理 */

5 修 改 mainActivity.java, 添 加 动 态 修 改 时 间 并 显 示 效 果

package zyf.Ex_Ctrl_15ME;

/* 导 入 要 使 用 的 包 */

import java.util.Calendar;

import java.util.Locale;

import android.app.Activity;

import android.os.Bundle;

import android.widget.DatePicker;

import android.widget.TextView;

import android.widget.TimePicker;

public class Ex_Ctrl_15ME extends Activity {

/** Called when the activity is first created. */

/* 定 义 时 间 变 量 : 年 、 月 、 日 、 小 时 、 分 钟 */

int my_Year;

int my_Month;

41


-----------------------------------Android 编 程 基 础

int my_Day;

int my_Hour;

int my_Minute;

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 日 历 设 置 器 、 时 间 设 置 器 、 显 示 时 间 的 TextView */

DatePicker my_datePicker;

TimePicker my_timePicker;

TextView showDate_Time;

/* 定 义 日 历 对 象 , 初 始 化 时 , 用 来 获 取 当 前 时 间 */

Calendar my_Calendar;

@Override

public void onCreate(Bundle savedInstanceState) {

/* 从 Calendar 抽 象 基 类 获 得 实 例 对 象 , 并 设 置 成 中 国 时 区 */

my_Calendar = Calendar.getInstance(Locale.CHINA);

/* 从 日 历 对 象 中 获 取 当 前 的 : 年 、 月 、 日 、 时 、 分 */

my_Year = my_Calendar.get(Calendar.YEAR);

my_Month = my_Calendar.get(Calendar.MONTH);

my_Day = my_Calendar.get(Calendar.DAY_OF_MONTH);

my_Hour = my_Calendar.get(Calendar.HOUR_OF_DAY);

my_Minute = my_Calendar.get(Calendar.MINUTE);

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* findViewById() 从 XML 中 获 取 UI 元 素 对 象 */

my_datePicker = (DatePicker) findViewById(R.id.my_DatePicker);

my_timePicker = (TimePicker) findViewById(R.id.my_TimePicker);

showDate_Time = (TextView) findViewById(R.id.my_TextView);

/* 把 时 间 设 置 成 24 小 时 制 */

my_timePicker.setIs24HourView(true

true);

/* 显 示 时 间 */

loadDate_Time();

/* 为 日 历 设 置 器 添 加 点 击 事 件 监 听 器 , 处 理 设 置 日 期 事 件 */

my_datePicker.init(my_Year, my_Month, my_Day,

new DatePicker.OnDateChangedListener(){

});

@Override

public void onDateChanged(DatePicker view, int year,

int monthOfYear, int dayOfMonth) {

// TODO Auto-generated method stub

}

/* 把 设 置 改 动 后 的 日 期 赋 值 给 我 的 日 期 对 象 */

my_Year=year;

my_Month=monthOfYear;

my_Day=dayOfMonth;

/* 动 态 显 示 修 改 后 的 日 期 */

loadDate_Time();

42


-----------------------------------Android 编 程 基 础

}

}

/* 为 时 间 设 置 器 添 加 点 击 事 件 监 听 器 , 处 理 设 置 时 间 事 件 */

my_timePicker.setOnTimeChangedListener(new

new

});

TimePicker.OnTimeChangedListener(){

@Override

public void onTimeChanged(TimePicker view, int hourOfDay,

int minute) {

}

/* 把 设 置 改 动 后 的 时 间 赋 值 给 我 的 时 间 对 象 */

my_Hour=hourOfDay;

my_Minute=minute;

/* 动 态 显 示 修 改 后 的 时 间 */

loadDate_Time();

/* 设 置 显 示 日 期 时 间 的 方 法 */

private void loadDate_Time() {

showDate_Time.setText(new

StringBuffer()

}

.append(my_Year).append("/")

.append(FormatString(my_Month + 1))

.append("/").append(FormatString(my_Day))

.append("

").append(FormatString(my_Hour))

.append(" : ").append(FormatString(my_Minute)));

/* 日 期 时 间 显 示 两 位 数 的 方 法 */

private String FormatString(int

int x) {

}

String s = Integer.toString(x);

if (s.length() == 1) {

s = "0" + s;

}

return s;

6

结 果

43


-----------------------------------Android 编 程 基 础

DatePickerDialog 与 TimePickerDialog 应 用

1

新 建 工 程

2 修 改 main.xml 布 局 , 添 加 两 个 按 钮 、 一 个 TextView







3

DatePickerDialog 的 定 义 与 初 始 化 以 及 显 示

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 日 历 设 置 器 对 话 框 */

DatePickerDialog my_datePickerDialog;

/* 构 造 一 个 DatePickerDialog 对 象 , 第 一 个 参 数 为 Context、

* 第 二 参 数 为 日 期 修 改 事 件 处 理 监 听 器 、 后 面 为 初 始 化 的 年 月 日 */

my_datePickerDialog=new

DatePickerDialog(Ex_Ctrl_15_B.this

this,

/* 显 示 出 日 期 设 置 对 话 框 */

my_datePickerDialog.show();

myDateSetListener, my_Year, my_Month, my_Day);

44


-----------------------------------Android 编 程 基 础

4 DatePickerDialog 的 日 期 修 改 事 件 处 理

/* 日 期 改 变 设 置 事 件 监 听 器 */

private OnDateSetListener myDateSetListener=new

new OnDateSetListener(){

@Override

public void onDateSet(DatePicker view, int year, int monthOfYear,

int dayOfMonth) {

// TODO Auto-generated method stub

/* 日 期 改 变 设 置 事 件 处 理 */

}

};

5

TimePickerDialog 的 定 义 与 初 始 化 以 及 显 示

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 时 间 设 置 器 对 话 框 */

TimePickerDialog my_timePickerDialog;

/* 构 造 一 个 TimePickerDialog 对 象 , 第 一 个 参 数 为 Context、

* 第 二 个 参 数 为 时 间 修 改 事 件 监 听 器 、 后 面 两 个 为 初 始 化 时 间 ,

* 最 后 一 个 boolean 类 型 设 置 是 否 为 24 小 时 制 */

my_timePickerDialog=new

TimePickerDialog(Ex_Ctrl_15_B.this

this,

myTimeSetListener, my_Hour, my_Minute, false);

/* 显 示 出 日 期 设 置 对 话 框 */

my_timePickerDialog.show();

6 TimePickerDialog 的 时 间 修 改 事 件 处 理

/* 时 间 改 变 设 置 事 件 监 听 器 */

private OnTimeSetListener myTimeSetListener=new

new OnTimeSetListener(){

@Override

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

// TODO Auto-generated method stub

/* 时 间 改 变 设 置 事 件 处 理 */

}

};

7 修 改 mainActivity.java, 实 现 动 态 显 示 修 改 的 日 期 、 时 间

package zyf.Ex_Ctrl_15_B;

/* 导 入 使 用 的 包 */

import java.util.Calendar;

import java.util.Locale;

import android.app.Activity;

import android.app.DatePickerDialog;

import android.app.TimePickerDialog;

import android.app.DatePickerDialog.OnDateSetListener;

import android.app.TimePickerDialog.OnTimeSetListener;

import android.os.Bundle;

import android.view.View;

45


-----------------------------------Android 编 程 基 础

import android.widget.Button;

import android.widget.DatePicker;

import android.widget.TextView;

import android.widget.TimePicker;

public class Ex_Ctrl_15_B extends Activity implements Button.OnClickListener{

/** Called when the activity is first created. */

/* 定 义 时 间 变 量 : 年 、 月 、 日 、 小 时 、 分 钟 */

int my_Year;

int my_Month;

int my_Day;

int my_Hour;

int my_Minute;

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 日 历 设 置 器 对 话 框 、 时 间 设 置 器 对 话 框 、

显 示 时 间 的 TextView、 按 钮 */

DatePickerDialog my_datePickerDialog;

TimePickerDialog my_timePickerDialog;

TextView showDate_Time;

Button showDatePDialog;

Button showTimePDialog;

/* 定 义 日 历 对 象 , 初 始 化 时 , 用 来 获 取 当 前 时 间 */

Calendar my_Calendar;

/* 日 期 改 变 设 置 事 件 监 听 器 */

private OnDateSetListener myDateSetListener=new

new OnDateSetListener(){

};

@Override

public void onDateSet(DatePicker view, int year,

int monthOfYear,

// TODO Auto-generated method stub

}

/* 把 设 置 修 改 后 的 日 期 赋 值 给 我 的 年 、 月 、 日 变 量 */

my_Year=year;

my_Month=monthOfYear;

my_Day=dayOfMonth;

/* 显 示 设 置 后 的 日 期 */

loadDate_Time();

int dayOfMonth) {

/* 时 间 改 变 设 置 事 件 监 听 器 */

private OnTimeSetListener myTimeSetListener=new

new OnTimeSetListener(){

@Override

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

// TODO Auto-generated method stub

/* 把 设 置 修 改 后 的 时 间 赋 值 给 我 的 时 、 分 变 量 */

my_Hour=hourOfDay;

my_Minute=minute;

46


-----------------------------------Android 编 程 基 础

};

}

/* 显 示 设 置 后 的 时 间 */

loadDate_Time();

@Override

public void onCreate(Bundle savedInstanceState) {

}

/* 从 Calendar 抽 象 基 类 获 得 实 例 对 象 , 并 设 置 成 中 国 时 区 */

my_Calendar = Calendar.getInstance(Locale.CHINA);

/* 从 日 历 对 象 中 获 取 当 前 的 : 年 、 月 、 日 、 时 、 分 */

my_Year = my_Calendar.get(Calendar.YEAR);

my_Month = my_Calendar.get(Calendar.MONTH);

my_Day = my_Calendar.get(Calendar.DAY_OF_MONTH);

my_Hour = my_Calendar.get(Calendar.HOUR_OF_DAY);

my_Minute = my_Calendar.get(Calendar.MINUTE);

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* findViewById() 从 XML 中 获 取 UI 元 素 对 象 */

showDate_Time = (TextView) findViewById(R.id.my_TextView);

showDatePDialog=(Button)findViewById(R.id.show_DatePicker);

showTimePDialog=(Button)findViewById(R.id.show_TimePicker);

/* 显 示 当 前 时 间 */

loadDate_Time();

/* 为 按 钮 添 加 点 击 事 件 监 听 器 */

showDatePDialog.setOnClickListener(this

this);

showTimePDialog.setOnClickListener(this

this);

/* 设 置 显 示 日 期 时 间 的 方 法 */

private void loadDate_Time() {

// TODO Auto-generated method stub

showDate_Time.setText(new

StringBuffer()

}

.append(my_Year).append("/")

.append(FormatString(my_Month + 1))

.append("/").append(FormatString(my_Day))

.append("

").append(FormatString(my_Hour))

.append(" : ").append(FormatString(my_Minute)));

/* 日 期 时 间 显 示 两 位 数 的 方 法 */

private String FormatString(int

int x) {

}

String s = Integer.toString(x);

if (s.length() == 1) {

s = "0" + s;

}

return s;

47


-----------------------------------Android 编 程 基 础

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.show_DatePicker:

/* 显 示 日 期 设 置 对 话 框 的 按 钮 点 击 事 件 处 理 */{

/* 构 造 一 个 DatePickerDialog 对 象 , 第 一 个 参 数 为 Context、

第 二 参 数 为 日 期 修 改 事 件 处 理 监 听 器 、 后 面 为 初 始 化 的 年 月 日 */

my_datePickerDialog=new

DatePickerDialog(Ex_Ctrl_15_B.this

this,

/* 显 示 出 日 期 设 置 对 话 框 */

my_datePickerDialog.show();

}

break;

case R.id.show_TimePicker:

/* 显 示 时 间 设 置 对 话 框 的 按 钮 点 击 事 件 处 理 */{

myDateSetListener, my_Year, my_Month, my_Day);

/* 构 造 一 个 TimePickerDialog 对 象 , 第 一 个 参 数 为 Context、 第 二 个 参 数 为 时 间 修 改

事 件 监 听 器 、 后 面 两 个 为 初 始 化 时 间 , 最 后 一 个 boolean 类 型 设 置 是 否 为 24 小 时 制 */

my_timePickerDialog=new

TimePickerDialog(Ex_Ctrl_15_B.this

this,

myTimeSetListener, my_Hour, my_Minute, false);

}

}

}

break;

default:

break;

}

/* 显 示 出 日 期 设 置 对 话 框 */

my_timePickerDialog.show();

8

结 果

48


-----------------------------------Android 编 程 基 础

GridView 宫 格 视 图 实 践

BaseAdapter 与 GridView

1

新 建 工 程

2

在 res/drawable 目 录 下 添 加 名 称 为 a.png---p.png 的 图 片

3 修 改 main.xml 布 局 , 添 加 一 个 GridView、 一 个 ImageView









4

GridView 的 定 义 与 实 例 化

/* 定 义 类 对 象 */

private GridView my_gridview;

/* 从 xml 中 获 取 UI 资 源 对 象 */

my_gridview = (GridView) findViewById(R.id.grid);

49


-----------------------------------Android 编 程 基 础

5

GridView 的 图 像 内 容 设 置 与 ImageAdapter

/* 新 建 一 个 自 定 义 的 ImageAdapter*/

myImageViewAdapter = new ImageAdapter(this

this);

/* 为 GridView 对 象 设 置 一 个 ImageAdapter*/

my_gridview.setAdapter(myImageViewAdapter);

6 内 部 类 ImageAdapter, 实 现 了 BaseAdapter

private class myImageAdapter extends BaseAdapter{

@Override

public int getCount() {

// TODO Auto-generated method stub

return 0;

}

@Override

public Object getItem(int

position) {

// TODO Auto-generated method stub

return null;

}

@Override

public long getItemId(int

position) {

// TODO Auto-generated method stub

return 0;

}

@Override

public View getView(int

int position,

View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

return null;

}

}

7 GridView 的 图 片 Items 点 击 事 件 处 理

/* 为 GridView 添 加 图 片 Items 点 击 事 件 监 听 器 */

my_gridview.setOnItemClickListener(this

this);

@Override

public void onItemClick(AdapterView arg0,

View arg1, int arg2, long arg3) {

// TODO Auto-generated method stub

/* 点 击 GridView 中 图 片 Items 事 件 处 理 */

}

50


-----------------------------------Android 编 程 基 础

8

GridView 移 动 后 选 中 图 片 Items 的 事 件 处 理

/* 为 GridView 添 加 图 片 Items 移 动 选 中 事 件 监 听 器 */

my_gridview.setOnItemSelectedListener(this

this);

@Override

public void onItemSelected(AdapterView arg0,

View arg1, int arg2,long

arg3) {

// TODO Auto-generated method stub

}

/*GridView 中 的 图 片 移 动 焦 点 选 中 时 事 件 处 理 */

/* 未 选 中 GridView 中 的 图 片 Items 事 件 处 理 */

@Override

public void onNothingSelected(AdapterView arg0) {

// TODO Auto-generated method stub

}

9 修 改 mainActivity.java 来 实 现 图 片 点 击 和 图 片 移 动 选 中 的 效 果

package zyf.GridViewTest;

/* 导 入 要 使 用 的 包 */

import android.app.Activity;

import android.app.AlertDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.BaseAdapter;

import android.widget.GridView;

import android.widget.ImageView;

public class GridViewTest extends Activity implements

GridView.OnItemClickListener,

GridView.OnItemSelectedListener {

/** Called when the activity is first created. */

/* 定 义 类 对 象 */

private GridView my_gridview;

private ImageView big_imageView;

private ImageAdapter myImageViewAdapter;

/* 内 部 类 , 实 现 一 个 图 片 适 配 器 */

public class ImageAdapter extends BaseAdapter {

/*myContext 为 上 下 文 */

private Context myContext;

/*GridView 用 来 加 载 图 片 的 ImageView*/

private ImageView the_imageView;

51


-----------------------------------Android 编 程 基 础

// 这 是 图 片 资 源 ID 的 数 组

private Integer[] mImageIds = {

R.drawable.a, R.drawable.b,R.drawable.c, R.drawable.d,

R.drawable.e, R.drawable.f,R.drawable.g, R.drawable.h,

R.drawable.i, R.drawable.j,R.drawable.k, R.drawable.l,

R.drawable.m, R.drawable.n,R.drawable.o, R.drawable.p

};

/* 构 造 方 法 */

public ImageAdapter(Context myContext) {

// TODO Auto-generated constructor stub

this.myContext = myContext;

}

/* 传 入 一 个 Context, 本 例 中 传 入 的 是 GridViewTest */

/* 返 回 资 源 ID 数 组 长 度 */

@Override

public int getCount() {

// TODO Auto-generated method stub

return mImageIds.length;

}

/* 得 到 Item*/

@Override

public Object getItem(int

position) {

// TODO Auto-generated method stub

return position;

}

/* 获 取 Items 的 ID*/

@Override

public long getItemId(int

position) {

// TODO Auto-generated method stub

return position;

}

/* 获 取 要 显 示 的 View 对 象 */

@Override

public View getView(int

int position,

View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

/* 创 建 一 个 ImageView*/

the_imageView = new ImageView(myContext);

// 设 置 图 像 源 于 资 源 ID。

the_imageView.setImageResource(mImageIds[position]);

/* 使 ImageView 与 边 界 适 应 */

the_imageView.setAdjustViewBounds(true

true);

52


-----------------------------------Android 编 程 基 础

}

}

/* 设 置 背 景 图 片 的 风 格 */

the_imageView.setBackgroundResource(

/* 返 回 带 有 多 个 图 片 ID 的 ImageView*/

return the_imageView;

android.R.drawable.picture_frame);

/* 自 定 义 获 取 对 应 位 置 的 图 片 ID*/

public Integer getcheckedImageIDPostion(int

int theindex) {

return mImageIds[theindex];

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

/* 设 置 主 屏 布 局 */

setContentView(R.layout.main);

/* 从 xml 中 获 取 UI 资 源 对 象 */

my_gridview = (GridView) findViewById(R.id.grid);

big_imageView =

(ImageView) findViewById(R.id.ImageView_Big);

/* 新 建 一 个 自 定 义 的 ImageAdapter*/

myImageViewAdapter = new ImageAdapter(this

this);

/* 为 GridView 对 象 设 置 一 个 ImageAdapter*/

my_gridview.setAdapter(myImageViewAdapter);

/* 为 GridView 添 加 图 片 Items 点 击 事 件 监 听 器 */

my_gridview.setOnItemClickListener(this

this);

/* 为 GridView 添 加 图 片 Items 移 动 选 中 事 件 监 听 器 */

my_gridview.setOnItemSelectedListener(this

this);

@Override

public void onItemClick(AdapterView arg0,

View arg1, int arg2, long arg3) {

/* 点 击 GridView 中 图 片 Items 后 显 示 一 个 AlterDialog 提 示 框 */

new AlertDialog.Builder(this

this)

.setTitle(" 图 片 浏 览 ")

/* 获 得 对 应 的 图 片 并 显 示 */

.setIcon(myImageViewAdapter.getcheckedImageIDPostion(arg2))

/* 添 加 一 个 按 钮 */

.setPositiveButton(" 返 回 ", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

}

/* 显 示 提 示 框 */

53


-----------------------------------Android 编 程 基 础

}

}

}).show();

@Override

public void onItemSelected(AdapterView arg0,

View arg1, int arg2,long

arg3) {

// TODO Auto-generated method stub

}

/*GridView 中 的 图 片 移 动 焦 点 选 中 时 ,

* 下 面 的 大 图 ImageView 显 示 相 应 的 大 图 片 */

big_imageView.setImageResource(myImageViewAdapter

.getcheckedImageIDPostion(arg2));

/* 未 选 中 GridView 中 的 图 片 Items 事 件 处 理 */

@Override

public void onNothingSelected(AdapterView arg0) {

// TODO Auto-generated method stub

}

10

结 果

54


-----------------------------------Android 编 程 基 础

封 面

55


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

GUI 可 视 化 设 计 器 ——DroidDraw

DroidDraw 是 一 个 基 于 Java Swing 的 Android 界 面 设 计 器 , 可 以 通 过 它 来 生 成 复 杂 的 Android Layout XML 文

件 ,Android 的 Layout 和 Swing Layout 中 有 很 好 的 对 应 , 设 计 器 的 代 码 编 写 起 来 比 较 容 易 。

2


-----------------------------------Android 编 程 基 础

AnDroidDraw

AnDroidDraw 是 一 个 与 DroidDraw 集 成 的 Android 应 用 程 序 , 它 允 许 你 从 DroidDraw 应 用 程 序 下 载 你 的 GUIs,

也 允 许 你 在 一 个 Android 设 备 上 预 览 你 的 GUIs. 下 载 DroidDraw

步 骤 零




下 载 AnDroidDraw.apk

使 用 :adb install AnDroidDraw.apk 把 它 安 装 到 你 的 Android 设 备 上

安 装 一 个 端 口 转 发 规 则 :adb forward tcp:6100 tcp:7100

步 骤 一

在 你 的 Android 设 备 上 运 行 AnDroidDraw, 你 应 该 看 到 像 这 样 的 :

步 骤 二

在 你 的 电 脑 上 运 行 DroidDraw, 并 且 创 建 一 个 GUI,( 获 取 更 多 关 于 创 建 GUI 的 信 息 , 请 看 教 程 1、 教 程 2、

教 程 3。) 接 下 来 从 DroidDraw 菜 单 中 选 择 "Project"->"Send GUI to Deviec"

3


-----------------------------------Android 编 程 基 础

步 骤 三

现 在 你 应 该 在 Android 屏 幕 上 看 到 你 新 创 建 的 GUI 的 像 这 样 的 xml:

步 骤 四

点 击 "Preview GUI" 按 钮 来 预 览 你 的 GUI。

步 骤 五

当 你 结 束 时 , 点 击 向 后 的 箭 头 , 来 返 回 到 AnDroidDraw 的 主 屏 幕 。

记 住 , 如 果 你 感 兴 趣 , 你 可 以 在 文 本 框 中 编 辑 该 XML 文 件 , 并 且 再 次 点 击 "Preview GUI" 来 查 看 你 的 修 改 。

然 而 , 这 些 修 改 将 不 会 返 回 到 DroidDraw。

步 骤 六

大 功 告 成 !??/Comments/Bugs brendan.d.burns 在 gmail 上 。

4


-----------------------------------Android 编 程 基 础

DroidDraw 教 程 一 :Currency

Converter

步 骤 零

本 教 程 将 给 你 一 个 简 短 的 介 绍 开 关 于 使 用 DroidDraw 用 户 界 面 设 计 器 来 开 发 一 个 在 Android 上 的 GUI 应 用 程

序 。 本 教 程 假 设 你 已 经 下 载 并 安 装 了 Android SDK。 本 教 程 也 假 设 你 对 GUI 编 程 概 念 和 Java 编 程 语 言 相 当 熟

悉 。

步 骤 一

登 陆 到 DroidDraw UI Designer

步 骤 二

设 置 根 布 局 为 RelativeLayout( 相 对 布 局 )

步 骤 三

选 择 "Layout" 标 签

5


-----------------------------------Android 编 程 基 础

步 骤 四

从 Layouts 面 板 中 把 一 个 LinearLayout 对 象 拖 放 到 屏 幕 顶 部 中 心 位 置

步 骤 五

选 择 该 LinearLayout 对 象 并 点 击 属 性 "Properties" 标 签 来 开 始 编 辑 layout 属 性 值 。 把 宽 度 "width" 改 成 "200px",

高 度 "height" 改 成 "130px"

点 击 "Apply" 来 应 用 改 变 。

步 骤 六

转 到 "Widgets" 标 签

6


-----------------------------------Android 编 程 基 础

步 骤 七

把 两 个 TextView 对 象 和 两 个 EditText 对 象 交 替 地 拖 放 到 LinearLayout 中

步 骤 八

把 一 个 RadioGroup 对 象 拖 放 进 LinearLayout 中 。 把 两 个 RadioButton 对 象 拖 放 到 RadioGroup 中 。

7


-----------------------------------Android 编 程 基 础

步 骤 九

把 一 个 Button 对 象 拖 放 到 根 RelativeLayout 中 , 它 在 LinearLayout 对 象 下 面 。 它 应 该 和 LinearLayout 的 右 边

对 齐 。

步 骤 十

编 辑 每 个 TextView 对 象 的 属 性 值 。 上 面 一 个 的 文 本 设 置 成 "Dollars", 并 设 置 成 "bold" 字 体 样 式 。 下 面 一 个

TextView 的 文 本 设 置 成 "Euros", 并 也 设 置 成 "bold" 字 体 样 式 。

步 骤 十 一

如 以 下 内 容 编 辑 上 面 一 个 EditText 的 属 性 值 :




id 修 改 成 :"@+id/dollars"

文 本 内 容 设 置 为 空

宽 度 修 改 成 "100px"

步 骤 十 一 半

在 "Euros"TextView 下 面 的 第 二 个 EditText 上 重 复 步 骤 十 一 , 但 是 把 id 设 置 为 "@+id/euros"

步 骤 十 二

编 辑 第 一 个 RadioButton 属 性 : 文 本 设 置 为 "Dollars to Euros", 并 把 它 id 设 置 成 "@+id/dtoe"

编 辑 第 二 个 RadioButton 属 性 : 文 本 设 置 为 "Euros to Dollars ", 并 把 它 id 设 置 成 "@+id/etod"

8


-----------------------------------Android 编 程 基 础

重 要 注 意 事 项

你 必 须 正 确 地 获 取 id, 因 为 这 是 你 在 代 码 中 如 何 获 取 搜 索 到 该 UI 元 素 的 方 式 。

步 骤 十 三

编 辑 Button 属 性 : 文 本 修 改 为 "Convert"、 它 的 id 设 置 成 "@+id/convert"。

最 终 的 GUI 应 该 像 这 样 :

步 骤 十 四

点 击 "Generate" 按 钮 来 生 成 XML 布 局 。 该 xml 应 像 这 样 :





-----------------------------------Android 编 程 基 础

android:text="Dollars"

android:textStyle="bold">













-----------------------------------Android 编 程 基 础

android:layout_alignRight="@+id/widget31">



步 骤 十 五

在 Eclipse 中 创 建 一 个 新 的 Android 工 程 。 从 DroidDraw 剪 切 该 XML 并 粘 贴 替 换 到 res/layout/main.xml 的 内

容 中 。

到 这 里 你 就 可 以 在 Android 中 运 行 你 的 GUI。 它 应 该 像 这 样 :

步 骤 十 六

最 后 一 步 是 实 际 的 代 码 货 币 转 换 。 它 不 多 , 你 可 以 用 一 下 代 码 来 查 找 到 你 的 GUI 元 素 :

this.findViewById(R.id.);

下 面 是 完 整 CurrentConverter Activity 的 代 码 :

package zyf.CurrentConverter;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.RadioButton;

import android.widget.TextView;

public class CurrentConverter extends Activity

implements OnClickListener {

TextView dollars;

TextView euros;

RadioButton dtoe;

11


-----------------------------------Android 编 程 基 础

}

RadioButton etod;

Button convert;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

dollars = (TextView) this.findViewById(R.id.dollars);

euros = (TextView) this.findViewById(R.id.euros);

dtoe = (RadioButton) this.findViewById(R.id.dtoe);

dtoe.setChecked(true

true);

etod = (RadioButton) this.findViewById(R.id.etod);

convert = (Button) this.findViewById(R.id.convert);

convert.setOnClickListener(this

this);

}

public void onClick(View v) {

if (dtoe.isChecked()) {

convertDollarsToEuros();

}

if (etod.isChecked()) {

convertEurosToDollars();

}

}

protected void convertDollarsToEuros() {

double val =

Double.parseDouble(dollars.getText().toString());

// in a real app, we'd get this off the 'net

euros.setText(Double.toString(val * 0.67));

}

protected void convertEurosToDollars() {

double val = Double.parseDouble(euros.getText().toString());

// in a real app, we'd get this off the 'net

dollars.setText(Double.toString(val / 0.67));

}

步 骤 十 七

嗯 , 就 是 这 样 。 我 希 望 你 喜 欢 该 教 程 。 意 见 和 问 题 邮 件 brendan.d.burns Gmail !

12


-----------------------------------Android 编 程 基 础

结 果

13


-----------------------------------Android 编 程 基 础

DroidDraw 教 程 二 : Table Layout

步 骤 零

本 教 程 描 述 如 何 创 建 一 个 从 DroidDraw 简 单 的 输 入 和 TableLayout 布 局 。 本 教 程 假 设 你 已 经 下 载 并 安 装 了

Android SDK。 本 教 程 也 假 设 你 对 GUI 编 程 概 念 和 Java 编 程 语 言 相 当 熟 悉 。

步 骤 一

启 动 DroidDraw 用 户 界 面 设 计 器

步 骤 二

根 布 局 选 择 为 RelativeLayout 布 局

步 骤 三

选 择 "Layouts" 标 签

14


-----------------------------------Android 编 程 基 础

步 骤 四

把 一 个 TableLayout 对 象 从 Layouts 面 板 中 拖 放 到 屏 幕 顶 的 中 部 。

步 骤 五

双 击 "TableLayout" 来 修 改 它 的 属 性 。 把 它 的 宽 度 "width" 改 为 "fill_parent"

步 骤 六

把 三 个 TableRow 对 象 从 Layouts 面 板 中 拖 放 到 TableLayout 对 象 中 。 当 你 拖 放 TableRow 对 象 时 , 你 应 该 从 弹

出 菜 单 中 选 择 TableLayout。

步 骤 七

每 一 个 TableRow 中 拖 放 一 个 TextView:

15


-----------------------------------Android 编 程 基 础

步 骤 八

双 击 每 一 个 TextView 来 修 改 它 的 属 性 , 修 改 显 示 文 本 如 下 图 一 样 :

步 骤 九

每 一 个 TableRow 中 拖 放 一 个 EditText, 放 在 存 在 的 文 本 右 边 。

步 骤 十

选 中 TableLayout, 修 改 "Stretchable Column"( 可 扩 展 栏 ) 属 性 值 为 1, 这 将 把 所 有 的 EditText widget 扩 展 开 来

填 充 满 该 Table 表 格 。

16


-----------------------------------Android 编 程 基 础

步 骤 十 一

编 辑 每 一 个 EditText 的 属 性 , 让 Text 文 本 属 性 为 ""

步 骤 十 二

把 一 个 Button 拖 放 到 TableLayout 下 面 的 右 下 角 空 白 处 。 它 应 该 在 TableLayout 的 外 面 并 和 它 右 对 齐 。

步 骤 十 三

修 改 该 按 钮 的 属 性 , 文 本 设 置 为 "OK"

步 骤 十 四

点 击 "Generate" 按 钮 来 生 成 .xml 文 件

步 骤 十 五

在 Eclipse 中 , 创 建 一 个 新 的 Android 工 程

17


-----------------------------------Android 编 程 基 础

步 骤 十 六

用 第 十 五 步 骤 生 成 的 XML 来 替 换 res/layouts/mian.xml 文 件 内 容 。

步 骤 十 七

运 行 你 的 新 工 程 , 你 应 该 在 Android 中 看 到 你 的 GUI。 它 应 该 像 这 样 :

完 成 !

完 整 XML 文 件






-----------------------------------Android 编 程 基 础

19

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Name">















-----------------------------------Android 编 程 基 础

android:textSize="18sp">







结 果

20


-----------------------------------Android 编 程 基 础

DroidDraw 教 程 三 : 使 用 ListView 和 array 资 源

步 骤 零

在 Eclipse 新 建 一 个 工 程

步 骤 一 - 创 建 初 始 化 布 局






开 启 DroidDraw 并 创 建 一 个 新 的 Layout

从 Widget 列 表 中 拖 放 一 个 ListView 放 入 该 Layout 中

双 击 该 ListView 编 辑 它 的 属 性

把 它 的 宽 、 高 属 性 值 改 为 "fill_parent"

点 击 "Applay" 按 钮

步 骤 二 - 创 建 一 个 Array 数 组 资 源

注 意 : 这 些 使 用 说 明 是 针 对 独 立 的 DroidDraw 可 执 行 文 件 的 。






点 击 DroidDraw 中 的 "Arrays" 标 签

点 击 "New" 按 钮 来 添 加 一 个 新 的 Array 数 组

当 提 示 名 称 时 , 使 用 "items"

对 于 数 组 值 , 使 用 "," 逗 号 来 隔 开 列 表 的 值

点 击 "Save" 按 钮 并 把 该 文 件 保 存 为 arrays.xml, 保 存 在 你 工 程 res/values 目 录 中

21


-----------------------------------Android 编 程 基 础

步 骤 三 - 让 你 的 列 表 和 数 组 连 接





在 你 第 一 步 创 建 的 ListView 上 双 击

修 改 "Entry Array Id" 属 性 为 "@+id/items"

点 击 "Apply" 按 钮

生 成 Layout 布 局 文 件 并 保 存 它 为 main.xml, 保 存 到 你 工 程 res/layouts 目 录 中

步 骤 四

- 代 码

使 用 以 下 代 码 在 你 的 mainActivity.java 文 件 中 :

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle icicle) {

}

/** Called when the activity is first created. */

super.onCreate(icicle);

this.setTitle("DroidDraw");

setContentView(R.layout.main);

22


-----------------------------------Android 编 程 基 础

步 骤 五 - 完 成

Android 模 拟 器 中 运 行 你 的 代 码

结 果

23


-----------------------------------Android 编 程 基 础

Android GUI Widget 可 视 化 指 导

作 为 一 个 Java Android 手 机 开 发 员 、UI 设 计 者 , 为 了 让 你 的 生 活 更 简 单 。 尝 试 用 DroidDraw 来 高 速 开 发 你

的 用 户 界 面 。

AnalogClock


Button




24


-----------------------------------Android 编 程 基 础

CheckBox





25


-----------------------------------Android 编 程 基 础

DatePicker


……

// Required Java init code:

DatePicker dp =

(DatePicker)this

this.findViewById(R.id.widget27);

// for example init to 1/27/2008, no callback

dp.init(2008, 0, 27, Calendar.SUNDAY, null);

...

DigitalClock


26


-----------------------------------Android 编 程 基 础

EditText




Gallery


27


-----------------------------------Android 编 程 基 础

ImageButton


ImageView


ProgressBar


Spinner


TimePicker


28


-----------------------------------Android 编 程 基 础

RadioButton









-----------------------------------Android 编 程 基 础

android:checked="false"

android:layout_weight="0"

android:layout_gravity="left"

android:textStyle="bold_italic">



TextView





30


-----------------------------------Android 编 程 基 础

封 面

31


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

文 件 存 取 编 程 基 础

文 件


文 件 可 以 用 来 存 储 比 使 用 引 用 更 大 数 量 的 数 据


Android 提 供 方 法 来 读 、 写 文 件


只 有 本 地 文 件 可 以 被 访 问


优 点 : 可 以 存 储 大 容 量 的 数 据


缺 点 : 文 件 更 新 或 是 格 式 改 变 可 能 会 导 致 巨 大 的 编 程 工 作

文 件 操 作

读 文 件

‣ Context.openFileInput(String name) 打 开 一 个 与 应 用 程 序 联 系 的 私 有 文 件 输 入 流

‣ 当 文 件 不 存 在 时 抛 出 FileNotFoundException 异 常

FileInputStream in = this.openFileInput("test2.txt");// 打 开 文 件 "test2.txt"

……

in.close();// 关 闭 输 入 流

写 文 件

‣ Context.openFileOutput(String name,int mode) 开 启 一 个 与 应 用 程 序 联 系 的 私 有 文 件 输 出 流

‣ 当 文 件 不 存 在 时 该 文 件 将 被 创 建

‣ 文 件 输 出 流 可 以 在 添 加 模 式 中 打 开 , 这 意 味 新 的 数 据 将 被 添 加 到 文 件 的 末 尾

FileOutputStream out = this.openFileOutput("test2.txt",MODE_APPEND);

// 打 开 文 件 "test2.txt" 进 行 写 操 作 、 使 用 MODE_APPEND 在 添 加 模 式 中 打 开 文 件

……

out.close();// 关 闭 输 出 流

2


-----------------------------------Android 编 程 基 础

读 取 静 态 文 件

‣ 要 打 开 打 包 在 应 用 程 序 中 的 静 态 文 件 , 使 用 Resources.openRawResource(R.raw.mydatafile)

‣ 该 文 件 必 须 放 在 文 件 夹 res/raw/ 中

InputStreamin = this.getResources().openRawResource(R.raw.my);


// 获 得 Context 资 源

in.close();// 关 闭 输 入 流

3


-----------------------------------Android 编 程 基 础

文 件 存 取 示 例

创 建 添 加 文 件 内 容 并 保 存 , 打 开 文 件 并 显 示 内 容

1

新 建 工 程 FileWriteRead

2 修 改 main.xml 布 局 , 添 加 一 个 EditText、 一 个 Button








3 在 res/layout 中 新 建 一 个 open.xml 布 局 文 件 , 添 加 一 个 TextView、 两 个 Button(" 打 开 "," 清 空 ")






-----------------------------------Android 编 程 基 础

android:layout_width="80px"

android:layout_height="wrap_content"

android:text=" 打 开 "

android:layout_x="2px"

android:layout_y="378px">





4

文 件 存 储

/* 定 义 IO 对 象 */

private String Text_of_input;

private OutputStream os;

Text_of_input = inputArt.getText().toString();

// 得 到 用 户 输 入 字 符

try {

os = this.openFileOutput("txtME", MODE_PRIVATE);

// 打 开 一 个 文 件 输 出 流 。 名 称 为 txtME, 模 式 为 不 覆 盖

os.write(Text_of_input.getBytes());

// 把 内 容 写 入 文 件

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

} catch (IOException e) {

// TODO Auto-generated catch block

} finally {

try {

}

// 关 闭 文 件 输 出 流

os.close();

} catch (IOException e) {

// TODO Auto-generated catch block

}

5 文 件 读 取

/* 定 义 IO 对 象 */

private String Text_of_output;

private InputStream is;

5


-----------------------------------Android 编 程 基 础

private byte[] b;

try {

// 打 开 一 个 文 件 输 入 流 。 名 称 为 txtME

is = this.openFileInput("txtME");

// 字 节 数 组 声 明 定 义

b = new byte[1024];

// 读 取 文 件 内 容 放 入 字 节 数 组

int length = is.read(b);

// 把 字 节 数 组 转 换 成 字 符 串

Text_of_output = new String(b);

// 显 示 读 取 内 容 长 度

setTitle(" 文 件 字 数 :" + length);

// 显 示 读 取 的 文 件 内 容

showmyText.setText(Text_of_output);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

} catch (IOException e) {

// TODO Auto-generated catch block

}finally

{

try {

}

// 关 闭 文 件 输 入 流

is.close();

} catch (IOException e) {

// TODO Auto-generated catch block

}

6 修 改 mianActivity.java 文 件 , 添 加 menu 菜 单 与 操 作

package zyf.FileWrite;

/* 导 入 要 使 用 的 包 */

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

6


-----------------------------------Android 编 程 基 础

public class FileWrite extends Activity implements Button.OnClickListener {

/** Called when the activity is first created. */

/* 要 使 用 的 对 象 、 变 量 声 明 */

/* 保 存 部 分 */

private EditText inputArt;/* 编 辑 框 , 输 入 用 户 字 符 串 */

private Button saveButton;/* 按 钮 , 保 存 */

private String Text_of_input;/* 字 符 串 , 用 户 输 入 的 字 符 串 */

private OutputStream os;/* 文 件 输 出 流 , 保 存 文 件 流 */

/* 读 取 部 分 */

private TextView showmyText;/*TextView, 显 示 读 取 文 件 内 容 */

private Button openTxt,cleanTxt;/* 按 钮 , 打 开 文 件 */

private String Text_of_output;/* 字 符 串 , 从 文 件 中 读 取 到 得 字 符 串 */

private InputStream is;/* 文 件 输 入 流 , 读 取 文 件 流 */

private byte[] b;/* 字 节 数 组 , 用 来 读 取 文 件 内 容 */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setLayoutShow(R.layout.main);/* 设 置 主 屏 布 局 */

UIinit("main");/* 初 始 化 UI 元 素 方 法 */

Logic("main");/* 添 加 事 件 逻 辑 方 法 */

}

/* 设 置 主 屏 */

private void setLayoutShow(int

layoutID) {

// TODO Auto-generated method stub

setContentView(layoutID);/* 设 置 当 前 主 屏 布 局 */

}

private void UIinit(String mainROopen) {

/* 初 始 化 UI*/

if (mainROopen.equals("main")) {

inputArt = (EditText) findViewById(R.id.EditText_Txt);

saveButton = (Button) findViewById(R.id.Button_Save);

} else if (mainROopen.equals("open")) {

showmyText = (TextView) findViewById(R.id.TextView_showTxt);

openTxt = (Button) findViewById(R.id.Button_openTxt);

cleanTxt=(Button)findViewById(R.id.Button_clean);

}

}

private void Logic(String string) {

// TODO Auto-generated method stub

/* 为 按 钮 添 加 事 件 处 理 */

if (string.equals("main")) {

saveButton.setOnClickListener(this

this);

7


-----------------------------------Android 编 程 基 础

}

} else if (string.equals("open")) {

openTxt.setOnClickListener(this

this);

cleanTxt.setOnClickListener(this

this);

}

@Override

public void onClick(View v) {

/* 根 据 ID 判 断 按 钮 事 件 */

switch (v.getId()) {

case R.id.Button_Save: {

/* 提 示 */

NoteDebug(" 文 件 保 存 ");

// TODO Auto-generated method stub

/* 获 得 用 户 输 入 的 字 符 串 */

Text_of_input = inputArt.getText().toString();

try {

/* 打 开 文 件 输 出 流 , 名 称 txtME, 以 不 覆 盖 模 式 打 开 */

os = this.openFileOutput("txtME", MODE_PRIVATE);

/* 把 字 符 串 转 换 成 字 节 数 组 , 写 入 文 件 中 */

os.write(Text_of_input.getBytes());

} catch (FileNotFoundException e) {

/* 文 件 未 找 到 , 异 常 */

// TODO Auto-generated catch block

NoteDebug(" 文 件 关 闭 失 败 " + e);

} catch (IOException e) {

/* 文 件 写 入 错 误 */

// TODO Auto-generated catch block

NoteDebug(" 文 件 写 入 失 败 " + e);

} finally {

try {

}

/* 关 闭 文 件 输 出 流 */

os.close();

} catch (IOException e) {

// TODO Auto-generated catch block

}

NoteDebug(" 文 件 关 闭 失 败 " + e);

/* 输 入 框 清 空 */

inputArt.setText("");

}

break;

case R.id.Button_openTxt: {

NoteDebug(" 文 件 打 开 ");

8


-----------------------------------Android 编 程 基 础

try {

/* 打 开 文 件 输 入 流 , 名 称 txtME*/

is = this.openFileInput("txtME");

/* 初 始 化 字 节 数 组 */

b = new byte[1024];

/* 从 文 件 输 入 流 中 读 取 内 容 到 字 节 数 组 中 , 返 回 内 容 长 度 */

int length = is.read(b);

/* 把 字 节 数 组 转 换 成 字 符 串 */

Text_of_output = new String(b);

/* 设 置 标 题 , 显 示 文 件 内 容 长 度 */

setTitle(" 文 件 字 数 :" + length);

/* 显 示 文 件 内 容 */

showmyText.setText(Text_of_output);

} catch (FileNotFoundException e) {

/* 文 件 未 找 到 , 异 常 */

// TODO Auto-generated catch block

NoteDebug(" 文 件 打 开 失 败 " + e);

} catch (IOException e) {

}

/* 文 件 读 取 错 误 , 异 常 */

// TODO Auto-generated catch block

NoteDebug(" 文 件 读 取 失 败 " + e);

}

finally {

try {

}

/* 关 闭 文 件 输 入 流 */

is.close();

} catch (IOException e) {

// TODO Auto-generated catch block

}

NoteDebug( " 文 件 关 闭 失 败 "+e);

}

break;

case R.id.Button_clean:{

/* 清 空 */

showmyText.setText("");

NoteDebug(" 清 空 ");

}

break;

default:

break;

}

9


-----------------------------------Android 编 程 基 础

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// TODO Auto-generated method stub

}

/* 添 加 三 个 菜 单 项 目 , 并 设 置 图 片 */

menu.add(0, 1, 1, "Edit").setIcon(R.drawable.ic_menu_edit);

menu.add(0, 2, 2, "Open").setIcon(R.drawable.ic_menu_agenda);

menu.add(0, 3, 3, "Exit").setIcon(R.drawable.ic_lock_power_off);

return super.onCreateOptionsMenu(menu);

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// TODO Auto-generated method stub

switch (item.getItemId()) {

case 1:

/* 显 示 main.xml 为 主 屏 布 局 */

setLayoutShow(R.layout.main);

UIinit("main");

Logic("main");

NoteDebug(" 编 辑 文 件 Layout");

break;

case 2:

/* 显 示 open.xml 为 主 屏 布 局 */

setLayoutShow(R.layout.open);

UIinit("open");

Logic("open");

NoteDebug( " 打 开 文 件 Layout");

break;

case 3:

/* 退 出 */

finish();

NoteDebug( "Byebye");

break;

default:

break;

}

return super.onOptionsItemSelected(item);

}

private void NoteDebug(String showString){

}

/* 显 示 Toast 提 示 */

Toast.makeText(this

this,showString, Toast.LENGTH_SHORT).show();

10


-----------------------------------Android 编 程 基 础

7

结 果

11


-----------------------------------Android 编 程 基 础

数 据 库 编 程 基 础

SQLite 数 据 库

• 在 某 些 情 况 下 , 文 件 不 是 有 效 的

‣ 如 果 多 线 程 数 据 访 问 是 相 关 的

‣ 如 果 应 用 程 序 处 理 可 能 变 化 的 复 杂 数 据 结 构

‣ 等 等

• 因 此 ,Android 带 来 了 内 置 SQLite 数 据 库 支 持

• 数 据 库 对 于 创 建 它 们 的 包 套 件 是 私 有 的

• 数 据 库 不 应 该 用 来 存 贮 文 件

• 提 示 : 在 SDK 中 的 samples/NotePad 下 可 以 找 到 关 于 如 何 使 用 数 据 库 的 例 子

• SQLite 是 一 个 轻 量 级 的 软 件 库

• 实 现 了 一 个 完 全 适 应 严 峻 环 境 的 数 据 库

‣ 原 子 量 性

‣ 坚 固 性

‣ 独 立 性

‣ 耐 久 性

• 体 积 大 小 只 用 几 千 字 节

• 一 些 SQL 的 指 令 只 是 部 分 支 持 , 例 如 :ALTER、TABLE

• 参 阅 http://www.sqlite.org 获 取 更 多 信 息

创 建 数 据 库

‣ Context.createDatabase(String name,int version ,int mode,CursorFactory factory) 创 建 一 个 新 的 数 据 库 并

返 回 一 个 SQLiteDatabase 对 象

‣ 假 如 数 据 库 不 能 被 创 建 , 则 抛 出 FileNotFoundException 异 常

‣ 新 创 建 SQLite 数 据 库 方 法

SQLiteDatabase mydataBase=SQLiteDatabase.create(new

CursorFactory(){

// 创 建 一 个 数 据 库

// 工 厂 类 , 一 个 可 选 工 厂 类 , 当 查 询 时 调 用 来 实 例 化 一 个 光 标

@Override

public Cursor newCursor(SQLiteDatabase db,

}

SQLiteCursorDriver masterQuery, String editTable,

SQLiteQuery query) {

// TODO Auto-generated method stub

return null;

});

12


-----------------------------------Android 编 程 基 础

SQLiteDatabase myDataBase=this

this.openOrCreateDatabase("myDataBase.db",

MODE_PRIVATE, new CursorFactory(){

// 创 建 新 的 数 据 库 , 名 称 myDatabase, 模 式 MODE_PRIVATE, 鼠 标 工 厂

// 工 厂 类 , 一 个 可 选 工 厂 类 , 当 查 询 时 调 用 来 实 例 化 一 个 光 标

@Override

public Cursor newCursor(SQLiteDatabase db,

}

SQLiteCursorDriver masterQuery, String editTable,

SQLiteQuery query) {

// TODO Auto-generated method stub

return null;

});

删 除 数 据 库

‣ Context.deleteDatabase(String name) 删 除 指 定 名 称 的 数 据 库

‣ 假 如 数 据 库 成 功 删 除 则 返 回 true, 失 败 则 为 false( 例 如 数 据 库 不 存 在 )

// 删 除 指 定 名 称 的 数 据 库

this.deleteDatabase("myDatabase.db");

打 开 数 据 库

‣ Context.openDatabase(String file,CursorFactory factory) 打 开 一 个 存 在 的 数 据 库 并 返 回 一 个

SQLiteDatabase 对 象

‣ 如 果 数 据 库 不 存 在 则 抛 出 FileNotFoundException 异 常

// 创 建 一 个 名 为 :myDataBase 的 数 据 库 , 后 缀 为 .db

SQLiteDatabase my_DataBase=this

this.openOrCreateDatabase("myDateBase.db",

MODE_PRIVATE, null);

my_DataBase.close();// 不 要 忘 记 关 闭 数 据 库

非 查 询 SQL 指 令

‣ SQLiteDatabase.execSQL(String sql) 可 以 用 来 执 行 非 查 询 SQL 指 令 , 这 些 指 令 没 有 结 果

‣ 包 括 :CREATE TABLE / DROP TABLE / INSERT 等 等

‣ 例 如 :

1

创 建 一 个 名 为 "test" 并 带 两 个 参 数 的 表

// 创 建 一 个 名 为 "test" 并 带 两 个 参 数 的 表

my_DataBase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY,

someNumber INTERGER);");

13


-----------------------------------Android 编 程 基 础

2

在 数 据 库 中 插 入 一 个 元 组

// 在 数 据 库 中 插 入 一 个 元 组

my_DataBase.execSQL("INSERT INTO test (_id,someNumber) values(1,8);");

3

删 除 表

// 删 除 表

my_DataBase.execSQL("DROP TABLE test");

查 询 SQL 指 令 - 游 标 Cursors

Android 使 用 游 标 (Cursors) 来 导 航 浏 览 查 询 结 果

‣ 游 标 (Cursors) 被 android.database.Cursor 对 象 来 描 述

‣ 一 个 游 标 (Cursors) 是 一 个 简 单 的 指 针 , 它 从 查 询 结 果 的 一 个 元 组 跳 到 下 一 个 元 组 ( 或 是 前 一 个 或 是 第

一 个 或 是 ……)

‣ 游 标 (Cursors) 在 它 定 位 位 置 的 那 一 刻 返 回 元 组 数 据

表 test

_id someNumber

1 8

2 10

3 2

// 为 了 创 建 一 个 Cursor( 游 标 ), 必 须 执 行 一 个 查 询 , 要 么 通 过 SQL 使 用 rawQuery() 方 法

// 或 是 更 精 心 设 计 的 方 法 , 像 query() 方 法

Cursor cur=my_DataBase.rawQuery("SELECT * FORM test", null);

if(cur!=null

null){// 游 标 不 为 空

// 返 回 给 定 名 称 的 列 的 基 于 0 开 始 的 index, 如 果 该 属 性 列 不 存 在 则 返 回 -1

// 通 过 它 们 的 index 来 检 索 属 性 值

int numColumn=cur.getColumnIndex("someNumber");

if(cur.moveToFirst()){

//cur.moveToFirst() 让 游 标 指 向 第 一 行 , 如 果 游 标 指 向 第 一 行 , 则 返 回 true

do {

int num=cur.getInt(numColumn);// 获 得 当 前 行 该 属 性 的 值

/*Cursor 提 供 了 不 同 的 方 法 来 回 索 不 同 的 数 据 类 型

例 如 getInt(int index)/getString(int index) 等 等 */

/* 做 一 些 事 情 */

} while (cur.moveToNext());

/* 游 标 移 动 到 下 一 行 , 如 果 游 标 已 经 通 过 了 结 果 集 中 的 最 后 ,

即 没 有 行 可 以 移 动 时 , 则 返 回 false*/

// 其 他 可 能 移 动 的 是 previous() 和 first() 方 法

}

}

14


-----------------------------------Android 编 程 基 础

封 面

15


-----------------------------------Android 编 程 基 础

封 面

1


-----------------------------------Android 编 程 基 础

应 用

为 程 序 添 加 Menu 菜 单

// 创 建 OptionsMenu publ i c bool ean onCreateOpti onsMenu(Menu

menu)

public boolean onCreateOptionsMenu(Menu menu) {

// TODO Auto-generated method stub

boolean result = super.onCreateOptionsMenu(menu);

menu.add(0, INSERT_ID_Play, 0, R.string.menu_toPlay);

menu.add(0, INSERT_ID_Stop, 0, R.string.menu_toStop);

return result;

}// 创 建 菜 单

// 处 理 选 择 事 件 publi c bool ean onOpti onsIt emSel ect ed(MenuIt em i t em)

}

public boolean onOptionsItemSelected(MenuItem item) {

// TODO Auto-generated method stub

if(item.getItemId()==INSERT_ID_Play){

Play_Music();

}

if(item.getItemId()==INSERT_ID_Stop){

Stop_Music();

}

return super.onOptionsItemSelected(item);

2


-----------------------------------Android 编 程 基 础

应 用 SDCard

1 打 开 CMD

2 进 入 C:\Documents and Settings\ 地 狱 怒 兽 \Local Settings\Application Data\Android\SDK-1.1 目 录

3 创 建 sdcard 镜 像 mksdcard 256M ./sdcard.img

4 往 SDCard 中 添 加 资 源 :adb push zyf.mp3 /sdcard/zyf.mp3

5 往 SDCard 中 获 取 资 源 :adb pull /sdcard/mybaby.jpg C:\

6 重 启 模 拟 器 后 , 文 件 即 在 虚 拟 SDCard 中

向 模 拟 器 安 装 APK 软 件 包

1

2

3

4

打 开 cmd

切 换 到 Android SDK tools 目 录 下

把 APK 软 件 包 复 制 到 Android SDK tools 目 录 下

adb install Snake.pak

删 除 模 拟 器 中 APK 软 件 包

1 打 开 模 拟 器

2 打 开 cmd

3 adb shell

4 cd data/app

5 ls -l

6 rm 文 件 名 .apk

3


-----------------------------------Android 编 程 基 础

对 话 框 的 简 单 应 用

AlertDialog.Builder

public class DialogDemo extends Activity implements OnClickListener{

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

AlertDialog.Builder myBuilder=new

AlertDialog.Builder(this

this);

myBuilder.setIcon(R.drawable.hermes);

myBuilder.setTitle(" 我 的 对 话 框 ");

myBuilder.setPositiveButton(" 退 出 ", this);

myBuilder.show();

}

public void onClick(DialogInterface dialog, int which) {

}

}

Dialog

public class DialogDemo extends Activity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Dialog myDialog=new

Dialog(this

this);

myDialog.setTitle("this is a Dialog");

myDialog.show();

}

}

排 版 布 局 Layout

元 件 名 稱

FrameLayout

AbsoluteLayout

LinearLayout

RelativeLayout

TableLayout

説 明

單 一 物 件 的 容 器

以 絕 對 座 標 排 版 的 容 器

線 性 ( 水 平 或 垂 直 ) 排 版 的 容 器

以 相 對 座 標 ( 相 對 於 父 元 件 或 兄 弟 元 件 ) 排 版 的 容 器

以 表 格 方 式 排 版 的 容 器

4


-----------------------------------Android 编 程 基 础

TextView 中 的 超 链 接 文 本



关 键 点 : 设 置 了 该 属 性 则 可

以 自 动 链 接 , 否 则 没 有 链 接

5


-----------------------------------Android 编 程 基 础

时 间 设 置 对 话 框 DatePickerDialog 的 使 用

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

Button btn = (Button) findViewById(R.id.date);

btn.setOnClickListener(this

this);

}

@Override

public void onClick(View v) {// 普 通 按 钮 事 件

Calendar d = Calendar.getInstance(Locale.CHINA);

// 创 建 一 个 日 历 引 用 d, 通 过 静 态 方 法 getInstance() 从 指 定 时 区 Locale.CHINA 获 得 一 个 日 期 实 例

Date myDate=new

Date();

// 创 建 一 个 Date 实 例

d.setTime(myDate);

// 设 置 日 历 的 时 间 , 把 一 个 新 建 Date 实 例 myDate 传 入

int year=d.get(Calendar.YEAR);

int month=d.get(Calendar.MONTH);

int day=d.get(Calendar.DAY_OF_MONTH);

// 获 得 日 历 中 的 year month day

DatePickerDialog dlg=new

DatePickerDialog(this

this,this

this,year,month,day);

// 新 建 一 个 DatePickerDialog 构 造 方 法 中

( 设 备 上 下 文 ,OnDateSetListener 时 间 设 置 监 听 器 , 默 认 年 , 默 认 月 , 默 认 日 )

dlg.show();

// 让 DatePickerDialog 显 示 出 来

}

@Override

public void onDateSet(DatePicker view, int year, int monthOfYear,int

dayOfMonth){

//DatePickerDialog 中 按 钮 Set 按 下 时 自 动 调 用

TextView txt = (TextView) findViewById(R.id.text);

// 通 过 id 获 得 TextView 对 象

txt.setText(Integer.toString(year) + "-" +

Integer.toString(monthOfYear) + "-" +

Integer.toString(dayOfMonth));

// 设 置 text

}

6


-----------------------------------Android 编 程 基 础

ListView 的 使 用 1

1 ListView 的 声 明 、 定 义

ListView list=new

ListView(this

this);

2 数 组 适 配 器 的 生 命 定 义

String []name=new

new String[]{"Java","C++","C","C#","VB","XML",".NET","J#"};

ArrayAdapter arrayadapter

=new

ArrayAdapter(this

this,

android.R.layout.simple_list_item_1,name);

3 给 ListView 设 置 数 组 适 配 器

list.setAdapter(arrayadapter);

4 设 置 ListView 的 元 素 被 选 中 时 的 事 件 处 理 监 听 器

list.setOnItemClickListener(this

this);

5 事 件 处 理 监 听 器 方 法

@Override

public void onItemClick(AdapterView arg0,

View arg1, int arg2, long arg3) {

// TODO Auto-generated method stub

setTitle(GetData(arg2));

}

6 让 ListView 中 的 内 容 变 化 , 重 新 设 置 一 个 ArrayAdapter 即 可

String []score=new

String[]{"93","76","84","85","93","84","88","78"};

ArrayAdapter arratadapter2=new

ArrayAdapter(this

this,

android.R.layout.simple_expandable_list_item_1,score);

list.setAdapter(arratadapter2);

7


-----------------------------------Android 编 程 基 础

ListView 的 使 用 2

1 ListView 在 XML 文 件 中 声 明


2 ListView 在 java 文 件 中 获 得

listview = (ListView) findViewById(R.id.list);

// 从 list.xml 中 获 得 ListView 对 象 list

3 声 明 和 定 义 、 初 始 化 一 个 ArrayList

private ArrayList arrayList;

arrayList= new ArrayList();

Map map;

map= new HashMap();

map.put("System", "Linux");

map.put("Ability", "Cool");

arrayList.add(item);

4 声 明 和 定 义 、 初 始 化 一 个 SimpleAdepter

SimpleAdapter adapter;

adapter= new SimpleAdapter(this

this, coll,

android.R.layout.simple_list_item_1,

new String[] { "System" }, new int[] { android.R.id.text1 });

5

LixtView 设 置 适 配 器

listview.setAdapter(adapter);// 设 置 适 配 器

6 为 ListView 设 置 选 项 事 件 监 听 器

listview.setOnItemClickListener(listener);

OnItemClickListener listener = new OnItemClickListener() {

public void onItemClick(AdapterView arg0, View arg1, int arg2,

long arg3) {

textview.setTextColor(Color.YELLOW);

textview.setText(coll.get(arg2).get("prod_type").toString());

}

};// 事 件 处 理 接 口 实 现

8


-----------------------------------Android 编 程 基 础

ListActivity 的 使 用

1 定 义 一 个 类 继 承 自 ListActivity

public class ListActivityOfMe extends ListActivity {}

2 声 明 和 定 义 、 初 始 化 一 个 ArrayList

private ArrayList arrayList;

arrayList= new ArrayList();

Map map;

map= new HashMap();

map.put("System", "Linux");

map.put("Ability", "Cool");

arrayList.add(item);

3 声 明 和 定 义 、 初 始 化 一 个 SimpleAdepter

SimpleAdapter adapter;

adapter= new SimpleAdapter(this

this, arrayList,

android.R.layout.simple_list_item_1,

new String[] { "System" }, new int[] { android.R.id.text1 });

4 LixtView 设 置 适 配 器

this.setAdapter(adapter);// 设 置 适 配 器

5 选 项 按 键 事 件 处 理 , 不 需 要 .setOnItemClickListener(); 直 接 实 现 以 下 方 法

protected void onListItemClick(ListView l, View v, int position,

{

// TODO Auto-generated method stub

super.onListItemClick(l, v, position, id);

actionTo(position);

}

long id)

9


-----------------------------------Android 编 程 基 础

数 据 共 享 SharedPreferences

1 数 据 请 求 端 , 线 先 开 启 另 一 个 Activity

Intent startNextLayout=new

Intent();

startNextLayout.setClass(myEx.this

this,choiceGroupActivity.class

class);

startActivity(startNextLayout);

// 开 启 另 一 个 Activity

2 数 据 选 择 端 , 设 置 好 数 据 , 利 用 实 现 了 SharePreferences 接 口 的 Editor 子 类 添 加 并 修 改 数 据

Editor passfileEditor=getSharedPreferences("ITEM", 0).edit();

3

passfileEditor.putString("ChoiceKye", myContentString);

// 设 置 数 据 Key, 并 添 加 数 据 myContentString 到 共 享 区

数 据 选 择 端 , 存 入 数 据 , 关 闭 Activity。

passfileEditor.commit();// 委 托 , 存 入 数 据

finish();//

获 得 实 现 了 SharePreferences

接 口 的 Editor 对 象

4

数 据 请 求 端 , 利 用 SharePreferences 接 口 来 获 取 数 据 Key, 然 后 通 过 getString(String Key,String

Defaultvalue) 来 获 得 Key 中 数 据

SharedPreferences sharedPreferences=getSharedPreferences("ITEM", 0);

// 得 到 共 享 区 "ITEM" 的 接 口 引 用

String show=sharedPreferences.getString("ChoiceKye", "there is NONE")

/* 利 用 Key"ChoiceKye" 从 SharePreferences 接 口 引 用 中

得 到 ChoiceKye 的 内 容 , 没 有 时 为 默 认 值 "there is NONE"*/

TextView showTextView=(TextView)findViewById(R.id.showR);

showTextView.setText(show);// 显 示 ChoiceKye 的 内 容

10


-----------------------------------Android 编 程 基 础

Intents 和 ListActivity:

创 建 联 系 人 列 表 并 和 联 系 人 打 电 话 应 用 程 序

内 容 : 这 个 教 程 教 我 们 怎 么 开 发 一 个 ListActivity 应 用 , 联 系 人 的 列 表 装 载 到 了 基 于 List 的 View. 然 后 可 以 选

择 其 中 之 一 打 电 话 .

目 的 : 可 以 非 常 容 易 的 学 会 Intents 和 ListActivities 的 使 用 .

Main.xml






11


-----------------------------------Android 编 程 基 础

AndroidManifest.xml
















12


-----------------------------------Android 编 程 基 础

Java

package zyf.CallME;

import android.app.ListActivity;

import android.content.*;

import android.database.Cursor;

import android.os.Bundle;

import android.provider.Contacts.People;

import android.view.View;

import android.widget.*;

public class CallME extends ListActivity {

private String[] name;

private int[] to;

private SimpleCursorAdapter sadapter;

private Intent callIntent;

private long PhoneID;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

try {

Cursor c =

getContentResolver().query(People.CONTENT_URI, null,

null, null, null);

startManagingCursor(c);

name = new String[] { People.NAME };

to = new int[] { R.id.row_entry };

sadapter = new SimpleCursorAdapter(this

this,R.layout.main, c, name, to);

this.setListAdapter(sadapter);

} catch (Exception e) {

Toast.makeText(this

this, " 联 系 人 读 取 错 误 ",

Toast.LENGTH_LONG).show();

}

}

@Override

protected void onListItemClick(ListView l,

View v, int position, long id) {

super.onListItemClick(l, v, position, id);

callIntent=new

new Intent(Intent.ACTION_CALL);

Cursor c=(Cursor)sadapter.getItem(position);

PhoneID=c.getLong(c.getColumnIndex(People.PRIMARY_PHONE_ID));

callIntent.setData(ContentUris.withAppendedId(android.provider.

Contacts.Phones.CONTENT_URI, PhoneID));

startActivity(callIntent);

}

}

13


-----------------------------------Android 编 程 基 础

解 析

1

在 main.xml 中 添 加 两 个 TextView

用 于 显 示 "Name:" 的 静 态 标 签


用 于 动 态 添 加 并 显 示 联 系 人 的 姓 名 内 容 的 TextView


2

修 改 LinearLayout 的 布 局 方 向

android:orientation="horizontal"

// 说 明 横 向 排 布

3 AndroidManifest.xml 中 说 明 使 用 权 限


// 说 明 可 以 访 问 读 取 联 系 人 信 息


// 说 明 可 以 使 用 打 电 话 功 能

4

Java 代 码 中 的 读 取 联 系 人 信 息 处 理

try {

Cursor c =

getContentResolver().query(People.CONTENT_URI, null,null

null, null);

//Cursor, 该 接 口 提 供 从 数 据 库 提 取 信 息 返 回 结 果 中 随 机 读 写 访 问

//ContentResolver 提 供 应 用 程 序 访 问 Content 模 型

//ContentResolver.query() 抽 取 给 定 的 URI, 返 回 一 个 在 结 果 之 上 的 Cursor

startManagingCursor(c);

// 该 方 法 允 许 Activity 基 于 Activity 的 生 命 周 期 来 为 你 处 理 管 理 给 定 的 Cursor 的 生 命 周 期

name = new String[] { People.NAME };

// 新 建 用 户 名 数 组 People 类 用 于 列 出 联 系 人 People.NAME 得 到 联 系 人 姓 名

14


-----------------------------------Android 编 程 基 础

to = new int[] { R.id.row_entry };

// 创 建 一 个 TextView 引 用 数 组 用 来 放 置 获 取 的 People.NAME

sadapter = new SimpleCursorAdapter(this

this,R.layout.main, c, name, to);

this.setListAdapter(sadapter);

// 创 建 一 个 简 单 的 适 配 器 从 一 个 cursor 指 针 到 TextView 或 是 ImageView 的 map 专 栏 适 配 器 。

// 构 造 方 法 (Context,layout,Cursor,from,to), 第 一 参 数 是 设 备 上 下 文 , 第 二 个 参 数 是 布 局 文

件 , 第 三 个 参 数 是 指 向 联 系 人 URI 的 Cursor 指 针 ,form 代 表 来 源 的 字 符 串 ( 联 系 人 名 ),to 把 联 系 人 名 放 到

的 地 方 (TextView)

} catch (Exception e) {

Toast.makeText(this

this, " 联 系 人 读 取 错 误 ",Toast.LENGTH_LONG).show();

//Toast 显 示 提 示 , 不 打 扰 用 户 。.show() 用 来 显 示 Toast

}

5 Java 代 码 中 的 点 击 事 件 处 理 ( 选 择 后 电 话 联 系 该 联 系 人 )

protected void onListItemClick(ListView l,View v, int position, long id) {

// TODO Auto-generated method stub

super.onListItemClick(l, v, position, id);

callIntent=new

new Intent(Intent.ACTION_CALL);

}

// 创 建 一 个 带 有 Call 动 作 的 Intent

Cursor c=(Cursor)sadapter.getItem(position);

// 通 过 选 中 的 Items 位 置 来 获 取 相 应 的 联 系 人 指 针 Cursor

PhoneID=c.getLong(c.getColumnIndex(People.PRIMARY_PHONE_ID));

// 获 取 相 应 联 系 人 电 话 号 码

//getLong() 返 回 请 求 数 据 的 一 个 长 整 型

// 为 给 定 的 列 , 返 回 基 于 0 的 索 引 值

//People.PRIMARY_PHONE_ID 获 取 主 键 电 话 号 码

callIntent.setData(ContentUris.withAppendedId(android.provider.

// 为 Intent 设 置 操 作 的 数 据

Contacts.Phones.CONTENT_URI, PhoneID));

//ContentUris 操 作 带 有 数 据 内 容 的 Uri 的 实 用 方 法 、 它 们 带 有 "Content" 体 制

//withAppendedId() 把 给 定 的 ID 添 加 到 path 后 面 第 一 个 参 数 是 开 始 的 , 后 面 参 数 是 添 加 的

startActivity(callIntent);

// 开 启 Intent

15


-----------------------------------Android 编 程 基 础

Android Permission 大 全

Android SDK 1.0 访 问 权 限 许 可

程 序 执 行 需 要 读 取 到 安 全 敏 感 项 必 需 在 androidmanifest.xml 中 声 明 相 关 权 限 请 求 , 完 整 列 表 如 下 :

android.permission.ACCESS_CHECKIN_PROPERTIES

允 许 读 写 访 问 "properties" 表 在 checkin 数 据 库 中 , 改 值 可 以 修 改 上 传 ( Allows read/write access to the "properties"

table in the checkin database, to change values that get uploaded)

android.permission.ACCESS_COARSE_LOCATION

允 许 一 个 程 序 访 问 CellID 或 WiFi 热 点 来 获 取 粗 略 的 位 置 (Allows an application to access coarse (e.g., Cell-ID,

WiFi) location)

android.permission.ACCESS_FINE_LOCATION

允 许 一 个 程 序 访 问 精 良 位 置 ( 如 GPS) (Allows an application to access fine (e.g., GPS) location)

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS

允 许 应 用 程 序 访 问 额 外 的 位 置 提 供 命 令 (Allows an application to access extra location provider commands)

android.permission.ACCESS_MOCK_LOCATION

允 许 程 序 创 建 模 拟 位 置 提 供 用 于 测 试 (Allows an application to create mock location providers for testing)

android.permission.ACCESS_NETWORK_STATE

允 许 程 序 访 问 有 关 GSM 网 络 信 息 (Allows applications to access information about networks)

android.permission.ACCESS_SURFACE_FLINGER

允 许 程 序 使 用 SurfaceFlinger 底 层 特 性 (Allows an application to use SurfaceFlinger's low level features)

16


-----------------------------------Android 编 程 基 础

android.permission.ACCESS_WIFI_STATE

允 许 程 序 访 问 Wi-Fi 网 络 状 态 信 息 (Allows applications to access information about Wi-Fi networks)

android.permission.ADD_SYSTEM_SERVICE

允 许 程 序 发 布 系 统 级 服 务 (Allows an application to publish system-level services).

android.permission.BATTERY_STATS

允 许 程 序 更 新 手 机 电 池 统 计 信 息 (Allows an application to update the collected battery statistics)

android.permission.BLUETOOTH

允 许 程 序 连 接 到 已 配 对 的 蓝 牙 设 备 (Allows applications to connect to paired bluetooth devices)

android.permission.BLUETOOTH_ADMIN

允 许 程 序 发 现 和 配 对 蓝 牙 设 备 (Allows applications to discover and pair bluetooth devices)

android.permission.BRICK

请 求 能 够 禁 用 设 备 ( 非 常 危 险 )(Required to be able to disable the device (very *erous!).)

android.permission.BROADCAST_PACKAGE_REMOVED

允 许 程 序 广 播 一 个 提 示 消 息 在 一 个 应 用 程 序 包 已 经 移 除 后 (Allows an application to broadcast a notification that

an application package has been removed)

android.permission.BROADCAST_STICKY

允 许 一 个 程 序 广 播 常 用 intents(Allows an application to broadcast sticky intents)

17


-----------------------------------Android 编 程 基 础

android.permission.CALL_PHONE

允 许 一 个 程 序 初 始 化 一 个 电 话 拨 号 不 需 通 过 拨 号 用 户 界 面 需 要 用 户 确 认 (Allows an application to initiate a

phone call without going through the Dialer user interface for the user to confirm the call being placed.)

android.permission.CALL_PRIVILEGED

允 许 一 个 程 序 拨 打 任 何 号 码 , 包 含 紧 急 号 码 无 需 通 过 拨 号 用 户 界 面 需 要 用 户 确 认 (Allows an application to call

any phone number, including emergency numbers, without going through the Dialer user interface for the user to

confirm the call being placed)

android.permission.CAMERA

请 求 访 问 使 用 照 相 设 备 (Required to be able to access the camera device. )

android.permission.CHANGE_COMPONENT_ENABLED_STATE

允 许 一 个 程 序 是 否 改 变 一 个 组 件 或 其 他 的 启 用 或 禁 用 (Allows an application to change whether an application

component (other than its own) is enabled or not. )

android.permission.CHANGE_CONFIGURATION

允 许 一 个 程 序 修 改 当 前 设 置 , 如 本 地 化 (Allows an application to modify the current configuration, such as locale. )

android.permission.CHANGE_NETWORK_STATE

允 许 程 序 改 变 网 络 连 接 状 态 (Allows applications to change network connectivity state)

android.permission.CHANGE_WIFI_STATE

允 许 程 序 改 变 Wi-Fi 连 接 状 态 (Allows applications to change Wi-Fi connectivity state)

android.permission.CLEAR_APP_CACHE

允 许 一 个 程 序 清 楚 缓 存 从 所 有 安 装 的 程 序 在 设 备 中 (Allows an application to clear the caches of all installed

applications on the device. )

18


-----------------------------------Android 编 程 基 础

android.permission.CLEAR_APP_USER_DATA

允 许 一 个 程 序 清 除 用 户 设 置 (Allows an application to clear user data)

android.permission.CONTROL_LOCATION_UPDATES

允 许 启 用 禁 止 位 置 更 新 提 示 从 无 线 模 块 (Allows enabling/disabling location update notifications from the radio. )

android.permission.DELETE_CACHE_FILES

允 许 程 序 删 除 缓 存 文 件 (Allows an application to delete cache files)

android.permission.DELETE_PACKAGES

允 许 一 个 程 序 删 除 包 (Allows an application to delete packages)

android.permission.DEVICE_POWER

允 许 访 问 底 层 电 源 管 理 (Allows low-level access to power management)

android.permission.DIAGNOSTIC

允 许 程 序 RW 诊 断 资 源 (Allows applications to RW to diagnostic resources. )

android.permission.DISABLE_KEYGUARD

允 许 程 序 禁 用 键 盘 锁 (Allows applications to disable the keyguard )

android.permission.DUMP

允 许 程 序 返 回 状 态 抓 取 信 息 从 系 统 服 务 (Allows an application to retrieve state dump information from system

services.)

19


-----------------------------------Android 编 程 基 础

android.permission.EXPAND_STATUS_BAR

允 许 一 个 程 序 扩 展 收 缩 在 状 态 栏 ,android 开 发 网 提 示 应 该 是 一 个 类 似 Windows Mobile 中 的 托 盘 程 序 (Allows an

application to expand or collapse the status bar. )

android.permission.FACTORY_TEST

作 为 一 个 工 厂 测 试 程 序 , 运 行 在 root 用 户 (Run as a manufacturer test application, running as the root user. )

android.permission.FLASHLIGHT

访 问 闪 光 灯 ,android 开 发 网 提 示 HTC Dream 不 包 含 闪 光 灯 (Allows access to the flashlight )

android.permission.FORCE_BACK

允 许 程 序 强 行 一 个 后 退 操 作 是 否 在 顶 层 activities(Allows an application to force a BACK operation on whatever is

the top activity. )

android.permission.FOTA_UPDATE

暂 时 不 了 解 这 是 做 什 么 使 用 的 ,android 开 发 网 分 析 可 能 是 一 个 预 留 权 限 .

android.permission.GET_ACCOUNTS

访 问 一 个 帐 户 列 表 在 Accounts Service 中 (Allows access to the list of accounts in the Accounts Service)

android.permission.GET_PACKAGE_SIZE

允 许 一 个 程 序 获 取 任 何 package 占 用 空 间 容 量 (Allows an application to find out the space used by any package. )

android.permission.GET_TASKS

允 许 一 个 程 序 获 取 信 息 有 关 当 前 或 最 近 运 行 的 任 务 , 一 个 缩 略 的 任 务 状 态 , 是 否 活 动 等 等 (Allows an

application to get information about the currently or recently running tasks: a thumbnail representation of the tasks,

what activities are running in it, etc.)

20


-----------------------------------Android 编 程 基 础

android.permission.HARDWARE_TEST

允 许 访 问 硬 件 (Allows access to hardware peripherals. )

android.permission.INJECT_EVENTS

允 许 一 个 程 序 截 获 用 户 事 件 如 按 键 、 触 摸 、 轨 迹 球 等 等 到 一 个 时 间 流 ,android 开 发 网 提 醒 算 是 hook 技 术 吧

(Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY

window.)

android.permission.INSTALL_PACKAGES

允 许 一 个 程 序 安 装 packages(Allows an application to install packages. )

android.permission.INTERNAL_SYSTEM_WINDOW

允 许 打 开 窗 口 使 用 系 统 用 户 界 面 (Allows an application to open windows that are for use by parts of the system

user interface. )

android.permission.INTERNET

允 许 程 序 打 开 网 络 套 接 字 (Allows applications to open network sockets)

android.permission.MANAGE_APP_TOKENS

允 许 程 序 管 理 ( 创 建 、 催 后 、z- order 默 认 向 z 轴 推 移 ) 程 序 引 用 在 窗 口 管 理 器 中 (Allows an application to manage

(create, destroy, Z-order) application tokens in the window manager. )

android.permission.MASTER_CLEAR

目 前 还 没 有 明 确 的 解 释 ,android 开 发 网 分 析 可 能 是 清 除 一 切 数 据 , 类 似 硬 格 机

android.permission.MODIFY_AUDIO_SETTINGS

允 许 程 序 修 改 全 局 音 频 设 置 (Allows an application to modify global audio settings)

21


-----------------------------------Android 编 程 基 础

android.permission.MODIFY_PHONE_STATE

允 许 修 改 话 机 状 态 , 如 电 源 , 人 机 接 口 等 (Allows modification of the telephony state - power on, mmi, etc. )

android.permission.MOUNT_UNMOUNT_FILESYSTEMS

允 许 挂 载 和 反 挂 载 文 件 系 统 可 移 动 存 储 (Allows mounting and unmounting file systems for removable storage. )

android.permission.PERSISTENT_ACTIVITY

允 许 一 个 程 序 设 置 他 的 activities 显 示 (Allow an application to make its activities persistent. )

android.permission.PROCESS_OUTGOING_CALLS

允 许 程 序 监 视 、 修 改 有 关 播 出 电 话 (Allows an application to monitor, modify, or abort outgoing calls)

android.permission.READ_CALENDAR

允 许 程 序 读 取 用 户 日 历 数 据 (Allows an application to read the user's calendar data.)

android.permission.READ_CONTACTS

允 许 程 序 读 取 用 户 联 系 人 数 据 (Allows an application to read the user's contacts data.)

android.permission.READ_FRAME_BUFFER

允 许 程 序 屏 幕 波 或 和 更 多 常 规 的 访 问 帧 缓 冲 数 据 (Allows an application to take screen shots and more generally

get access to the frame buffer data)

android.permission.READ_INPUT_STATE

允 许 程 序 返 回 当 前 按 键 状 态 (Allows an application to retrieve the current state of keys and switches. )

android.permission.READ_LOGS

允 许 程 序 读 取 底 层 系 统 日 志 文 件 (Allows an application to read the low-level system log files. )

22


-----------------------------------Android 编 程 基 础

android.permission.READ_OWNER_DATA

允 许 程 序 读 取 所 有 者 数 据 (Allows an application to read the owner's data)

android.permission.READ_SMS

允 许 程 序 读 取 短 信 息 (Allows an application to read SMS messages.)

android.permission.READ_SYNC_SETTINGS

允 许 程 序 读 取 同 步 设 置 (Allows applications to read the sync settings)

android.permission.READ_SYNC_STATS

允 许 程 序 读 取 同 步 状 态 (Allows applications to read the sync stats)

android.permission.REBOOT

请 求 能 够 重 新 启 动 设 备 (Required to be able to reboot the device. )

android.permission.RECEIVE_BOOT_COMPLETED

允 许 一 个 程 序 接 收 到 ACTION_BOOT_COMPLETED 广 播 在 系 统 完 成 启 动 (Allows an application to receive the

ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. )

android.permission.RECEIVE_MMS

允 许 一 个 程 序 监 控 将 收 到 MMS 彩 信 , 记 录 或 处 理 (Allows an application to monitor incoming MMS messages, to

record or perform processing on them. )

android.permission.RECEIVE_SMS

允 许 程 序 监 控 一 个 将 收 到 短 信 息 , 记 录 或 处 理 (Allows an application to monitor incoming SMS messages, to

record or perform processing on them.)

23


-----------------------------------Android 编 程 基 础

android.permission.RECEIVE_WAP_PUSH

允 许 程 序 监 控 将 收 到 WAP PUSH 信 息 (Allows an application to monitor incoming WAP push messages. )

android.permission.RECORD_AUDIO

允 许 程 序 录 制 音 频 (Allows an application to record audio)

android.permission.REORDER_TASKS

允 许 程 序 改 变 Z 轴 排 列 任 务 (Allows an application to change the Z-order of tasks)

android.permission.RESTART_PACKAGES

允 许 程 序 重 新 启 动 其 他 程 序 (Allows an application to restart other applications)

android.permission.SEND_SMS

允 许 程 序 发 送 SMS 短 信 (Allows an application to send SMS messages)

android.permission.SET_ACTIVITY_WATCHER

允 许 程 序 监 控 或 控 制 activities 已 经 启 动 全 局 系 统 中 Allows an application to watch and control how activities are

started globally in the system.

android.permission.SET_ALWAYS_FINISH

允 许 程 序 控 制 是 否 活 动 间 接 完 成 在 处 于 后 台 时 Allows an application to control whether activities are immediately

finished when put in the background.

android.permission.SET_ANIMATION_SCALE

修 改 全 局 信 息 比 例 (Modify the global animation scaling factor.)

24


-----------------------------------Android 编 程 基 础

android.permission.SET_DEBUG_APP

配 置 一 个 程 序 用 于 调 试 (Configure an application for debugging.)

android.permission.SET_ORIENTATION

允 许 底 层 访 问 设 置 屏 幕 方 向 和 实 际 旋 转 (Allows low-level access to setting the orientation (actually rotation) of the

screen.)

android.permission.SET_PREFERRED_APPLICATIONS

允 许 一 个 程 序 修 改 列 表 参 数

PackageManager.addPackageToPreferred() 和 PackageManager.removePackageFromPreferred() 方 法 (Allows an

application to modify the list of preferred applications with the PackageManager.addPackageToPreferred()

and PackageManager.removePackageFromPreferred() methods.)

android.permission.SET_PROCESS_FOREGROUND

允 许 程 序 当 前 运 行 程 序 强 行 到 前 台 (Allows an application to force any currently running process to be in the

foreground.)

android.permission.SET_PROCESS_LIMIT

允 许 设 置 最 大 的 运 行 进 程 数 量 (Allows an application to set the maximum number of (not needed) application

processes that can be running. )

android.permission.SET_TIME_ZONE

允 许 程 序 设 置 时 间 区 域 (Allows applications to set the system time zone)

android.permission.SET_WALLPAPER

允 许 程 序 设 置 壁 纸 (Allows applications to set the wallpaper )

25


-----------------------------------Android 编 程 基 础

android.permission.SET_WALLPAPER_HINTS

允 许 程 序 设 置 壁 纸 hits(Allows applications to set the wallpaper hints)

android.permission.SIGNAL_PERSISTENT_PROCESSES

允 许 程 序 请 求 发 送 信 号 到 所 有 显 示 的 进 程 中 (Allow an application to request that a signal be sent to all persistent

processes)

android.permission.STATUS_BAR

允 许 程 序 打 开 、 关 闭 或 禁 用 状 态 栏 及 图 标 Allows an application to open, close, or disable the status bar and its

icons.

android.permission.SUBSCRIBED_FEEDS_READ

允 许 一 个 程 序 访 问 订 阅 RSS Feed 内 容 提 供 (Allows an application to allow access the subscribed feeds

ContentProvider. )

android.permission.SUBSCRIBED_FEEDS_WRITE

系 统 暂 时 保 留 改 设 置 ,android 开 发 网 认 为 未 来 版 本 会 加 入 该 功 能 。

android.permission.SYSTEM_ALERT_WINDOW

允 许 一 个 程 序 打 开 窗 口 使 用 TYPE_SYSTEM_ALERT, 显 示 在 其 他 所 有 程 序 的 顶 层 (Allows an application to

open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )

android.permission.VIBRATE

允 许 访 问 振 动 设 备 (Allows access to the vibrator)

android.permission.WAKE_LOCK

允 许 使 用 PowerManager 的 WakeLocks 保 持 进 程 在 休 眠 时 从 屏 幕 消 失 ( Allows using PowerManager WakeLocks

to keep processor from sleeping or screen from dimming)

26


-----------------------------------Android 编 程 基 础

android.permission.WRITE_APN_SETTINGS

允 许 程 序 写 入 API 设 置 (Allows applications to write the apn settings)

android.permission.WRITE_CALENDAR

允 许 一 个 程 序 写 入 但 不 读 取 用 户 日 历 数 据 (Allows an application to write (but not read) the user's calendar data. )

android.permission.WRITE_CONTACTS

允 许 程 序 写 入 但 不 读 取 用 户 联 系 人 数 据 (Allows an application to write (but not read) the user's contacts data. )

android.permission.WRITE_GSERVICES

允 许 程 序 修 改 Google 服 务 地 图 (Allows an application to modify the Google service map. )

android.permission.WRITE_OWNER_DATA

允 许 一 个 程 序 写 入 但 不 读 取 所 有 者 数 据 (Allows an application to write (but not read) the owner's data.)

android.permission.WRITE_SETTINGS

允 许 程 序 读 取 或 写 入 系 统 设 置 (Allows an application to read or write the system settings. )

android.permission.WRITE_SMS

允 许 程 序 写 短 信 (Allows an application to write SMS messages)

android.permission.WRITE_SYNC_SETTINGS

允 许 程 序 写 入 同 步 设 置 (Allows applications to write the sync settings)

27


-----------------------------------Android 编 程 基 础

Android SDK1.5 新 视 角

用 户 界 面 的 改 进

Android SDK1.5 的 UI 做 了 很 多 细 节 的 改 进 ,Google 微 调 了 所 有 核 心 UI 组 件 的 样 式 , 使 其 更 加 美 观 , 并 且 对

包 括 Browser,Gmail,Email,Calendar,Camera&Gallery 以 及 Contacts 等 在 内 的 自 带 程 序 界 面 都 作 了 优 化 。

让 我 们 来 看 一 个 例 子 , 这 是 新 建 联 系 人 的 界 面 , 左 侧 是 来 自 Android 1.1 的 截 图 , 右 侧 是 来 自 1.5 的 截 图 ( 此

图 来 自 Google Android 官 方 Blog)。 我 们 可 以 看 到 下 拉 选 择 框 和 按 钮 的 样 式 发 生 了 不 小 的 变 化 , 而 且 添 加 联

系 人 详 情 的 方 式 也 更 加 简 便 了 ,1.1 中 的 More Info 按 钮 不 见 了 , 取 而 代 之 的 是 每 一 个 项 目 后 面 的 添 加 和 删 除

按 钮 。 有 兴 趣 的 朋 友 可 以 打 开 1.1 和 1.5 的 模 拟 器 来 比 较 一 下 两 者 在 操 作 上 的 差 异 。

28


-----------------------------------Android 编 程 基 础

全 新 的 视 屏 录 制 功 能

上 传 视 频 到 Youtube, 上 传 照 片 到 Picasa

Android 1.5 中 , 用 户 可 以 利 用 内 置 的 摄 像 头 来 拍 摄 视 频 , 并 且 立 即 上 传 到 Youtube 与 朋 友 分 享 ( 尽 管 目 前 看

来 G1 的 3M 摄 像 头 效 果 不 太 理 想 , 希 望 G2 的 5M 摄 像 头 效 果 会 好 一 些 )。 同 样 , 用 户 所 拍 的 照 片 也 将 可 以

方 便 的 上 传 到 Picasa 相 册 。

当 用 户 完 成 拍 摄 / 拍 照 后 , 只 需 按 一 下 “Share” 按 钮 ,Android 便 会 让 你 选 择 Share 的 方 式 , 只 要 选 择

Youtube/Picasa, 然 后 输 入 你 的 账 户 信 息 , 就 可 以 开 始 上 传 了 。

软 键 盘 的 支 持

G1 带 有 一 个 QWERTY 物 理 键 盘 , 而 G2 将 取 消 全 键 盘 而 改 用 全 触 摸 的 设 计 , 所 以 软 键 盘 也 是 Android 1.5 中

一 个 非 常 重 要 的 特 性 。 下 面 我 们 来 看 一 张 Android 1.5 软 键 盘 的 截 图 吧 , 键 盘 的 布 局 还 是 标 准 的 QWERTY,

有 一 个 Shift 键 以 及 输 入 模 式 切 换 键 , 进 入 数 字 模 式 以 后 , 可 以 输 入 数 字 以 及 +-*/?! 等 常 用 符 号 , 按 ALT 就 可

以 输 入 一 些 不 太 常 用 的 符 号 。

29


-----------------------------------Android 编 程 基 础

中 文 显 示 和 中 文 输 入 的 支 持

Android 1.1 除 了 英 语 以 外 , 只 能 支 持 德 语 , 而 Android 1.5 的 国 际 化 有 了 更 进 一 步 的 发 展 , 支 持 了 包 括 简 体 /

繁 体 中 文 、 日 语 、 朝 鲜 语 、 西 班 牙 语 、 法 语 、 意 大 利 语 、 荷 兰 语 、 波 兰 语 、 俄 语 在 内 的 各 国 语 言 ( 大 概 主 要

语 种 就 差 葡 萄 牙 语 了 吧 ,Correct me if I’m wrong :))。 当 然 我 最 关 心 的 就 是 对 于 中 文 显 示 和 输 入 的 支 持 了 。

启 动 模 拟 器 , 载 入 1.5 的 Image 后 , 默 认 语 言 依 旧 是 英 语 , 当 我 在 Settings–>Locale & text 中 把 Locale 改 成

Chinese(China) 之 后 , 界 面 语 言 就 切 换 到 中 文 了 。

不 过 这 时 候 ,Google 拼 音 输 入 法 却 并 不 工 作 , 我 们 调 出 软 键 盘 以 后 还 是 看 不 到 切 换 到 中 文 的 按 键 , 尽 管 在

Locale & text 设 置 中 , 它 是 被 选 中 的 。 我 们 需 要 反 选 “Android 键 盘 ” 这 一 选 项 , 然 后 退 出 设 置 菜 单 , 这 时 Google

拼 音 输 入 法 就 可 以 工 作 了 。

关 于 输 入 的 另 一 个 值 得 注 意 的 特 性 是 , 得 益 于 IMF 我 们 可 以 安 装 第 3 方 的 输 入 法 来 取 代 Google 拼 音 , 也 许

不 久 以 后 就 会 有 Android 版 的 搜 狗 拼 音 、 五 笔 加 加 。

30


-----------------------------------Android 编 程 基 础

桌 面 Widgets 和 Live folders

首 先 , 相 对 于 Android1.1 来 说 , 自 带 的 桌 面 Widge 增 加 了 Calendar 和 Music player,Music player widget 的 样

式 看 起 来 还 不 错 。

至 于 Live folder, 自 带 的 包 括 列 出 所 有 联 系 人 , 列 出 所 有 有 电 话 号 码 的 联 系 人 , 以 及 列 出 Starred 联 系 人 , 因

为 缺 少 可 定 制 性 , 这 个 功 能 现 在 看 来 似 乎 并 不 怎 么 吸 引 人 。 不 过 新 增 的 Home screen widgets API 和 Live folders

API 使 得 开 发 者 可 以 编 写 各 种 新 奇 的 Widget 和 Live Folder 来 丰 富 Android 的 应 用 。

蓝 牙 功 能 改 进

Android 1.5 的 蓝 牙 增 加 了 A2DP(Advanced Audio Distribution Profile) 和 AVRCP(Audio Video Remote Cortrol

Profile) 的 支 持 , 立 体 声 显 著 提 升 了 通 过 蓝 牙 听 音 乐 的 用 户 体 验 ,AVRCP 则 允 许 用 户 通 过 蓝 牙 进 行 包 括 暂 停 、

停 止 、 启 动 重 放 、 音 量 控 制 及 其 它 类 型 的 远 程 控 制 操 作 。 另 外 ,Auto-pairing 则 使 耳 机 与 手 机 连 接 更 加 快 捷 方

便 。

31


-----------------------------------Android 编 程 基 础

捆 绑 应 用 功 能 改 进

Android 1.5 内 置 的 Chrome lite 浏 览 器 采 用 了 最 新 的 Webkit 引 擎 和 Squirrelfish Javascript 引 擎 , 并 且 开 始 支 持

网 页 内 容 复 制 和 页 内 搜 索 功 能 , 窗 口 下 方 的 Zoom In/Out 菜 单 也 有 变 化 , 同 时 用 户 可 以 指 定 网 页 默 认 编 码 。

我 比 较 感 兴 趣 的 就 是 网 页 内 容 复 制 和 页 内 搜 索 了 , 看 一 下 截 图 吧 。

Gtalk、Contacts、SMS、MMS、Gmail 和 Email 程 序 直 接 的 集 成 也 更 加 紧 密 , 使 得 用 户 可 以 在 Contacts、SMS、

MMS、Gmail 和 Email 中 查 看 Gtalk 联 系 人 的 状 态 等

Gmail 客 户 端 软 件 中 , 批 量 的 存 档 、 删 除 、 加 Label 操 作 也 已 经 得 到 支 持 。

另 外 ,Android 1.5 还 对 SD 卡 的 管 理 做 了 改 进 , 增 加 了 文 件 系 统 检 查 和 自 动 修 复 功 能 。

系 统 性 能 优 化

除 了 上 面 提 到 的 新 功 能 ,Android 1.5 还 有 不 少 性 能 上 的 改 进

包 括 :

* 更 快 的 摄 像 头 启 动 和 拍 摄 速 度

* 更 快 地 获 取 GPS 位 置

* 浏 览 器 中 更 平 滑 的 滚 屏

* Gmail 中 更 快 的 对 话 列 表 滚 屏 等

32


-----------------------------------Android 编 程 基 础

Android 图 书 大 全

Android 中 文 教 程 图 书

Google Android 开 发 入 门 与 实 战

33


-----------------------------------Android 编 程 基 础

Google Android SDK 开 发 范 例 大 全 / 佘 志 龙

34


-----------------------------------Android 编 程 基 础

Google Android 程 式 设 计 与 应 用 / 杨 文 志

Google!Android 手 机 应 用 程 式 设 计 入 门 / 盖 索 林

35


-----------------------------------Android 编 程 基 础

Android 应 用 框 架 原 理 与 程 式 设 计 36 技 / 高 焕 堂

36


-----------------------------------Android 编 程 基 础

Google Android 设 计 招 式 之 美 / 高 焕 堂

37


-----------------------------------Android 编 程 基 础

Android 应 用 软 体 架 构 设 计 / 高 焕 堂

38


-----------------------------------Android 编 程 基 础

Android 与 物 件 导 向 技 术 / 高 焕 堂

39


-----------------------------------Android 编 程 基 础

Android 外 文 书 籍

40


-----------------------------------Android 编 程 基 础

Android 网 站 资 源 收 集 大 全

eoeAndroid 国 内 一 流 的 Android 开 发 社 区

http://www.eoeandroid.com/?fromuid=3245

eoeMobile 国 内 一 流 的 Android 开 发 团 队

http://www.eoemobile.com/index

Android 爱 好 者 论 坛

http://www.loveandroid.com/

Android 开 发 者 论 坛

http://www.androidin.com/

google 主 站 :

http://code.google.com/android/

E 文 文 档

http://code.google.com/android/documentation.html

Android 中 国 开 发 者 团 队 google groups

http://groups.google.com/group/android-developers-zh

中 文 社 区

http://www.androidcn.net

http://www.androidcn.net/wiki

41


-----------------------------------Android 编 程 基 础

google groups

http://groups.google.com/group/android-developers

Other Open Handset Alliance Project

http://code.google.com/p/android/downloads/list

OHA: 开 放 手 持 设 备 联 盟 官 方 网 站

http://www.openhandsetalliance.com/

GPhone 论 坛

http://bbs.gphone999.com/

Linux 基 金 会

http://www.linux-foundation.org/

Mobile Linux

http://www.linux-foundation.org/en/Mobile_Linux

OMA: 开 放 移 动 联 盟

http://www.linux-foundation.org/

LiPS Forum

http://www.lipsforum.org/

CE Linux Forum

http://tree.celinuxforum.org/

42


-----------------------------------Android 编 程 基 础

Gnome Mobile and Embedded (GMAE)

http://www.gnome.org/mobile/

LiMo Foundation

https://www.limofoundation.org/sf/sfmain/do/home

Ubuntu Mobile

https://lists.ubuntu.com/archive ... 007-May/000289.html

Mobile & Internet Linux Project

http://www.moblin.org/

国 外 网 站

http://www.androidboards.com/

http://www.androidev.com/

http://androidcommunity.com/

http://anddev.org/

Android Wiki - Main Page

http://androidwiki.com/wiki/Main_Page

Official GoogleAndroid

Developers Blog

http://android-developers.blogspot.com/

Open Handset Magazine

http://openhandsetmagazine.com/

GoogleAndroid

Platform - TheAndroid

Log

http://theandroidlog.com/

43


-----------------------------------Android 编 程 基 础

封 面

44

More magazines by this user
Similar magazines