手 机 应 用 平 台 软 件 开 发 3 开 发 入 门 刘 宁 Email:liuning2@mail.sysu.edu.cn
课 程 简 介 课 程 目 标 Android 开 发 准 备 工 作 开 发 包 及 工 具 安 装 创 建 HelloWorld Android 程 序 设 计 基 础
创 意 移 动 应 用
创 意 移 动 应 用
创 意 移 动 应 用
创 意 移 动 应 用
创 意 移 动 应 用
在 线 开 发 工 具 App Inventor 会 HTML 就 会 Android http://www.rexsee.com/ 以 拖 放 代 码 块 ( 表 现 为 图 形 图 像 代 表 不 同 的 智 能 手 机 功 能 ), 将 这 些 代 码 放 在 一 起, 在 个 人 智 能 手 机 上 产 生 应 用 程 序 8
开 发 环 境 简 介 Android 开 发 所 在 的 操 作 系 统 必 须 是 Windows XP 及 以 上 的 版 本 Mac OS 或 者 Linux Android 开 发 所 需 要 的 一 系 列 工 具 包 括 JDK+Eclipse+Android SDK + ADT Android Development Tools (ADT) -Eclipse plug-in Android Software Development Kit (Android SDK) http://androidappdocs.appspot.com/index.html Java SDK http://java.sun.com/javase/downloads/ JAVA Android 编 程 语 言 http://docs.oracle.com/javase/tutorial/ XML 应 用 配 置 与 界 面 定 义
IDE--Eclipse Android 是 主 要 使 用 JAVA 进 行 开 发 的, 而 JDK 是 进 行 JAVA 开 发 时 所 必 须 的 开 发 包 ; Eclipse 是 一 个 开 放 源 代 码 基 于 Java 的 可 扩 展 开 发 平 台 它 只 是 一 个 框 架 和 一 组 服 务, 用 于 通 过 插 件 组 件 构 建 开 发 环 境 Eclipse 附 带 了 一 个 标 准 的 插 件 集, 包 括 Java 开 发 工 具 (Java Development Tools,JDT)Google 提 供 了 基 于 Eclipse 的 Android 开 发 插 件 ADT, 因 此 可 以 选 择 Eclipse 作 为 Android 开 发 的 IDE IDE Eclipse http://www.eclipse.org/downloads/
The IDE(Eclipse) for Android
Eclipse 快 捷 键 在 Eclipse 里, 写 一 个 没 有 导 入 相 应 包 的 类 名 ( 这 个 类 名 已 经 完 全 写 全, 比 如 LayoutManager), 可 以 用 ctrl+shift+m/ctrl+shift+o/ctrl+1 导 入 相 应 的 包 Ctrl+D: 删 除 当 前 行 Ctrl+Q 定 位 到 最 后 编 辑 的 地 方 Ctrl+O 快 速 显 示 OutLine Ctrl+T 快 速 显 示 当 前 类 的 继 承 结 构 Ctrl+W 关 闭 当 前 Editer Ctrl+E 快 速 显 示 当 前 Editer 的 下 拉 列 表 Ctrl+Z 返 回 到 修 改 前 的 状 态 Ctrl+Y 与 上 面 的 操 作 相 反 Ctrl+/ 注 释 当 前 行, 再 按 则 取 消 注 释 12
Eclipse 快 捷 键 Ctrl+Shift+/ 自 动 注 释 代 码 Ctrl+Shift+\ 自 动 取 消 已 经 注 释 的 代 码 Ctrl+Shift+M( 先 把 光 标 放 在 需 导 入 包 的 类 名 上 ) 作 用 是 加 Import 语 句 Ctrl+Shift+F 格 式 化 文 件 Format Document Ctrl+Shift+O 作 用 是 缺 少 的 Import 语 句 被 加 入, 多 余 的 Import 语 句 被 删 除 Alt+/ 代 码 助 手 完 成 一 些 代 码 的 插 入, 自 动 显 示 提 示 信 息 F3 跳 到 声 明 或 定 义 的 地 方 F5 单 步 调 试 进 入 函 数 内 部 F6 单 步 调 试 不 进 入 函 数 内 部, 如 果 装 了 金 山 词 霸 2006 则 要 把 取 词 开 关 的 快 捷 键 改 成 其 他 的 F7 由 函 数 内 部 返 回 到 调 用 处 F8 一 直 执 行 到 下 一 个 断 点 13
Android Studio Google 在 2013 I/O 大 会 上 发 布 Android Studio http://developer.android.com/sdk/installing/studio.html 先 安 装 好 JDK, 配 置 路 径 后, 再 安 装 Android Studio 若 JDK 安 装 在 C 盘, 如 :C:\Program Files\Java\jdk1.7.0_17, 则 新 建 系 统 变 量 ( 当 然 也 可 以 在 用 户 变 量 里 ): 变 量 名 :JAVA_HOME 变 量 值 :C:\Program Files\Java\jdk1.7.0_17 变 量 名 :CLASSPATH 变 量 值 :.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar path 里 ( 不 要 删 除 原 来 的 那 些 ) 加 入 ;C:\Program Files\Java\jdk1.7.0_17\bin 然 后 在 命 令 提 示 符 下 执 行 javac 命 令, 若 正 常 运 行 则 配 置 成 功 ;
开 发 工 具 的 安 装 及 配 置 在 进 行 开 发 时, 可 以 直 接 使 用 真 机 来 调 试 程 序, 也 可 以 借 助 SDK 提 供 的 AVD 工 具 创 建 Android 虚 拟 机 ( Android Virtual Device ), 配 置 成 不 同 类 型 屏 幕 大 小 的 设 备 AVD 可 以 模 拟 真 机 的 绝 大 部 分 功 能, 能 满 足 大 部 分 的 调 试 需 要, 因 此, 开 发 者 编 写 出 来 的 程 序 可 以 先 使 用 AVD 来 进 行 调 试 在 创 建 AVD 的 时 候, 有 一 些 需 要 配 置 的 选 项, 如 : 模 拟 器 SD 卡 大 小 平 台 版 本 屏 幕 分 辨 率 键 盘 摄 像 头 缓 存 区 大 小 轨 迹 球 等 等
开 发 工 具 的 安 装 及 配 置 创 建 AVD a) 打 开 Eclipse, 选 择 Window >Android SDK and AVD Manager >Virtual devices, 点 击 右 侧 的 New 按 钮, 弹 出 如 图 的 对 话 框 b) 填 入 名 字, 选 择 Target 的 API 等 级,SD Card 的 大 小 建 议 设 置 为 50~100M,Skin 建 议 选 则 HVGA,Hardware 就 保 持 默 认, 最 后 点 击 Create AVD ; AVD Manager
HelloWorld 创 建 HelloWorld 工 程 项 目 打 开 Eclipse, 选 择 顶 部 工 具 栏 中 的 File >new >project, 会 出 现 New Project 的 对 话 框, 选 择 Android >Android Project, 点 击 下 方 Next 按 钮, 出 现 如 图 所 示 的 界 面 依 次 键 入 Project name 的 名 称 HelloWorld, Package name 的 名 称 com.android.helloworld 其 他 保 持 默 认, 然 后 点 击 下 方 finish 按 钮, 就 建 立 了 第 一 个 Android 工 程
相 关 概 念 1. Project Name : 工 程 名, 在 计 算 机 中 存 储 工 程 的 目 录 的 名 字 ; 2. Application Name : 应 用 名, 应 用 程 序 的 名 称 ; 最 终 显 示 在 模 拟 器 上 3. Package Name : 包 名, 一 般 使 用 公 司 网 址 的 倒 写 4. Activity Name :UI 界 面 窗 口 的 类 名, 从 Activity 继 承 而 来 ;Activity 是 一 个 应 用 程 序 的 基 础, 通 常 是 Android Activity 的 子 类 5. Min SDK Version : 最 低 Api 说 明, 最 低 SDK 版 本, 如 果 写 2 的 话, 就 代 表 包 括 1.1 和 1.1 以 上 版 本 的 SDK 都 能 运 行, 写 3 的 话 1.1 的 平 台 就 不 能 运 行 了, 最 终 体 现 在 xml 申 明 文 件 里 可 以 为 空
程 序 运 行
程 序 说 明 文 本 标 签 TextView TextView 控 件 常 用 于 静 态 文 本 内 容 的 显 示, 相 当 于 Windows 程 序 中 的 Label 控 件 需 要 显 示 一 些 信 息 的 场 合, 不 能 够 输 入, 只 能 初 始 化 设 置 或 者 在 程 序 中 修 改 下 一 步, 希 望 在 Hello world 下 方 添 加 一 个 图 片? 20
显 示 图 像 ImageView 控 件
系 统 运 行
运 行 效 果 模 拟 器 调 试 模 拟 器 运 行 效 果 真 实 手 机 调 试 真 机 运 行 效 果
Android 应 用 工 程 文 件 组 成 (1) R.java 建 立 项 目 时 由 aapt 工 具 自 动 生 成, 只 读 模 式, 此 文 件 对 将 要 用 到 的 资 源 进 行 全 局 索 引 Res 文 件 夹 中 发 生 任 何 变 化,R.Java 都 会 重 新 编 译 /* AUTO-GENERATED FILE. DO NOT MODIFY.*/ package com.android.helloandroid; public final class R{ public static final class attr {} public static final class drawable { } public static final int icon=0x7f020000; public static final class layout { } public static final int main=0x7f030000; public static final class string { }} public static final int app_name=0x7f040001; public static final int hello=0x7f040000;
Android 应 用 工 程 文 件 组 成 (2) Android Library 运 行 Android 库 Asserts 目 录 assets 也 是 一 个 资 源 文 件 夹, 主 要 放 置 多 媒 体 文 件 assets 中 的 资 源 可 以 被 打 包 到 程 序 里 面, 和 Res 不 同 的 地 方 是,ADT 会 为 res 下 面 的 文 件 在 R 文 件 中 生 成 一 个 ID, 而 不 会 为 assets 中 的 资 源 生 成 ID, 因 此 要 使 用 该 目 录 下 面 的 文 件, 需 要 通 过 完 整 路 径 的 方 式 进 行 调 用 ( 该 目 录 下 面 的 文 件 不 会 被 编 译, 直 接 复 制 到 程 序 安 装 包 中 )
Android 应 用 工 程 文 件 组 成 (3) Res 目 录 主 要 放 置 应 用 用 到 的 资 源 文 件, 分 三 个 目 录 存 放, 当 目 录 中 的 资 源 文 件 发 生 变 化 时,R 文 件 就 会 自 动 发 生 变 化 AndroidManifest.xml 文 件 非 常 重 要, 相 当 于 应 用 的 配 置 文 件, 声 明 应 用 的 名 称 应 用 所 用 到 的 Activity Service 和 receiver 等
AndroidManifest.xml 文 件 <?xml version= 1.0 encoding= utf-8?> <!XML 的 标 记 语 句, 声 明 XML 的 版 本 和 编 码 方 式 > <manifest xmlns:android=http://schemas.android.com/apk/res/android <! 是 一 个 XML 命 名 空 间, 使 用 Android 命 名 空 间 里 面 一 些 通 用 属 性 > package="com.example.helloworld" android:versioncode="1 android:versionname="1.0" > <uses-sdk android:minsdkversion="8 android:targetsdkversion="17" /> <! 该 元 素 通 过 android:minsdkversion_and_android:targetsdkversion 描 了 本 应 用 的 兼 容 能 力 > <application android:allowbackup="true android:icon="@drawable/ic_launcher" android:label= @string/app_name android:theme= @style/apptheme > <! 说 明 了 程 序 的 图 标 与 标 题 > <activity android:name="com.example.helloworld.mainactivity android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> </manifest>
HelloWorld.java package com.example.helloworld; import android.os.bundle; import android.app.activity; import android.view.menu; public class MainActivity extends Activity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); } @Override public boolean oncreateoptionsmenu(menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return true; } } Activity 是 一 个 应 用 实 体, 当 Activity 开 始 的 时 候,Android System 将 会 调 用 其 中 的 OnCreate() 方 法, 可 以 看 做 程 序 的 入 口 点 setcontentview(r.layout.activity_main) 将 代 表 该 Activity 布 局 的 资 源 文 件 与 该 Activity 关 联 起 来
布 局 文 件 helloworld/res/layout/activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".mainactivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout> Button id="@+id/go":id=@+id/go, 表 示 需 要 一 个 唯 一 的 UID 来 作 为 Button 的 ID, 它 的 引 用 名 是 go android:text="@string/hello_world" ; 表 示 这 个 textview 的 文 本 不 是 直 接 写 有 main.xml 里 了, 而 是 来 源 于 另 一 个 资 源 描 述 文 件 strings.xml 里
strings.xml Helloworld.java public class MainActivity extends Activity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main);} activity_main.xml <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout> strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">helloworld</string> <string name="action_settings">settings</string> <string name="hello_world">hello world!</string> </resources>
Hello World 程 序 HelloWorld.Java 创 建 布 局 文 件 Main.xml UI 控 件 Activity 资 源 文 件 Strings.xml 字 符 资 源
HelloWorld.java package com.example.helloworld; import android.os.bundle; import android.app.activity; import android.view.menu; public class MainActivity extends Activity { @Override? protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); } @Override public boolean oncreateoptionsmenu(menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return true; } }
主 要 类 与 方 法 android.app.activity 类 : 因 为 几 乎 所 有 的 活 动 (activities) 都 是 与 用 户 交 互 的, 所 以 Activity 类 关 注 创 建 窗 口, 可 以 用 方 法 setcontentview(view) 将 自 己 的 UI 放 到 里 面 然 而 活 动 通 常 以 全 屏 的 方 式 展 示 给 用 户, 也 可 以 以 浮 动 窗 口 或 嵌 入 在 另 外 一 个 活 动 中 有 两 个 方 法 几 乎 所 有 的 Activity 子 类 都 实 现 : oncreate(bundle): 初 始 化 活 动 (Activity), 例 如 完 成 一 些 图 形 的 绘 制 最 重 要 的 是, 在 这 个 方 法 里 通 常 将 用 布 局 资 源 (layout resource) 调 用 setcontentview(int) 方 法 定 义 你 的 UI, 和 用 findviewbyid(int) 在 你 的 UI 中 检 索 你 需 要 编 程 地 交 互 的 小 部 件 (widgets) setcontentview 指 定 由 哪 个 文 件 指 定 布 局 (main.xml), 可 以 将 这 个 界 面 显 示 出 来, 然 后 进 行 相 关 操 作, 我 操 作 会 被 包 装 成 为 一 个 意 图, 然 后 这 个 意 图 对 应 有 相 关 的 activity 进 行 处 理 onpause(): 处 理 当 离 开 活 动 时 要 做 的 事 情 用 户 做 的 所 有 改 变 应 该 在 这 里 提 交 ( 通 常 ContentProvider 保 存 数 据 ) 33
程 序 说 明 导 入 类 android.app.activity 和 android.os.bundle,helloworld 类 继 承 自 Activity 且 重 写 了 oncreate 方 法 @Override 在 重 写 父 类 的 oncreate 时, 在 方 法 前 面 加 上 @Override 系 统 可 以 帮 你 检 查 方 法 的 正 确 性 例 如, public void oncreate(bundle savedinstancestate){.} 这 种 写 法 是 正 确 的, 若 写 成 public void oncreate(bundle savedinstancestate){.} 这 样 编 译 器 会 报 如 下 错 误 The method oncreate(bundle) of type HelloWorld must override or implement a supertype method, 以 确 保 正 确 重 写 oncreate 方 法 ( 因 为 oncreate 应 该 为 oncreate) 若 不 加 @Override, 则 编 译 器 将 不 会 检 测 出 错 误, 会 认 为 你 新 定 义 了 一 个 方 法 oncreate 34
Android SDK 目 录 结 构 D:\android-sdk-windows\platforms\android- 7\Android.jar 是 包 含 所 有 API 的 压 缩 包 ; add-ons:android 开 发 需 要 的 第 三 方 文 件 docs:android 的 文 档 包 括 开 发 指 南 API 等 Google Map 的 API extras: 附 件 文 档 platforms: 一 系 列 Android 平 台 版 本 ( 根 据 你 下 载 SDK 版 本 ) platform-tools: 开 发 工 具, 在 平 台 更 新 时 可 能 会 更 新 samples: 样 例 程 序 temp: 缓 存 目 录 tools: 独 立 于 Android 平 台 的 开 发 工 具
Android SDK 提 供 的 工 具 Android 模 拟 器 (Android Emulator) 集 成 开 发 环 境 插 件 (ADT) 调 试 监 视 服 务 (Dalvik Debug Monitor Service) Android 调 试 桥 (Android Debug Bridge) Android 资 源 打 包 工 具 (aapt.exe) Android 虚 拟 设 备 (Android Virtual Devices)
DDMS 全 称 是 Dalvik Debug Monitor Service DDMS 为 IDE 和 emultor 及 真 正 的 android 设 备 架 起 来 了 一 座 桥 梁,Android DDMS 将 捕 捉 到 终 端 的 ID, 并 通 过 adb 建 立 调 试 器, 从 而 实 现 发 送 指 令 到 测 试 终 端 的 目 的
相 关 文 件 类 型 说 明 Java 文 件 ---- 应 用 程 序 源 文 件 android 本 身 相 当 一 部 分 都 是 用 java 编 写 而 成 android 的 应 用 使 用 java 来 开 发 Class 文 件 ----Java 编 译 后 的 目 标 文 件 Google 使 用 Dalvik 来 运 行 应 用 程 序 Android 的 class 文 件 是 编 译 过 程 中 的 中 间 目 标 文 件, 需 要 链 接 成 dex 文 件 才 能 在 Dalvik 上 运 行
Dex File Dex 文 件 ----Android 平 台 上 的 可 执 行 文 件 Android 虚 拟 机 Dalvik 支 持 的 字 节 码 文 件 格 式 这 种 虚 拟 机 执 行 的 并 非 Java 字 节 码, 而 是 另 一 种 字 节 码 :dex 格 式 的 字 节 码
Apk 文 件 (Android Application Package) Apk 文 件 ----Android 上 的 安 装 文 件 Apk 是 Android 安 装 包 的 扩 展 名, 包 含 了 与 该 应 用 相 关 的 所 有 文 件 apk 文 件 将 AndroidManifest.xml 文 件 应 用 程 序 代 码 (.dex 文 件 ) 资 源 文 件 和 其 他 文 件 打 成 一 个 压 缩 包 一 个 工 程 只 能 打 进 一 个.apk 文 件 apk 文 件 的 本 质 是 一 个 zip 包
Apk 文 件 (Android Application Package) Android 应 用 采 用 Java 程 序 编 写 ; Android 的 应 用 采 用 aapt 工 具 进 行 打 包, 形 成.apk 文 件 ;.apk Java Code Data Files Resources Files res/layout: declaration layout files res/drawable: intended for drawing res/admin: bitmaps, animations for transitions res/values: externalized values strings, colors, styles, etc res/xml: general XML files used at runtime res/raw: binary files (e.g. sound)
命 令 行 操 作 启 动 Eclipse, 然 后 在 启 动 模 拟 器, 这 样 不 但 浪 费 时 间, 而 且 Eclipse 又 占 用 内 存, 如 何 不 用 启 动 Eclipse 就 可 以 使 用 模 拟 器? 有 两 种 方 法 1. 设 置 环 境 变 量.( 类 似 设 置 java 路 径 ); 2. 直 接 进 入 你 SDK 里 tools 目 录 (cd:sdkpath/tools)
命 令 行 操 作 android: 输 入 android 就 会 启 动 Android SDK and AVD manager 可 以 更 新 SDK, 增 删 修 改 AVD.
命 令 行 运 行 android list targets: 列 出 所 有 的 SDK 可 用 版 本 emulator -avd *** 启 动 模 拟 器 adb install XXX.apk. 安 装 apk 文 件, 若 有 多 个 设 备 ( 而 你 想 把 apk 安 装 到 emulator-5554 这 个 模 拟 器 上 ) 则 要 输 入 :adb install -s emulator-5554 D:/XXX.apk.
AAPT Android Asset Packaging Tool, 该 工 具 包 含 在 SDK 的 tools/ 目 录 下 查 看 创 建 更 新 与 zip 兼 容 的 归 档 文 件 (zip jar apk) 也 能 将 资 源 文 件 编 译 成 二 进 制 包 在 构 建 脚 本 (build scripts) 和 IDE 插 件 会 使 用 该 工 具 打 包 apk 文 件, 构 成 一 个 Android 应 用 程 序 在 终 端 模 式 下, 进 入 tools/ 目 录 下, 运 行 命 令 : Linux 或 Mac 操 作 系 统 :./aapt Windows:aapt.exe 注 意 :tools/ 目 录 是 指 android SDK 目 录 下 的 /platforms/android-x/tools/ 45
新 建 工 程 选 择 File->New->Project, 会 弹 出 New Project 对 话 视 窗 Eclipse 是 通 用 的 编 辑 环 境, 可 根 据 所 安 装 的 不 同 扩 充 套 件 而 支 持 许 多 种 类 的 工 程 46
导 入 工 程 若 程 序 工 程 已 位 于 工 作 环 境 (WorkSpace) 文 件 夹 下, 需 要 通 过 导 入 工 程 的 方 法 分 别 选 择 File->Import 选 项, 会 跳 出 Import 视 窗 选 择 General- >Existing Projects into WorkSpace 项 目, 然 后 按 下 Next 按 钮 带 到 新 一 个 画 面 在 Select Root Directory 栏 位 旁, 按 下 右 方 的 Browse... 按 钮, 选 择 对 应 的 工 程 选 择 好 后, 按 下 Finish 按 钮 完 成 从 现 存 在 工 作 环 境 (WorkSpace) 资 料 夹 下 的 工 程 汇 入 到 Eclipse 环 境 的 动 作 47
其 他 Ctrl+F11, 切 换 模 拟 器 方 向? 如 果 横 向 模 式 ( 宽 屏 幕 ), 原 有 的 布 局 显 示 效 果 不 好, 这 时 怎 么 办? 48
其 他 创 建 一 个 名 为 /res/layout-land/activity main.xml 49
运 行 效 果 如 何 修 改 文 字 的 内 容? 修 改 文 字 的 颜 色? 如 何 换 一 个 图 片? 50
其 他 Layout/Activity_main.xml <TextView android:id="@+id/textview1" style="@style/codefont" android:text="@string/hello_world" /> Manifest.xml <activity android:label="@string/app_name" android:theme="@android:style/theme.black.notitlebar" > </activity> Values/styles.xml <?xml version="1.0" encoding="utf-8"?> <resources> <style name="codefont" parent="@android:style/textappearance.medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textcolor">#00ff00</item> <item name="android:typeface">monospace</item> </style> </resources> 可 参 考 :http://developer.android.com/guide/topics/ui/themes.html 51
Questions?