活动介绍

搭建Android开发环境全攻略

立即解锁
发布时间: 2025-08-26 01:05:14 阅读量: 2 订阅数: 6
PDF

深入解析Android 3开发与实践

### 搭建 Android 开发环境全攻略 在当今的移动应用开发领域,Android 平台占据着重要的地位。想要开启 Android 应用开发之旅,首先需要搭建一个合适的开发环境。本文将详细介绍如何搭建 Android 开发环境,以及相关的基础知识和实践操作。 #### 1. 开发环境搭建所需工具 要构建 Android 应用,你需要以下几个关键工具: - **Java SE 开发工具包(JDK)**:Android SDK 需要 JDK 5 或更高版本,示例中使用的是 JDK 6。 - **Android SDK**:包含基础工具和各种平台及附加组件包。 - **开发环境**:这里我们选择常用的 Eclipse IDE,并配合 Android 开发工具(ADT)插件使用。 #### 2. 具体工具下载与配置 ##### 2.1 下载 JDK 6 不同操作系统下载和安装 JDK 6 的方式有所不同: - **Windows**:从 Oracle 网站(www.oracle.com/technetwork/java/javase/downloads/index.html)下载 JDK 6 并安装,只需 JDK,无需捆绑包。 - **Mac OS X**:从 Apple 网站(http://developer.apple.com/java/download/)下载,需免费注册为 Apple 开发者,选择适合自己 Mac OS 版本的文件进行安装。 - **Linux(以 Ubuntu 为例)**:打开终端,尝试执行以下命令: ```bash sudo apt-get install sun-java6-jdk ``` 如果安装失败,可能需要添加新的软件源,参考网页(https://help.ubuntu.com/community/Repositories/Ubuntu),添加完成后重试该命令。从 Ubuntu 10.04 开始,也可使用 OpenJDK,执行以下命令: ```bash sudo apt-get install openjdk-6-jdk ``` 若未找到该包,同样设置第三方软件源后再次运行命令。可以同时安装 OpenJDK 和 Oracle/Sun JDK,在 Ubuntu 上切换活动 Java 版本,可在 shell 提示符下运行: ```bash sudo update-alternatives --config java ``` 然后选择想要作为默认的 Java 版本。 安装完 JDK 后,需要设置 `JAVA_HOME` 环境变量: - **Windows XP**:点击“开始” -> “我的电脑”,右键选择“属性”,选择“高级”选项卡,点击“环境变量”,点击“新建”添加变量,或“编辑”修改已有变量,`JAVA_HOME` 的值类似 `C:\Program Files\Java\jdk1.6.0_23`。 - **Windows Vista 和 Windows 7**:点击“开始” -> “计算机”,右键选择“属性”,点击“高级系统设置”链接,再点击“环境变量”,后续操作与 Windows XP 相同。 - **Mac OS X**:在主目录的 `.profile` 文件中添加如下内容: ```bash export JAVA_HOME=path_to_JDK_directory ``` `path_to_JDK_directory` 通常为 `/Library/Java/Home`。 - **Linux**:编辑 `.profile` 文件,添加类似 Mac OS X 的内容,Java 路径可能为 `/usr/lib/jvm/java-6-sun` 或 `/usr/lib/jvm/java-6-openjdk`,也可以使用 `.bashrc` 文件。 ##### 2.2 下载 Eclipse 3.6 从 `www.eclipse.org/downloads/` 下载 Eclipse IDE for Java Developers(无需 Java EE 版),示例中使用的是 Windows 环境下的 Eclipse 3.6。Eclipse 发行版是一个 `.zip` 文件,可以解压到任意位置: - **Windows**:解压到 `C:\`,会生成一个 `C:\eclipse` 文件夹,其中包含 `eclipse.exe`。 - **Mac OS X**:解压到 `Applications` 文件夹。 - **Linux**:可以解压到主目录,或让管理员将 Eclipse 放在公共位置。 首次启动 Eclipse 时,会要求选择工作区位置,为方便起见,可以选择简单的位置,如 `C:\android` 或主目录下的某个目录。如果与他人共享计算机,应将工作区文件夹放在主目录下。 ##### 2.3 下载 Android SDK 从 `http://developer.android.com/sdk` 下载 Android SDK,它是一个 `.zip` 文件,解压到合适的位置: - **Windows**:解压到方便的位置,如 `C:` 盘,会生成一个类似 `C:\android-sdk-windows` 的文件夹。 - **Mac OS X 和 Linux**:解压到主目录。Mac OS X 和 Linux 没有 SDK Manager 可执行文件,可运行 `tools/android` 程序来替代。 也可以(仅适用于 Windows)下载安装程序 EXE 而不是 zip 文件,运行安装程序会检查 Java JDK,解压缩嵌入式文件,并运行 SDK Manager 程序帮助完成后续下载。 安装完 Android SDK 后,需要下载所需的平台和附加组件包。启动 SDK Manager,选择“可用包”,选择 `https://dl-ssl.google.com/android/repository/repository.xml` 源,选择所需的平台和附加组件,如 Android 2.3,必须添加 Android SDK platform-tools 才能使环境正常工作,建议至少添加 Android 1.6 平台。点击“安装选定项”,接受每个要安装的项目,然后点击“安装接受项”,Android 会下载并使这些包和平台可用。 ##### 2.4 更新 PATH 环境变量 需要将 Android SDK 的 `tools` 目录和刚安装的 `platform-tools` 目录添加到 `PATH` 环境变量中,同时添加 JDK 的 `bin` 目录: - **Windows**:回到“环境变量”窗口,编辑 `PATH` 变量,在末尾添加分号 `;`,然后依次添加 Android SDK `tools` 文件夹路径、分号、Android SDK `platform-tools` 文件夹路径、分号,最后添加 `%JAVA_HOME%\bin`,完成后点击“确定”。 - **Mac OS X 和 Linux**:编辑 `.profile` 文件,将 Android SDK `tools` 目录路径、Android SDK `platform-tools` 目录和 `$JAVA_HOME/bin` 目录添加到 `PATH` 变量中,例如在 Linux 中可以这样设置: ```bash export PATH=$PATH:$HOME/android-sdk-linux_x86/tools:$HOME/android-sdk-linux_x86/platform-tools:$JAVA_HOME/bin ``` 确保路径组件对于你的特定设置是正确的。 ##### 2.5 安装 Android 开发工具(ADT) ADT 是一个 Eclipse 插件,可帮助你使用 Eclipse IDE 构建 Android 应用。启动 Eclipse IDE,按以下步骤安装: 1. 选择“帮助”菜单,选择“安装新软件…”选项(在早期版本的 Eclipse 中称为“软件更新”)。 2. 在“使用”字段中输入 `https://dl-ssl.google.com/android/eclipse/` 并按回车键,Eclipse 会连接该站点并填充列表。 3. 你会看到一个名为“开发工具”的条目,包含三个子节点:Android DDMS、Android 开发工具和 Android 层次结构查看器。选择父节点“开发工具”,确保子节点也被选中,然后点击“下一步”。 4. Eclipse 会要求验证要安装的工具,再次点击“下一步”。 5. 你将被要求查看 ADT 以及安装 ADT 所需工具的许可证,查看许可证,点击“我接受...”,然后点击“完成”。 Eclipse 会下载并安装开发工具,安装完成后需要重启 Eclipse 以使新插件在 IDE 中显示。如果 Eclipse 中已有旧版本的 ADT,可前往 Eclipse“帮助”菜单,选择“检查更新”,按照安装说明从步骤 3 开始操作。 最后,要让 ADT 在 Eclipse 中正常工作,需要将其指向 Android SDK。在 Eclipse 中,选择“窗口”菜单,选择“首选项”(在 Mac OS X 中,“首选项”在 Eclipse 菜单下)。在“首选项”对话框中,选择“Android”节点,将“SDK 位置”字段设置为 Android SDK 的路径,然后点击“应用”按钮。可能会弹出一个对话框询问是否要向 Google 发送有关 Android SDK 的使用统计信息,可自行决定。点击“确定”关闭“首选项”窗口。 #### 3. Android 应用基础组件 在开始编写 Android 应用之前,需要了解一些基本的组件概念: - **视图(View)**:是用户界面(UI)元素,是用户界面的基本构建块,如按钮、标签、文本字段等。视图也可作为视图的容器,UI 中通常存在视图层次结构。 - **活动(Activity)**:是一个用户界面概念,通常代表应用中的一个屏幕,一般包含一个或多个视图,但不是必需的。活动帮助用户完成一件事情,如查看数据、创建数据或编辑数据。大多数 Android 应用包含多个活动。 - **意图(Intent)**:通用地定义了执行某项工作的“意图”,封装了多个概念。可用于广播消息、启动服务、启动活动、显示网页或联系人列表、拨打电话或接听电话等。意图可以是显式的或隐式的,松散地耦合了动作和动作处理程序。 - **内容提供者(Content Provider)**:Android 定义了一种标准机制,用于应用之间共享数据(如联系人列表),而不暴露底层存储、结构和实现。通过内容提供者,你可以暴露自己的数据,并使用其他应用的数据。 - **服务(Service)**:类似于 Windows 或其他平台上的服务,是可以长时间运行的后台进程。Android 定义了两种类型的服务:本地服务和远程服务。本地服务只能由托管该服务的应用访问,远程服务可以被设备上的其他应用远程访问。 - **AndroidManifest.xml**:类似于 J2EE 世界中的 `web.xml` 文件,定义了应用的内容和行为,列出了应用的活动、服务、权限和功能等信息。 #### 4. 第一个 Android 应用 - “Hello World!” 现在可以开始构建第一个 Android 应用 - “Hello World!” 程序,按以下步骤创建应用骨架: 1. 启动 Eclipse,选择“文件” -> “新建” -> “项目”。在“新建项目”对话框中,选择“Android”,然后点击“下一步”,会看到“新建 Android 项目”对话框。 2. 输入项目名称为 `HelloAndroid`,该名称用于区分 Eclipse 中的其他项目,项目的默认位置将从 Eclipse 工作区位置派生。 3. 暂时不修改“内容”部分,因为要在工作区的默认位置创建新项目。 4. 对于“构建目标”,勾选 Android 1.6,这将是应用的基础 Android 版本,虽然应用可以在更高版本上运行,但 Android 1.6 具有所需的所有功能,选择较低版本可以使更多设备运行该应用。 5. 输入应用名称为 `Hello Android`,该名称将显示在应用图标、应用标题栏和应用列表中,应具有描述性但不宜过长。 6. 使用 `com.androidbook.hello` 作为包名,应用必须有一个基础包名,该包名将作为应用的标识符,必须在所有应用中唯一。建议以自己拥有的域名开头,避免使用以 `com.google`、`com.android`、`android` 或 `com.example` 开头的包名,因为这些是 Google 限制的,无法将应用上传到 Android 市场。 7. 输入“创建活动”名称为 `HelloActivity`,这告诉 Android 应用启动时应启动该活动,应用中可以有其他活动,但这是用户启动应用时首先看到的活动。 8. “最低 SDK 版本”值为 4 表示应用需要 Android 1.6 或更高版本。通常,最低 SDK 版本号应与构建目标版本号匹配。 9. 点击“完成”按钮,ADT 将为你生成项目骨架。打开 `src` 文件夹下的 `HelloActivity.java` 文件,修改 `onCreate()` 方法如下: ```java /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** create a TextView and write Hello World! */ TextView tv = new TextView(this); tv.setText("Hello World!"); /** set the content view to the TextView */ setContentView(tv); } ``` 可能需要添加 `import android.widget.TextView;` 语句以消除 Eclipse 报告的错误,保存 `HelloActivity.java` 文件。 要运行应用,需要创建一个 Eclipse 启动配置,并需要一个虚拟设备来运行它。按以下步骤创建 Eclipse 启动配置: 1. 选择主“运行”菜单,然后选择“运行配置”菜单项。 2. 在“运行配置”对话框中,双击左侧窗格中的“Android 应用程序”,向导将插入一个名为“新配置”的新配置。 3. 将配置重命名为 `RunHelloWorld`。 4. 点击“浏览”按钮,选择 `HelloAndroid` 项目。 5. 在“启动操作”下,选择“启动:”,并从下拉列表中选择 `com.androidbook.hello.HelloActivity`。 6. 点击“应用”,然后点击“运行”。Eclipse 准备运行应用,但需要一个设备来运行它,会弹出一个警告,提示未找到兼容的目标,并询问是否要创建一个,点击“是”。 7. 会显示一个显示现有 AVD 的窗口,点击“新建”按钮添加一个适合新应用的 AVD。 8. 填写“创建 AVD”表单,设置名称为 `Gingerbread`,选择“目标”为 Android 2.3 - API Level 9(或其他版本),设置 SD 卡大小为 10(即 10MB),启用快照,选择皮肤为 HVGA,然后点击“创建 AVD”。管理器可能会确认 AVD 创建成功,点击右上角的“X”关闭 Android SDK 和 AVD 管理器窗口。 9. 最后,从底部列表中选择新创建的 AVD,可能需要点击“刷新”按钮使新 AVD 显示在列表中,点击“确定”按钮。 10. Eclipse 将启动模拟器并运行你的第一个 Android 应用。 模拟器启动设备启动过程可能需要一些时间,启动完成后通常会看到一个锁定屏幕,按“菜单”按钮或拖动解锁图像来解锁 AVD。解锁后,应该会看到 `HelloAndroidApp` 在模拟器中运行。需要注意的是,模拟器在启动过程中会在后台启动其他应用,可能会不时看到警告或错误消息,一般可以忽略这些消息,让模拟器继续启动过程。 #### 5. Android 虚拟设备(AVD) AVD 代表设备配置,你可以创建不同配置的 AVD 来模拟不同类型的真实设备。在开发和测试应用时,指定(和更改)使用哪个 AVD 非常容易,方便进行各种配置的测试。 前面介绍了如何使用 Eclipse 创建 AVD,也可以使用命令行创建 AVD。使用 `tools` 目录下名为 `android` 的批处理文件(如 `c:\android-sdk-windows\tools\`),`android` 允许你创建新的 AVD 并管理现有 AVD,例如查看现有 AVD、移动 AVD 等。可以运行 `android –help` 查看可用选项。 默认情况下,AVD 存储在主目录下的 `.android\AVD` 文件夹中。如果为“Hello World!” 应用创建了 AVD,可以在此处找到它。也可以将 AVD 存储或操作到其他位置。例如,创建一个文件夹(如 `c:\avd\`)来存储 AVD 图像。下一步是在工具窗口中使用以下命令列出可用的 Android 目标: ```bash android list target ``` 该命令的输出是所有已安装 Android 版本的列表,每个项目都有一个 ID。然后运行 `android` 文件来创建 AVD,在工具窗口中输入以下命令(根据工作站的情况使用适当的路径来存储 AVD 文件,并根据安装的 SDK 平台目标使用适当的 `-t ID` 参数值): ```bash android create avd -n CupcakeMaps -t 2 -c 16M -p c:\avd\CupcakeMaps\ ``` 传递给批处理文件的参数如下表所示: | 参数/命令 | 描述 | | --- | --- | | create avd | 告诉工具创建一个 AVD | | -n | AVD 的名称 | | -t | 目标运行时 ID,使用 `android list target` 命令获取每个已安装目标的 ID | | -c | SD 卡的大小(字节),使用 K 表示千字节,M 表示兆字节 | | -p | 生成的 AVD 的路径,可选 | | -A | 启用快照,可选,在“启动模拟器”部分会详细解释快照 | 执行上述命令将生成一个 AVD,运行 `create avd` 命令时,会询问是否要创建自定义硬件配置文件,目前回答“否”,但要知道回答“是”将提示你配置 AVD 的许多选项,如屏幕尺寸、摄像头的存在等。 即使使用 `android.bat` 程序指定了 `CupcakeMaps` 的替代位置,主目录的 `.android/AVD` 文件夹下仍会有一个 `CupcakeMaps.ini` 文件。这是好事,因为回到 Eclipse 并选择“窗口” -> “Android SDK 和 AVD 管理器”时,你将看到所有的 AVD,在运行 Android 应用时可以访问任何一个。 每个 Android 版本都有一个 API 级别,如 Android 1.6 的 API 级别为 4,Android 2.1 的 API 级别为 7,但这些 API 级别数字与 `android create avd` 命令中 `-t` 参数使用的目标 ID 不对应,始终需要使用 `android list target` 命令来获取 `android create avd` 命令的适当目标 ID 值。 另外,从 SDK 目标列表中选择 Google API 将在 AVD 中包含地图功能,而选择 Android 1.5 或更高版本则不会。 #### 6. Android 应用结构探索 尽管 Android 应用的大小和复杂性可能差异很大,但它们的结构是相似的。以“Hello World!” 应用为例,其结构主要由以下几个部分组成: | 工件 | 描述 | 是否必需 | | --- | --- | --- | | AndroidManifest.xml | Android 应用描述文件,定义应用的活动、内容提供者、服务和意图接收器等,还可以声明性地定义应用所需的权限,并向使用该应用服务的其他应用授予特定权限,还可以包含用于测试应用或其他应用的仪器细节 | 是 | | src | 包含应用所有源代码的文件夹 | 是 | | assets | 任意的文件夹和文件集合 | 否 | | res | 包含应用资源的文件夹,是 `drawable`、`anim`、`layout`、`menu`、`values`、`xml` 和 `raw` 的父文件夹 | 是 | | drawable | 包含应用使用的图像或图像描述文件的文件夹 | 否 | | anim | 包含描述应用使用的动画的 XML 描述文件的文件夹 | 否 | | layout | 包含应用视图的文件夹,建议使用 XML 描述符来创建应用的视图,而不是通过编码 | 否 | | menu | 包含应用中菜单的 XML 描述文件的文件夹 | 否 | | values | 包含应用使用的其他资源的文件夹,如字符串、数组、样式和颜色等 | 否 | | xml | 包含应用使用的其他 XML 文件的文件夹 | 否 | | raw | 包含应用所需的其他数据(可能是非 XML 数据)的文件夹 | 否 | 可以看出,Android 应用主要由三部分组成:应用描述符、各种资源集合和应用源代码。如果暂时不考虑 `AndroidManifest.xml` 文件,可以简单地将 Android 应用看作:代码中实现了一些业务逻辑,其他一切都是资源。这种基本结构类似于 J2EE 应用,资源类似于 JSP,业务逻辑类似于 Servlet,`AndroidManifest.xml` 文件类似于 `web.xml` 文件。 J2EE 构建视图的理念是使用标记语言,Android 也采用了这种方法,不过 Android 中的标记是 XML。这种方法的好处是不需要硬编码应用的视图,可以通过编辑标记来修改应用的外观和感觉。 需要注意的是,Android 在 `res` 下的预定义文件夹中只支持线性文件列表,例如不支持 `layout` 文件夹(或 `res` 下的其他文件夹)中的嵌套文件夹。`assets` 文件夹和 `res` 下的 `raw` 文件夹有一些相似之处,两个文件夹都可以包含原始文件,但 `raw` 中的文件被视为资源,而 `assets` 中的文件不是。因此,`raw` 中的文件将被本地化,可通过资源 ID 访问等,而 `assets` 文件夹的内容被视为通用内容,可在没有资源约束和支持的情况下使用。由于 `assets` 文件夹的内容不被视为资源,可以在其中放置任意的文件夹和文件层次结构。 另外,你可能会注意到 Android 大量使用了 XML,虽然 XML 是一种臃肿的数据格式,但在开发过程中创建的 XML 实际上会使用 Android 资产打包工具(AAPT)编译为二进制文件。因此,当应用安装在设备上时,设备上的文件以二进制形式存储。在运行时需要文件时,以二进制形式读取文件,而不会转换回 XML,这样既可以使用 XML 进行开发,又不用担心占用设备上的宝贵资源。 通过以上步骤,你已经成功搭建了 Android 开发环境,了解了 Android 应用的基本组件和结构,并创建了第一个 Android 应用。接下来可以进一步深入学习 Android 开发的更多知识,如资源管理、应用生命周期管理和调试技巧等。 ### 搭建 Android 开发环境全攻略 #### 7. 分析记事本应用 在了解了如何创建新的 Android 应用并在模拟器中运行,以及熟悉了 Android 应用的结构后,接下来分析 Android SDK 自带的记事本应用。该应用的复杂度介于“Hello World!” 应用和完整的 Android 应用之间,分析其组件可以让你对 Android 开发有更实际的了解。 ##### 7.1 加载和运行记事本应用 按照以下步骤将记事本应用加载到 Eclipse IDE 并在模拟器中运行: 1. 启动 Eclipse。 2. 选择“文件” -> “新建” -> “项目”。 3. 在“新建项目”对话框中,选择“Android” -> “Android 项目”。 4. 在“新建 Android 项目”对话框中,输入项目名称为 `NotesList`,选择“从现有示例创建项目”,然后选择构建目标为 Android 1.6。在“示例”菜单中,向下滚动找到记事本应用。记事本应用位于之前下载的 Android SDK 的 `platforms\android - 1.6\samples` 文件夹中。选择记事本应用后,对话框会读取 `AndroidManifest.xml` 文件并预填充“新建 Android 项目”对话框中的其余字段。 5. 点击“完成”按钮。 此时,你应该在 Eclipse IDE 中看到 `NotesList` 应用。如果 Eclipse 中对此项目报告任何问题,可以尝试使用 Eclipse 中“项目”菜单的“清理”选项来清除它们。要运行应用,可以创建一个启动配置(如为“Hello World!” 应用所做的那样),也可以右键单击项目,选择“运行方式”,然后选择“Android 应用程序”。这将启动模拟器并在其上安装应用。模拟器加载完成后,解锁模拟器屏幕,即可看到新的 `NotesList` 应用。可以花几分钟时间使用该应用以熟悉它。 ##### 7.2 剖析应用 记事本应用包含多个 `.java` 文件、几个 `.png` 图像、三个视图(在 `layout` 文件夹下)和 `AndroidManifest.xml` 文件。在 Android 中,没有像命令行应用那样的 `Main` 方法,而是定义了一个入口点活动,也称为顶级活动。 在 `AndroidManifest.xml` 文件中,可以找到一个内容提供者和三个活动。`NotesList` 活动为动作 `android.intent.action.MAIN` 和类别 `android.intent.category.LAUNCHER` 定义了一个意图过滤器。当 Android 应用被要求运行时,宿主会加载应用并读取 `AndroidManifest.xml` 文件,然后查找并启动具有 `MAIN` 动作和 `LAUNCHER` 类别的意图过滤器的活动: ```xml <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> ``` 宿主找到要运行的活动后,需要将定义的活动解析为实际的类。通过结合根包名和活动名,在本例中为 `com.example.android.notepad.NotesList`。 活动通常通过意图启动,一个活动可以启动另一个活动。`onCreate()` 方法会检查当前活动的意图是否有数据(笔记),如果没有,则在意图上设置 URI 以检索数据。在 Android 中,通过内容提供者操作 URI 来访问数据,在本例中,URI 提供了从数据库检索数据的足够信息。`Notes.CONTENT_URI` 常量在 `Notepad.java` 中定义为静态常量: ```java public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/notes"); ``` 如果 URI 类似 `Uri.parse("content://" + AUTHORITY + "/notes/11");`,则内容提供者将返回 ID 等于 11 的笔记。 `NotesList` 类继承自 `ListActivity` 类,用于显示列表数据。列表项由内部的 `ListView`(一个 UI 组件)管理,显示列表中的笔记。设置活动意图上的 URI 后,活动会注册为笔记构建上下文菜单。根据选择的不同,会显示上下文相关的菜单项,例如选择现有笔记时,应用会显示“编辑笔记”和“编辑标题”;如果未选择笔记,则显示“添加笔记”选项。 接下来,活动执行一个托管查询并获取结果的游标。托管查询意味着 Android 将管理返回的游标,在应用需要卸载或重新加载时,应用和活动都无需担心游标的定位、加载或卸载。`managedQuery()` 方法的参数如下表所示: | 参数 | 数据类型 | 描述 | | --- | --- | --- | | URI | Uri | 内容提供者的 URI | | projection | String[] | 要返回的列(列名) | | selection | String | 可选的 where 子句 | | selectionArgs | String[] | 查询中包含 `?` 时的参数 | | sortOrder | String | 结果集的排序顺序 | 查询执行后,返回的游标会传递给 `SimpleCursorAdapter` 的构造函数,该适配器将数据集中的记录适配到用户界面(`ListView`)中的项。注意 `SimpleCursorAdapter` 构造函数的第二个参数,它是表示 `ListView` 中项的视图的标识符。Android 提供了一个自动生成的实用类 `R` 类(`R.java`),它提供了对项目中资源的引用。编译项目时,AAPT 会根据 `res` 文件夹中定义的资源生成 `R` 类。例如,可以将所有字符串资源放在 `values` 文件夹中,AAPT 会为每个字符串生成一个公共静态标识符。使用这个实用类的好处是无需硬编码资源,并且可以进行编译时引用检查。 `NotesList` 的 `onListItemClick()` 方法在用户在 UI 中选择笔记时被调用,实现了两个用例: ```java @Override protected void onListItemClick(ListView l, View v, int position, long id) { Uri uri = ContentUris.withAppendedId(getIntent().getData(), id); String action = getIntent().getAction(); if (Intent.ACTION_PICK.equals(action) || Intent.ACTION_GET_CONTENT.equals(action)) { setResult(RESULT_OK, new Intent().setData(uri)); } else { startActivity(new Intent(Intent.ACTION_EDIT, uri)); } } ``` 在第一个用例中,笔记列表活动可能通过意图被调用,以便用户可以选择一个特定的笔记并返回给调用活动;在第二个用例中,用户只是查看笔记列表,选择笔记后,当前活动将对所选笔记调用编辑活动。选择笔记时,该方法通过获取基础 URI 并附加所选笔记的 ID 来创建一个 URI。如果活动是通过意图被调用以选择笔记或获取笔记内容,则调用 `setResult()` 方法将所选笔记的 URI 返回给调用者;如果是第二个用例,则将 URI 传递给 `startActivity()` 方法。`startActivity()` 方法用于启动一个活动,但不会报告活动完成后的结果;另一种启动活动的方法是使用 `startActivityForResult()`,可以在活动完成时通过回调获得通知并获取结果。 活动有一个定义好的生命周期,它们保存在活动栈中,运行的活动位于栈顶。如果运行的活动启动另一个活动,第一个运行的活动会向下移动到栈中,新活动会放在栈顶。栈中较低的活动可能处于暂停或停止状态,暂停的活动部分或完全可见,停止的活动不可见。系统在认为需要资源时可以杀死暂停或停止的活动。 用户创建的笔记会保存到设备上的实际数据库中,记事本应用的后端存储是一个 SQLite 数据库。前面讨论的 `managedQuery()` 方法最终通过内容提供者解析为数据库中的数据。`NotePadProvider` 类继承自 `ContentProvider` 类,定义了六个抽象方法,其中四个是 CRUD(创建、读取、更新、删除)操作,另外两个是 `onCreate()` 和 `getType()`。`NotePadProvider` 类中的内部 `DatabaseHelper` 类继承自 `SQLiteOpenHelper` 类,负责初始化记事本数据库、打开和关闭数据库以及执行其他数据库任务。 例如,`DatabaseHelper` 类的 `onCreate()` 方法创建记事本表: ```java private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME + " (" + Notes._ID + " INTEGER PRIMARY KEY," + Notes.TITLE + " TEXT," + Notes.NOTE + " TEXT," + Notes.CREATED_DATE + " INTEGER," + Notes.MODIFIED_DATE + " INTEGER" + ");"); } //… } ``` `insert()` 方法使用其内部的 `DatabaseHelper` 实例访问数据库并插入笔记记录,返回的行 ID 会附加到 URI 上并返回一个新的 URI 给调用者: ```java SQLiteDatabase db = mOpenHelper.getWritableDatabase(); long rowId = db.insert(NOTES_TABLE_NAME, Notes.NOTE, values); if (rowId > 0) { Uri noteUri = ContentUris.withAppendedId( NotePad.Notes.CONTENT_URI, rowId); getContext().getContentResolver().notifyChange(noteUri, null); return noteUri; } ``` #### 8. 检查应用生命周期 Android 应用的生命周期由系统严格管理,系统会根据用户需求、可用资源等因素决定是否加载、暂停或停止应用。与 J2EE 应用不同,J2EE 应用由运行它的容器松散管理,容器通常不会根据负载和可用资源将应用移入或移出内存,而 Android 资源更有限,因此需要对应用有更多的控制。 Android 为每个应用运行在单独的进程中,每个进程都有自己的虚拟机,这提供了一个受保护的内存环境。通过将应用隔离到单独的进程中,系统可以控制哪个应用应该获得更高的优先级,例如,一个进行 CPU 密集型任务的后台进程不会阻塞来电。 Android 应用架构以组件和集成为导向,这虽然提供了丰富的用户体验、无缝的重用和轻松的应用集成,但给应用生命周期管理器带来了复杂的任务。例如,用户在打电话时需要打开电子邮件消息,从主屏幕打开邮件应用,打开电子邮件消息,点击邮件中的链接,从网页读取股票报价来回答朋友的问题。这个场景需要四个应用:主屏幕应用、通话应用、电子邮件应用和浏览器应用。用户在应用之间导航时体验是无缝的,但在后台,系统会保存和恢复应用状态。 为了构建稳定的应用,需要理解和处理生命周期事件。Android 应用及其组件的进程会经历各种生命周期事件,Android 提供了回调函数来处理状态变化。活动的生命周期回调方法如下: ```java protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); ``` 系统根据情况启动和停止活动。`onCreate()` 方法在活动首次创建时调用,之后总是调用 `onStart()` 方法,但 `onStart()` 方法不一定在 `onCreate()` 方法之后调用,因为当应用停止后再次启动时也会调用 `onStart()` 方法。`onStart()` 方法调用时,活动对用户不可见,但即将可见。`onResume()` 方法在 `onStart()` 方法之后调用,此时活动位于前台,用户可以与之交互。 当用户决定切换到另一个活动时,系统会调用当前活动的 `onPause()` 方法。从 `onPause()` 方法开始,可能会调用 `onResume()` 或 `onStop()` 方法。例如,如果用户将活动带回前台,则调用 `onResume()` 方法;如果活动对用户不可见,则调用 `onStop()` 方法。如果活动在调用 `onStop()` 方法后被带回前台,则会调用 `onRestart()` 方法。如果活动位于活动栈中但对用户不可见,并且系统决定杀死该活动,则会调用 `onDestroy()` 方法。 通常,你主要需要处理 `onCreate()`、`onResume()` 和 `onPause()` 方法。在 `onCreate()` 方法中创建活动的用户界面,绑定数据到小部件并为 UI 组件连接事件处理程序;在 `onPause()` 方法中,将关键数据持久化到应用的数据存储中,因为这是系统杀死应用前最后一个安全调用的方法。`onStop()` 和 `onDestroy()` 方法不一定会被调用,因此不要依赖这些方法进行关键逻辑处理。 可以通过扩展 `android.app.Application` 类来共享全局变量,在 `onCreate()` 方法中初始化全局变量,应用中的活动和其他组件在执行时可以自信地访问这些引用: ```java public class MyApplication extends Application { // global variable private static final String myGlobalVariable; @Override public void onCreate() { super.onCreate(); //... initialize global variables here myGlobalVariable = loadCacheData(); } public static String getMyGlobalVariable() { return myGlobalVariable; } } ``` #### 9. 调试你的应用 在编写第一个应用的几行代码后,你可能会想是否可以在与应用交互时进行调试会话,答案是肯定的。Android SDK 包含了许多用于调试的工具,这些工具与 Eclipse IDE 集成。 ##### 9.1 LogCat LogCat 是一个在 Android 开发中常用的工具,它显示使用 `android.util.Log` 发出的日志消息、异常、`System.out.println` 等内容。虽然 `System.out.println` 可以工作并且消息会显示在 LogCat 窗口中,但建议使用 `android.util.Log` 类来记录应用的消息。例如: ```java Log.v("string TAG", "This is my verbose message to write to the log"); ``` LogCat 的优点是可以在模拟器中运行应用时查看日志消息,也可以在将真实设备连接到工作站并处于调试模式时查看日志消息。即使设备在记录日志消息时已断开连接,也可以检索最新的消息。 在真实设备上调试应用需要注意两点:一是应用必须在 `AndroidManifest.xml` 文件中设置为可调试,即添加 `android:debuggable="true"` 到 `<application>` 标签;二是设备必须进入 USB 调试模式,通过设备的“设置”屏幕,选择“应用程序”,然后选择“开发”,确保“启用 USB 调试”被选中。 ##### 9.2 DDMS 和 Debug 视角 DDMS(Dalvik 调试监控服务器)视角可以让你深入了解在模拟器或设备上运行的应用、应用内的线程、应用内的堆(或内存),还有文件浏览器和模拟器控制器,可以模拟 GPS 事件、来电或短信消息等。文件浏览器允许你浏览设备上的文件系统,甚至可以在设备(或模拟器)和工作站之间推送或拉取文件。还可以强制进行垃圾回收、杀死应用和抓取屏幕截图。 从 DDMS 中可以选择一个正在运行的应用并连接进行调试,这将进入 Debug 视角。也可以在 Java 视角中右键单击应用,选择“调试方式” -> “Android 应用程序”,同样会进入 Debug 视角。Eclipse 提供了跟踪线程、设置和清除断点、检查变量以及单步执行语句等功能。 可以通过在 Eclipse 中选择 DDMS 或 Debug 视角来查看这些工具,也可以通过“窗口” -> “显示视图” -> “其他” -> “Android” 来启动每个工具。 ##### 9.3 详细跟踪信息 可以使用 `android.os.Debug` 类获取 Android 应用的详细跟踪信息,该类提供了开始跟踪方法 `Debug.startMethodTracing(“basename”)` 和停止跟踪方法 `Debug.stopMethodTracing()`。Android 会在设备(或模拟器)的 SD 卡上创建一个名为 `basename.trace` 的跟踪文件,可以将该文件复制到工作站,使用 Android SDK 工具目录中的 `traceview` 工具查看跟踪器输出,只需将跟踪文件名作为 `traceview` 的唯一参数。 ##### 9.4 其他调试工具 - **Android 调试桥(adb)**:允许安装、更新和删除应用程序,可以在模拟器或设备上启动 shell,运行 Android 提供的部分 Linux 命令,如浏览文件系统、列出进程、读取日志、连接 SQLite 数据库并执行 SQL 命令。 - **模拟器控制台**:只能在模拟器上使用。当模拟器启动并运行后,在工具窗口中输入 `telnet localhost port#`,其中 `port#` 是模拟器监听的端口,通常显示在模拟器窗口标题中,常见值如 5554。启动模拟器控制台后,可以输入命令模拟 GPS 事件、短信消息、电池和网络状态变化。 #### 10. 启动模拟器 通常,建议先启动模拟器,然后在运行的模拟器中部署和测试应用。可以通过运行 Android SDK 工具目录中的 `android` 程序或从 Eclipse 的“窗口”菜单进入 Android SDK 和 AVD 管理器。进入管理器后,点击左侧的“虚拟设备”,从右侧列表中选择所需的 AVD,然后点击“启动”。 点击“启动”按钮后,会出现“启动选项”对话框,可以缩放模拟器窗口的大小,更改启动和关闭选项。对于中小屏幕设备的 AVD,通常使用默认屏幕大小;对于大屏幕和超大屏幕设备,如平板电脑,默认屏幕大小可能无法在工作站屏幕上很好地显示,可以启用“按实际大小缩放显示”并输入一个值。 该对话框还可以处理快照。保存到快照会在退出模拟器时导致一定的延迟,因为要将模拟器的当前状态写入快照图像文件。下次启动时,如果存在快照,启动速度会快很多。可以选择“擦除用户数据”来完全重新启动,也可以取消选择“从快照启动”以保留用户数据并进行完整的启动序列。或者创建一个喜欢的快照并仅启用“从快照启动”选项,这样每次启动和关闭都很快,因为不会每次退出时都创建新的快照图像文件。要使用 AVD 的快照功能,必须在创建 AVD 时启用快照。 #### 11. StrictMode Android 2.3 引入了一个新的调试功能 StrictMode,它可以报告与线程和虚拟机相关的策略违规。如果检测到策略违规,会发出警报并包含堆栈跟踪,显示应用违规时的位置。可以选择让应用随警报崩溃,也可以仅记录警报并让应用继续运行。 ##### 11.1 线程策略 StrictMode 有两种类型的策略,第一种与线程相关,主要用于检查主线程(也称为 UI 线程)。不建议在主线程中进行磁盘读写和网络访问,Google 在磁盘和网络代码中添加了 StrictMode 钩子。如果为某个线程启用 StrictMode,并且该线程进行磁盘或网络访问,就会收到警报。可以选择要警报的线程策略方面以及警报方法,例如: ```java StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); ``` 可以选择检测自定义慢调用、磁盘读取、磁盘写入和网络访问等违规行为,警报方法可以选择写入 LogCat、显示对话框、闪烁屏幕、写入 DropBox 日志文件或使应用崩溃,常见的选择是写入 LogCat 或使应用崩溃。 ##### 11.2 虚拟机策略 第二种策略是 VmPolicy,可以检查 SQLite 对象在关闭前被终结或任何 `Closeable` 对象在关闭前被终结时的内存泄漏。例如: ```java StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build()); ``` 在生产环境中,通常需要关闭 StrictMode。可以通过移除调用代码来关闭,但这会使开发变得困难;也可以定义一个应用级别的布尔变量,在调用 StrictMode 代码前进行测试;更优雅的方法是利用 `AndroidManifest.xml` 文件中 `<application>` 标签的 `android:debuggable` 属性。当应用处于调试模式时,该属性设置为 `true`,可以在代码中读取 `ApplicationInfo` 对象的标志来判断是否启用 StrictMode: ```java // Return if this application is not in debug mode ApplicationInfo appInfo = context.getApplicationInfo(); int appFlags = appInfo.flags; if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { // Do StrictMode setup here } ``` 在使用 Eclipse 开发时,ADT 会自动设置 `debuggable` 属性。部署到模拟器或直接到设备时,Eclipse 会将该属性设置为 `true`,从而启用 StrictMode;导出应用创建生产版本时,ADT 会将其设置为 `false`。 如果要在 Android 2.3 之前的版本使用 StrictMode,可以使用反射技术间接调用 StrictMode 方法: ```java try { Class sMode = Class.forName("android.os.StrictMode"); Method enableDefaults = sMode.getMethod("enableDefaults"); enableDefaults.invoke(null); } catch(Exception e) { // StrictMode not supported on this device, punt Log.v("StrictMode", "... not supported. Skipping..."); } ``` 也可以创建一个 `StrictModeWrapper` 类来处理: ```java import android.content.Context; import android.content.pm.ApplicationInfo; import android.os.StrictMode; public class StrictModeWrapper { public static void init(Context context) { // check if android:debuggable is set to true int appFlags = context.getApplicationInfo().flags; if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build()); } } } ``` 在应用中调用: ```java try { StrictModeWrapper.init(this); } catch(Throwable throwable) { Log.v("StrictMode", "... is not available. Punting..."); } ``` 通过以上内容,你全面了解了 Android 开发环境的搭建、应用基础组件、应用结构、应用生命周期以及调试方法等重要知识,为进一步深入学习 Android 开发奠定了坚实的基础。
corwn 最低0.47元/天 解锁专栏
赠100次下载
点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

Big黄勇

硬件工程师
广州大学计算机硕士,硬件开发资深技术专家,拥有超过10多年的工作经验。曾就职于全球知名的大型科技公司,担任硬件工程师一职。任职期间负责产品的整体架构设计、电路设计、原型制作和测试验证工作。对硬件开发领域有着深入的理解和独到的见解。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

区块链集成供应链与医疗数据管理系统的优化研究

# 区块链集成供应链与医疗数据管理系统的优化研究 ## 1. 区块链集成供应链的优化工作 在供应链管理领域,区块链技术的集成带来了诸多优化方案。以下是近期相关优化工作的总结: | 应用 | 技术 | | --- | --- | | 数据清理过程 | 基于新交叉点更新的鲸鱼算法(WNU) | | 食品供应链 | 深度学习网络(长短期记忆网络,LSTM) | | 食品供应链溯源系统 | 循环神经网络和遗传算法 | | 多级供应链生产分配(碳税政策下) | 混合整数非线性规划和分布式账本区块链方法 | | 区块链安全供应链网络的路线优化 | 遗传算法 | | 药品供应链 | 深度学习 | 这些技

探索人体与科技融合的前沿:从可穿戴设备到脑机接口

# 探索人体与科技融合的前沿:从可穿戴设备到脑机接口 ## 1. 耳部交互技术:EarPut的创新与潜力 在移动交互领域,减少界面的视觉需求,实现无视觉交互是一大挑战。EarPut便是应对这一挑战的创新成果,它支持单手和无视觉的移动交互。通过触摸耳部表面、拉扯耳垂、在耳部上下滑动手指或捂住耳朵等动作,就能实现不同的交互功能,例如通过拉扯耳垂实现开关命令,上下滑动耳朵调节音量,捂住耳朵实现静音。 EarPut的应用场景广泛,可作为移动设备的遥控器(特别是在播放音乐时)、控制家用电器(如电视或光源)以及用于移动游戏。不过,目前EarPut仍处于研究和原型阶段,尚未有商业化产品推出。 除了Ea

从近似程度推导近似秩下界

# 从近似程度推导近似秩下界 ## 1. 近似秩下界与通信应用 ### 1.1 近似秩下界推导 通过一系列公式推导得出近似秩的下界。相关公式如下: - (10.34) - (10.37) 进行了不等式推导,其中 (10.35) 成立是因为对于所有 \(x,y \in \{ -1,1\}^{3n}\),有 \(R_{xy} \cdot (M_{\psi})_{x,y} > 0\);(10.36) 成立是由于 \(\psi\) 的平滑性,即对于所有 \(x,y \in \{ -1,1\}^{3n}\),\(|\psi(x, y)| > 2^d \cdot 2^{-6n}\);(10.37) 由

量子物理相关资源与概念解析

# 量子物理相关资源与概念解析 ## 1. 参考书籍 在量子物理的学习与研究中,有许多经典的参考书籍,以下是部分书籍的介绍: |序号|作者|书名|出版信息|ISBN| | ---- | ---- | ---- | ---- | ---- | |[1]| M. Abramowitz 和 I.A. Stegun| Handbook of Mathematical Functions| Dover, New York, 1972年第10次印刷| 0 - 486 - 61272 - 4| |[2]| D. Bouwmeester, A.K. Ekert, 和 A. Zeilinger| The Ph

人工智能与混合现实技术在灾害预防中的应用与挑战

### 人工智能与混合现实在灾害预防中的应用 #### 1. 技术应用与可持续发展目标 在当今科技飞速发展的时代,人工智能(AI)和混合现实(如VR/AR)技术正逐渐展现出巨大的潜力。实施这些技术的应用,有望助力实现可持续发展目标11。该目标要求,依据2015 - 2030年仙台减少灾害风险框架(SFDRR),增加“采用并实施综合政策和计划,以实现包容、资源高效利用、缓解和适应气候变化、增强抗灾能力的城市和人类住区数量”,并在各级层面制定和实施全面的灾害风险管理。 这意味着,通过AI和VR/AR技术的应用,可以更好地规划城市和人类住区,提高资源利用效率,应对气候变化带来的挑战,增强对灾害的

由于提供的内容仅为“以下”,没有具体的英文内容可供翻译和缩写创作博客,请你提供第38章的英文具体内容,以便我按照要求完成博客创作。

由于提供的内容仅为“以下”,没有具体的英文内容可供翻译和缩写创作博客,请你提供第38章的英文具体内容,以便我按照要求完成博客创作。 请你提供第38章的英文具体内容,同时给出上半部分的具体内容(目前仅为告知无具体英文内容需提供的提示),这样我才能按照要求输出下半部分。

元宇宙与AR/VR在特殊教育中的应用及安全隐私问题

### 元宇宙与AR/VR在特殊教育中的应用及安全隐私问题 #### 元宇宙在特殊教育中的应用与挑战 元宇宙平台在特殊教育发展中具有独特的特性,旨在为残疾学生提供可定制、沉浸式、易获取且个性化的学习和发展体验,从而改善他们的学习成果。然而,在实际应用中,元宇宙技术面临着诸多挑战。 一方面,要确保基于元宇宙的技术在设计和实施过程中能够促进所有学生的公平和包容,避免加剧现有的不平等现象和强化学习发展中的偏见。另一方面,大规模实施基于元宇宙的特殊教育虚拟体验解决方案成本高昂且安全性较差。学校和教育机构需要采购新的基础设施、软件及VR设备,还会产生培训、维护和支持等持续成本。 解决这些关键技术挑

黎曼zeta函数与高斯乘性混沌

### 黎曼zeta函数与高斯乘性混沌 在数学领域中,黎曼zeta函数和高斯乘性混沌是两个重要的研究对象,它们之间存在着紧密的联系。下面我们将深入探讨相关内容。 #### 1. 对数相关高斯场 在研究中,我们发现协方差函数具有平移不变性,并且在对角线上存在对数奇异性。这种具有对数奇异性的随机广义函数在高斯过程的研究中被广泛关注,被称为高斯对数相关场。 有几个方面的证据表明临界线上$\log(\zeta)$的平移具有对数相关的统计性质: - 理论启发:从蒙哥马利 - 基廷 - 斯奈思的观点来看,在合适的尺度上,zeta函数可以建模为大型随机矩阵的特征多项式。 - 实际研究结果:布尔加德、布

利用GeoGebra增强现实技术学习抛物面知识

### GeoGebra AR在数学学习中的应用与效果分析 #### 1. 符号学视角下的学生学习情况 在初步任务结束后的集体讨论中,学生们面临着一项挑战:在不使用任何动态几何软件,仅依靠纸和笔的情况下,将一些等高线和方程与对应的抛物面联系起来。从学生S1的发言“在第一个练习的图形表示中,我们做得非常粗略,即使现在,我们仍然不确定我们给出的答案……”可以看出,不借助GeoGebra AR或GeoGebra 3D,识别抛物面的特征对学生来说更为复杂。 而当提及GeoGebra时,学生S1表示“使用GeoGebra,你可以旋转图像,这很有帮助”。学生S3也指出“从上方看,抛物面与平面的切割已经

使用GameKit创建多人游戏

### 利用 GameKit 创建多人游戏 #### 1. 引言 在为游戏添加了 Game Center 的一些基本功能后,现在可以将游戏功能扩展到支持通过 Game Center 进行在线多人游戏。在线多人游戏可以让玩家与真实的人对战,增加游戏的受欢迎程度,同时也带来更多乐趣。Game Center 中有两种类型的多人游戏:实时游戏和回合制游戏,本文将重点介绍自动匹配的回合制游戏。 #### 2. 请求回合制匹配 在玩家开始或加入多人游戏之前,需要先发出请求。可以使用 `GKTurnBasedMatchmakerViewController` 类及其对应的 `GKTurnBasedMat