AndroidStudio2-精要-全-

AndroidStudio2 精要(全)

原文:zh.annas-archive.org/md5/a108f147c8cb0404fe6aaf86dfb8a2f9

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

在过去几年中,移动应用程序的受欢迎程度大幅增加,用户对它的兴趣仍在增长。移动操作系统不仅适用于智能手机,也适用于平板电脑,因此增加了这些应用程序的可能市场份额。

Android 具有让开发者感到愉悦的特性,如开源和具有高度社区驱动的开发。Android 在各个方面都与 iOS(苹果移动系统)竞争,与 XCode 相比,iOS 呈现为一个更加集中的开发环境。新的 Android Studio IDE 终于为 Android 开发者提供了这种集中化,并使这个工具对于优秀的 Android 开发者来说是不可或缺的。

这本关于 Android Studio 的书展示了用户如何使用这个新 IDE 开发并构建 Android 应用程序。它不仅是一本入门书籍,也是高级开发者构建应用程序更快、更高效指南。本书将采用教程方法,从基本功能到构建发布的步骤,包括实际示例。

本书涵盖的内容

第一章,安装和配置 Android Studio,描述了 Android Studio 的安装和基本配置。

第二章,开始项目,展示了如何创建新项目以及我们可以选择的活动类型。

第三章,项目导航,探讨了 Android Studio 中项目的基本结构。

第四章,使用代码编辑器,展示了代码编辑器的基本功能,以便充分利用它。

第五章,创建用户界面,专注于用户界面的创建,使用图形视图和基于文本的视图。

第六章,工具,介绍了某些额外的工具,例如 Android SDK 工具、Javadoc 和版本控制集成。

第七章,Google Play Services,介绍了当前现有的 Google Play Services 以及如何在 Android Studio 项目中集成它们。

第八章,调试,详细介绍了如何在 Android Studio 中调试应用程序以及调试时提供的信息。

第九章,准备发布,描述了如何为应用程序准备发布。

附录,获取帮助,介绍了如何使用 Android Studio 获取帮助,并提供了一个在线网站列表,以了解更多关于本书涵盖的主题。

你需要这本书的内容

对于这本书,您需要一个装有 Windows、Mac OS 或 Linux 系统的计算机。您还需要在系统中安装 Java。

这本书面向的对象

这本书不仅是一本入门书,也是为之前未使用 Android Studio 构建 Android 应用的资深开发者提供的指南。这本书非常适合想要学习 Android Studio 关键功能的开发者,也适合想要创建他们第一个应用程序的开发者。假设您熟悉面向对象编程范式和 Java 编程语言。还建议您了解 Android 移动系统的主要特点。

习惯用法

在这本书中,您将找到许多不同的文本样式,用于区分不同类型的信息。以下是一些这些样式的示例及其含义的解释。

文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名如下所示:“AppData目录通常是一个隐藏目录。”

代码块设置如下:

package ${PACKAGE_NAME};

import android.app.Activity;
import android.os.Bundle;

#parse("File Header.java")
public class ${NAME} extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

当我们希望您注意代码块中的特定部分时,相关的行或项目将以粗体显示:

if (savedInstanceState != null) {

}

新术语重要词汇以粗体显示。您在屏幕上看到的单词,例如在菜单或对话框中,在文本中显示如下:“您也可以通过点击屏幕左侧的项目按钮来打开它。”

注意

警告或重要注意事项以如下框的形式出现。

小贴士

小技巧和窍门如下所示。

读者反馈

我们始终欢迎读者的反馈。请告诉我们您对这本书的看法——您喜欢什么或不喜欢什么。读者反馈对我们很重要,因为它帮助我们开发出您真正能从中受益的书籍。

要向我们发送一般反馈,请简单地发送电子邮件至 <feedback@packtpub.com>,并在邮件主题中提及书籍的标题。

如果您在某个主题上具有专业知识,并且您对撰写或为书籍做出贡献感兴趣,请参阅我们的作者指南www.packtpub.com/authors

客户支持

现在您已经是 Packt 图书的骄傲拥有者,我们有一些可以帮助您充分利用购买的东西。

下载示例代码

您可以从您的账户中下载这本书的示例代码文件。www.packtpub.com。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。

您可以通过以下步骤下载代码文件:

  1. 使用您的电子邮件地址和密码登录或注册我们的网站。

  2. 将鼠标指针悬停在顶部的支持标签上。

  3. 点击代码下载与勘误表

  4. 搜索框中输入书籍的名称。

  5. 选择您想要下载代码文件的书籍。

  6. 从下拉菜单中选择您购买此书籍的来源。

  7. 点击代码下载

您还可以通过点击 Packt Publishing 网站上书籍网页上的代码文件按钮来下载代码文件。您可以通过在搜索框中输入书籍名称来访问此页面。请注意,您需要登录您的 Packt 账户。

下载文件后,请确保使用最新版本的以下软件解压或提取文件夹:

  • WinRAR / 7-Zip(适用于 Windows)

  • Zipeg / iZip / UnRarX(适用于 Mac)

  • 7-Zip / PeaZip(适用于 Linux)

该书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Android_Studio_2_Essentials_Second_Edition_Code。我们还有其他来自丰富图书和视频目录的代码包,可在github.com/PacktPublishing/找到。查看它们吧!

下载本书的彩色图像

我们还为您提供了一个包含本书中使用的截图/图表彩色图像的 PDF 文件。彩色图像将帮助您更好地理解输出的变化。您可以从www.packtpub.com/sites/default/files/downloads/AndroidStudio2EssentialsSecondEdition_ColorImages.pdf下载此文件。

勘误

尽管我们已经尽一切努力确保内容的准确性,但错误仍然可能发生。如果您在我们的某本书中找到错误——可能是文本或代码中的错误——如果您能向我们报告这一点,我们将不胜感激。通过这样做,您可以节省其他读者的挫败感,并帮助我们改进后续版本。如果您发现任何勘误,请通过访问www.packtpub.com/submit-errata,选择您的书籍,点击勘误提交表单链接,并输入您的勘误详情来报告它们。一旦您的勘误得到验证,您的提交将被接受,勘误将被上传到我们的网站或添加到该标题的勘误部分下的现有勘误列表中。

要查看之前提交的勘误表,请访问www.packtpub.com/books/content/support并在搜索字段中输入书籍名称。所需信息将出现在勘误部分。

盗版

互联网上对版权材料的盗版是一个持续存在的问题,涉及所有媒体。在 Packt,我们非常重视我们版权和许可证的保护。如果您在互联网上发现我们作品的任何非法副本,请立即提供位置地址或网站名称,以便我们可以追究补救措施。

请通过 <copyright@packtpub.com> 联系我们,并提供涉嫌盗版材料的链接。

我们感谢您在保护我们的作者以及为我们提供有价值内容的能力方面的帮助。

问题

如果您在这本书的任何方面遇到问题,您可以通过 <questions@packtpub.com> 联系我们,我们将尽力解决问题。

第一章. 安装和配置 Android Studio

新的官方谷歌 集成开发环境IDE)Android Studio 2.0,拥有其丰富的功能,准备供大家探索。你希望如何制作自己的 Android 应用程序,并将这些应用程序发布到 Google Play 商店供其他用户使用?你能轻松做到吗?你该如何实现?

本章将向您展示如何准备您的 Android Studio 新安装,并帮助您在新环境中迈出第一步。我们将从为安装准备系统并下载所需文件开始。我们将看到运行 Android Studio 首次时出现的欢迎屏幕,并正确配置 Android 软件开发工具包SDK),以便您准备好创建您的第一个应用程序。

本章我们将涵盖以下主题:

  • 安装 Android Studio

  • 首次运行 Android Studio

  • 配置 Android SDK

安装准备

开始使用 Android Studio 的先决条件是在您的系统上安装 Java。系统还必须能够找到 Java 安装。这可以通过在您的系统上安装 Java 开发工具包JDK)并设置一个名为 JAVA_HOME 的环境变量来实现,该变量指向系统中的 JDK 文件夹。检查此环境变量以避免在安装 Android Studio 时出现问题。

下载 Android Studio

您可以从 Android 开发者工具网页 developer.android.com/sdk/index.html 通过点击下载按钮下载 Android Studio 安装包,如图所示。对于 Windows 系统,此包将是一个 EXE 文件,对于 Mac OS X 系统,是一个 DMG 文件,对于 Linux 系统,是一个 TGZ 文件:

下载 Android Studio

安装 Android Studio

在 Windows 中,启动 EXE 文件。默认安装目录是 \Users\<your_user_name>\AppData\Local\Android\android-studioAppData 目录通常是一个隐藏目录。

在 Mac OS X 中,打开 DMG 文件,将 Android Studio 拖到您的 Applications 文件夹中。默认安装目录是 /Applications/Android\ Studio.app

在 Linux 系统中,解压 TGZ 文件并执行位于 android-studio/bin/ 目录下的 studio.sh 脚本。

如果您在安装过程中或后续步骤中遇到任何问题,您可以通过检查 附录,获取帮助,来获取有关问题和已知问题的帮助。

首次运行 Android Studio

执行 Android Studio 并等待其完全加载。第一次执行 Android Studio 可能需要几分钟。第一次执行 Android Studio 时,您将看到一个欢迎屏幕。如图所示,欢迎屏幕提供了启动新项目、打开项目、导入项目或执行更高级操作(如从版本控制系统检出项目或修改配置选项)的选项:

首次运行 Android Studio

让我们来看看欢迎屏幕上可用的各种选项:

  • 启动新的 Android Studio 项目:这将从零开始创建一个新的 Android 项目

  • 打开现有的 Android Studio 项目:这会打开一个现有项目。

  • 从版本控制系统检出项目:这会通过从版本控制系统导入现有源创建一个新的项目。

  • 导入项目(Eclipse ADT、Gradle 等):这会通过从您的系统导入现有源创建一个新的项目。

  • 导入 Android 代码示例:这会导入一个包含来自 GitHub 的官方 Google 代码示例的项目(github.com/googlesamples)。

欢迎屏幕除了主要操作外,还包含一个配置菜单和帮助菜单,如下所述:

  • 配置:这会打开配置菜单。配置菜单有以下选项:

    • SDK 管理器:这会打开将在第六章(工具)中解释的 Android SDK 工具。

    • 首选项:这会打开 Android Studio 首选项。

    • 插件:这会打开 Android Studio 的插件管理器。

    • 导入设置:这会从文件(.jar)导入设置。

    • 导出设置:这会将设置导出到一个文件(.jar)。

    • 设置仓库:这允许您输入外部代码仓库的 URL。

    • 检查更新:这会检查是否有可用的 Android Studio 更新。

    • 项目默认值:这会打开项目默认设置菜单。

    • 设置:这会打开模板项目设置。这些设置也可以通过 Android Studio 设置访问(配置 | 设置)。

    • 项目结构:这会打开项目和平台设置。

    • 运行配置:这会打开运行和调试设置。

  • 获取帮助:这会打开帮助菜单:

    • 帮助主题:这会打开 Android Studio 帮助,一个在线版本。

    • 每日提示:这会打开一个包含每日提示的对话框。

    • 默认快捷键参考:这会打开一个包含默认快捷键的在线 PDF 文件。

    • 插件开发:这会打开一个包含插件开发者信息的 JetBrains 网站。

配置 Android SDK

必须正确配置的基本功能是 Android SDK。尽管 Android Studio 会自动安装可用的最新 Android SDK,因此您应该已经拥有创建您的第一个应用程序所需的一切。检查它并了解我们如何更改它是很重要的。

在 Android Studio 欢迎屏幕中,导航到 配置 | 项目默认值 | 项目结构。在 SDK 位置,您应该选择一个如以下截图所示的 Android SDK 位置。此选定的 SDK 位置将是我们在 Android 项目中使用的默认位置;然而,我们可以稍后为需要特殊设置的特定项目更改它。

配置 Android SDK

如果您在 Android Studio 中没有配置 Android SDK,那么我们必须手动添加它。

要完成这个任务,请点击省略号(...)按钮添加 Android SDK,然后选择 SDK 的主目录。通过导航到您的 Android Studio 安装目录来检查您是否已安装它。您应该找到一个名为 sdk 的文件夹,其中包含 Android SDK 及其工具。Android Studio 的安装目录可能位于一个隐藏文件夹中;因此,请点击以下截图中突出显示的按钮以显示隐藏的文件和文件夹

配置 Android SDK

如果您希望使用与 Android Studio 一起提供的不同位置的 Android SDK,请选择此选项。例如,如果您之前使用了 Eclipse 的 Android 开发工具ADT)插件,那么您系统中已经安装了 Android SDK。

摘要

我们已成功为 Android Studio 准备了系统并安装了我们的 Android Studio 实例。我们第一次运行 Android Studio,现在我们知道了欢迎屏幕上的选项。您还学会了如何配置我们的 Android SDK 并手动安装它,以防您希望使用不同的版本。完成这些任务后,您的系统将运行并配置好以创建您的第一个项目。

在下一章中,您将了解项目概念以及它包含应用程序所需的一切,从类到库。我们将创建我们的第一个项目,并讨论向导中可用的不同类型的活动。

第二章:开始一个项目

现在您已经安装了 Android Studio,接下来要做的是熟悉其功能。您需要了解创建项目时必要的字段和形式因素。此外,您可能需要选择活动类型以创建主要活动。您如何使用 Android Studio 实现这一点?

在本章中,我们将讨论如何创建一个新项目,其中包含开始所需的基本内容。我们将使用 Android Studio 向导来创建项目,并遍历项目配置字段。我们还将从向导中可用的不同类型的活动中选择一个作为我们的主要活动。

本章我们将涵盖以下主题:

  • 创建新项目

  • 选择参数

  • 从不同类型的活动中选择主要活动

  • 定制您的活动

创建新项目

要创建新项目,请从欢迎屏幕中选择开始新的 Android Studio 项目选项。如果您不在欢迎屏幕上,请导航到文件 | 新建项目。这将打开新项目向导,如下截图所示:

创建新项目

配置项目

新项目向导中显示的字段如下:

  • 应用程序名称: 这是显示在 Google Play 上的名称,也是用户看到的名称。

  • 公司域名: 这是用于创建您应用程序包名的公司或域名。

  • 包名: 这是您应用程序的唯一标识符,通常采用com.company_name.app_namereverse_company_domain.app_name的形式。这种形式可以降低与其他应用程序名称冲突的风险。基于公司域名应用程序名称字段,建议一个默认的包名。您可以通过点击编辑来更改包名。

  • 项目位置: 这是您系统中保存项目的目录。

完成您项目的信息并点击下一步按钮。这将带您进入第二个屏幕。此屏幕允许您选择您的平台以及项目将在不同设备上支持的最小 SDK。

选择形式因素

由于 Android 扩展到不同类型的设备,您可能希望选择一个或多个要包含在项目中的平台和设备类型。对于每种设备类型,您可以选择不同的最小 SDK。Android 支持的设备如下:

  • 手机和平板电脑: 这些是用于为手机和/或平板电脑创建应用程序的标准 Android 平台。

  • 可穿戴设备: 这是一个用于为智能手表等可穿戴设备设计应用程序的 Android Wear 平台。

  • 电视: 这是一个用于为大型屏幕(如电视)设计应用程序的 Android TV 平台。

  • Android Auto:这是 Android 平台的一个扩展,使您的应用能够在汽车中运行。Android Auto 没有平台选择器,因为它依赖于标准的手机和平板项目。您的应用需要针对 Android 5.0 或更高版本以支持 Android Auto。

  • Glass:这是一个用于为 Google Glass 设备设计应用的 Android Glass 平台。

一旦您决定了您的设备,您可以选择您的应用程序支持的最小 SDK。使用较旧 SDK 的设备将无法安装您的应用程序。尝试在支持的设备和可用功能之间达到平衡。如果您的应用程序不需要最新 SDK 中发布的具体功能,那么您可以选择较旧的应用程序编程接口(API)。谷歌发布的关于平台分布的最新仪表板显示,97.3%的设备使用 Android 4.0.3 冰淇淋三明治或更高版本。如果您选择 Android 2.3.3 姜饼,那么这个比例几乎达到 100%。您可以通过点击帮助我选择链接来查看这些值。官方 Android 仪表板也可在developer.android.com/about/dashboards/index.html找到。

要将任何平台和 SDK 包含到您的项目中,您需要在您的系统中安装它们。安装新平台通常使用一个名为 Android SDK Manager 的工具,这将在第六章工具中解释。您现在不必使用该管理器,因为创建新项目的向导会为您完成所有工作。

检查手机平板选项,并将最小 SDK 设置为API 16。之后,点击下一步。如果需要,将安装所需组件。如果是这种情况,安装完成后再次点击下一步。这将带您进入下一个屏幕,您可以在其中选择活动类型。

选择活动类型

活动是与用户在应用程序中交互的屏幕相关联的组件。活动的逻辑在一个名为活动的 Java 类中实现,该类位于您的项目源文件夹内。Android 应用程序通常有多个屏幕,通常基于多个活动。应用程序的所有活动都必须在AndroidManifest.xml文件中声明。在任何 Android 应用程序中都是强制性的,因为它描述了关于应用程序的基本信息。在第三章导航项目中,您将了解项目结构和AndroidManifest.xml文件。

当应用程序启动时,它显示应用程序的主屏幕。新建项目向导的这一步创建您应用程序的主活动,这是您应用程序的主要入口点。您可以将要创建的活动类型指定为主活动。您可以在完成创建新项目后不添加活动,但您需要在完成创建项目后添加主活动。您还可以通过修改AndroidManifest.xml文件在项目后期更改主活动。一旦创建项目,您就可以添加新活动以完善您的应用程序。要创建新活动,您可以通过在菜单中导航到文件 | 新建 | 活动 | 图库来使用此相同的向导步骤。

可以选择的活动类型如下:

  • 基本活动:此模板创建一个带有操作栏和浮动操作按钮的活动。操作栏包括标题和选项菜单。操作栏可以提供导航模式和用户操作。您可以在developer.android.com/guide/topics/ui/actionbar.html了解更多关于操作栏的信息。

    注意

    您可以在www.google.com/design/spec/components/buttons-floating-action-button.html了解更多关于浮动操作按钮的信息。

    以下截图显示了基本活动

    选择活动类型

    如果您选择此模板,Android Studio 将创建一个包含两个布局文件(activity_main.xmlcontent_main.xml)和主活动类的项目。主布局(activity_main.xml)声明了操作栏和浮动操作按钮,并通过添加以下 XML 声明包含内容布局(content_main.xml):

    <include layout="@layout/content_main" />
    
  • 空活动:此操作创建一个空白活动。以下是显示空活动的截图:选择活动类型

  • 全屏活动:此模板在全屏视图中隐藏系统的用户界面(如通知栏)。默认情况下,全屏模式与当用户触摸设备屏幕时出现的操作栏交替。以下截图显示了全屏活动选择活动类型

    如果您选择此模板,Android Studio 将创建一个包含主活动及其主布局的项目。主活动包含处理全屏模式的所有逻辑。例如,您会注意到两个辅助方法用于隐藏和显示操作栏:

    private void hide() {
       …
    }
    
    private void show() {
       …
    }
    

    您还会注意到用于配置操作栏是否在延迟后自动隐藏以及该延迟时间的常量变量:

    /**
     * Whether or not the system UI should be auto-hidden after
     * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
     */
    private static final boolean AUTO_HIDE = true;
    /**
     * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
     * user interaction before hiding the system UI.
     */
    private static final int AUTO_HIDE_DELAY_MILLIS = 3000;
    
  • Google AdMob Ads Activity:此模板创建一个包含 AdMob 广告 的活动。此模板的目的是显示允许应用盈利的广告。以下截图显示了 Google AdMob Ads Activity选择活动类型

    如果你选择此模板,Android Studio 将创建一个包含主活动及其主布局的项目。主活动包含创建(newInterstitialAd 方法)、加载(loadInterstitial 方法)和显示(showInterstital 方法)广告的所有逻辑,这些广告保存在 InterstitialAd 对象中。

  • Google Maps Activity:此模板创建一个包含片段中 Google 地图的新活动。片段是活动中的用户界面的一部分。片段可以在多个活动中重用,并且可以在单个活动中组合多个片段。有关片段的更多信息,请参阅 developer.android.com/guide/components/fragments.html。如下截图所示:选择活动类型

    如果你选择此模板,Android Studio 将创建一个包含主活动和一个包含以下地图片段的布局的项目:

    <fragment 
    
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.mapstest.MapsActivity" />
    
  • 登录活动:此模板创建一个视图作为登录屏幕,允许用户使用电子邮件和密码登录或注册。选择活动类型

    如果你选择此模板,Android Studio 将创建一个包含主活动及其布局的项目。主布局包含:一个用于显示登录进度的 ProgressBar,一个用于用户电子邮件的 AutoCompleteTextView,一个用于用户密码的 EditText,以及一个用于登录的 Button

    主活动包括自动完成电子邮件的代码,从字段之间切换焦点的代码,一个用于在后台执行登录的 AsyncTask 类,以及显示登录进度的代码。

  • 主/详细流程:此模板将屏幕分为两个部分:左侧菜单和右侧所选项目的详细信息。在较小屏幕上,仅显示一个部分,但在较大屏幕上,同时显示两个部分。选择活动类型

    如果你选择此模板,Android Studio 将创建一个包含两个活动(列表活动和详细活动)的项目。项目还包含两个活动的布局:列表布局和详细布局。还有一些额外的类,例如详细片段和用于创建主列表的布局。

  • 导航抽屉活动:此模板创建了一个带有导航抽屉的新活动。它在一个从左侧面板拉到屏幕上的面板中显示主要导航选项。您可以在 developer.android.com/design/patterns/navigation-drawer.html 上了解更多关于导航抽屉的信息。选择活动类型

    此模板包含一个实现 NavigationView.OnNavigationItemSelectedListener 接口的主活动。此监听器允许活动在用户从抽屉菜单中选择选项时接收事件。事件在主活动实现的 onNavigationItemSelected 方法中接收:

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
       …
    }
    

    主布局是 DrawerLayout,其中包含一个 NavigationView 对象。项目中也创建了额外的布局,用于主内容、主顶部栏和抽屉头部视图。

  • 滚动活动:此模板创建了一个垂直滚动的活动。选择活动类型

    此模板包含一个主活动和主布局。主布局包含一个 Toolbar 并包括滚动内容布局:

    <include layout=""@layout/content_scrolling"" />
    

    内容布局是 NestedScrollView

  • 设置活动:此选项创建一个带有设置列表的偏好设置活动。选择活动类型

    此模板包含两个活动:主活动和偏好设置活动。偏好设置活动扩展了 PreferenceActivity 类并重写了构建偏好屏幕的方法。偏好设置内容是通过定义 PreferenceScreen 组件的 XML 文件配置的。

  • 标签活动:此选项创建一个带有类似 基本活动 的操作栏的空白活动,但它还包括一个导航元素。导航元素可以是标签用户界面(固定或可滚动的标签)、水平滑动或旋转菜单。Android Studio 生成的项目内容取决于所选的导航元素。选择活动类型

选择 空活动 并点击 下一步

自定义您的活动

新建项目 向导的最后一步,您可以稍微自定义一下您的活动。这种自定义将决定您的一些类和资源文件的名称。您也可以从该向导中自定义片段的使用或导航类型。

以下截图显示了 空活动 的自定义屏幕:

自定义您的活动

活动的基本自定义有以下选项:

  • 活动名称:主活动类的名称。

  • 布局名称:如果您勾选了 生成布局文件 选项,您可以创建一个与您的活动关联的布局。此字段允许您指定与主活动关联的布局名称,它将在资源文件夹中创建。

根据之前步骤中选择的活动类型,您可以自定义更多参数。以下截图显示了基本活动的自定义:

自定义您的活动

除了活动和布局名称外,您还可以配置以下选项:

  • 标题:默认情况下,这将用于活动和动作栏。

  • 菜单资源名称:配置菜单项的资源文件名称。

有其他仅适用于一种活动类型的自定义选项,例如AdMob 广告活动标签页活动AdMob 广告活动包含一个额外的选项,广告格式,这是广告的格式。格式可以是插页式横幅式标签页活动包括两个额外的选项:片段布局名称,这是与活动内容片段关联的布局名称;以及导航样式,这是导航类型。您可以选择以下三种替代方案之一进行导航:

  • 滑动视图(Swipe Views),如图所示的下截图:自定义您的活动

    此种导航类型使用ViewPager组件来显示片段。ViewPager对象在主活动中通过SectionsPagerAdapter对象进行配置。它提供了ViewPager所需的片段。除了包含ViewPager的主布局外,还创建了一个片段布局:fragment_main.xml

  • 动作栏中的标签页(Action Bar Tabs),如图所示的下截图:自定义您的活动

    此种导航类型使用与Swipe Views导航类型相同的组件和文件,以及一个TabLayout对象。TabLayout对象需要接收ViewPager对象,该对象在主活动的onCreate方法中设置:

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);
    
  • 使用动作栏中的下拉列表(Action Bar Spinner),如图所示的下截图:自定义您的活动

    此种导航类型使用Spinner组件来显示片段。Spinner对象在主活动中通过ThemedSpinnerAdapter进行配置。它提供了Spinner所需的片段。除了包含ViewPager的主布局外,还创建了一个片段布局:fragment_main.xml

要完成本章,我们选择空活动。保留自定义中的默认值并点击完成

在您的项目中将创建一个空活动。此活动也在AndroidManifest.xml文件中配置为应用程序的主活动,通过设置以下 intent 过滤器操作:

<activity
    android:name=".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>

android.intent.action.MAIN 动作将活动设置为应用程序的主要入口点。android.intent.category.LAUNCHER 类别表示入口点应作为启动器中的顶级应用程序出现。我们将在第三章导航项目中检查这个AndroidManifest.xml文件。

摘要

我们已经使用 Android Studio 向导创建了我们第一个项目,并填写了配置字段。我们还了解了不同类型的活动。

在下一章中,我们将探讨 Android Studio 结构的各个元素。我们将了解如何创建新类、添加和访问库以及配置项目。

第三章:项目导航

现在您已经创建了第一个 Android Studio 项目,您将理解正在发生的事情。在您开始编程之前,您需要熟悉项目中的导航。一切是如何结构的?您可以在项目中更改哪些设置?如何更改这些设置以及它们代表什么?

本章旨在介绍 Android Studio 中项目的结构。我们将从理解项目导航面板开始。然后,我们将查看我们项目中最重要的文件夹——buildgenlibs——以及src/main下的文件夹,您将学习如何更改项目设置。

本章我们将涵盖以下主题:

  • 导航面板

  • 项目结构

  • 修改项目属性

项目导航面板

初始时,在 Android Studio 的主视图中不显示任何项目或文件,如下一截图所示。如 Android Studio 建议,按Alt +1,或者在 Mac 上按cmd 1,以打开项目视图。您也可以通过点击屏幕左侧边缘的项目按钮来打开它:

项目导航面板

项目视图显示了打开的项目列表。这些项目以分层视图显示。我们可以从项目资源管理器的左上角更改视图类型。在项目视图的右上角,有一些操作和一个下拉菜单来配置所选的项目视图类型。以下截图显示了这些操作:

项目导航面板

从左上角打开视图选择器,查看您可以选择的完整视图类型列表,以下截图显示了这些类型:

项目导航面板

这些是可用于在项目中导航的视图类型:

  • 项目:此视图显示了项目的目录结构。

  • :它只显示包结构。

  • Scratches:它只显示您在项目中创建的 Scratches 文件。Scratches 文件是可运行和可调试的文件,用于代码原型设计。您可以通过导航到工具 | 新建 Scratches 文件来使用菜单选项创建一个新的 Scratches 文件。

  • Android:它只显示您作为开发者将包含或编辑应用程序文件的文件夹。此视图非常方便,可以轻松访问您真正需要的所有文件。这些文件夹仅与列在简化结构中的 Android 应用程序相关:java类文件夹、res资源文件夹、manifest文件和 Gradle 脚本。由于此视图类型的目的是展示简化结构,因此它不匹配实际的文件夹结构。

  • 作用域项目文件问题生产测试Android 仪器测试):作用域是项目文件、包和文件夹的子集。如果你选择一个预定义的作用域,你可以从项目视图右上角的配置菜单创建自己的自定义作用域。打开配置菜单并选择编辑作用域选项。默认情况下,你会看到以下预定义的作用域:

    • 项目文件:此作用域显示你项目中的所有文件

    • 问题:此作用域显示你项目中有错误的文件

    • 生产:此作用域显示你项目中所有非测试文件

    • 测试:此作用域显示你项目中的所有测试文件

    • Android 仪器测试:此作用域显示所有仪器化测试文件

右键单击项目名称以打开上下文菜单或单击项目中的任何元素。如以下截图所示,从该菜单中,我们可以:

  • 创建并添加新元素到项目

  • 在项目中剪切、复制、粘贴或重命名文件

  • 在项目中查找元素

  • 分析和重新格式化代码

  • 构建项目

  • 比较文件

  • 在资源管理器中打开文件项目导航面板

项目结构

我们可以使用项目视图类型在项目导航面板中检查项目结构。项目结构包括一个名为我们应用程序的文件夹。此文件夹包含应用程序结构和文件。应用程序结构的最重要元素位于app目录中。这些包括以下内容:

  • build/: 这是一个包含在构建应用程序后编译的资源以及由 Android 工具生成的类的文件夹,例如包含对应用程序资源引用的R.java文件。

  • libs/: 这是一个包含从我们的代码中引用的库的文件夹。

  • src/androidTest/: 这是一个包含需要测试的 Java 类测试类的文件夹。

  • src/main/: 这是一个包含我们应用程序源代码的文件夹。你将通常在此文件夹中处理所有文件。main文件夹按以下方式细分:

    • java/: 这是一个包含按包组织 Java 类的文件夹。我们创建的每个类都将位于我们的项目包命名空间(com.example.myapplication)中。当我们创建第一个项目时,我们也创建了它的主活动,因此活动类应该在这个包中。以下截图显示了项目结构中的此主活动类项目结构

    • res/: 这是一个包含项目资源的文件夹,例如指定布局和菜单的 XML 文件,或图像文件。

    • AndroidManifest.xml: 这是 Android 项目中的一个基本文件,当我们创建项目时自动生成。此文件声明了 Android 系统运行应用程序所需的基本信息:包名、版本、活动、权限、意图或所需的硬件。

  • build.gradle: 这是一个用于构建我们应用程序的脚本文件。我们将在本章的Gradle子节中讨论如何配置此文件中的选项。

资源文件夹

这些资源都是与我们的应用程序相关的非代码资产。例如图像或字符串等元素从代码中外部化作为资源,这使得在不更改代码的情况下更新它们变得容易。资源的一些例子包括颜色、图像、图形、布局、字符串和样式。资源被分配到以下文件夹:

  • anim/: 这是一个包含动画对象的 XML 文件的文件夹。

  • color/: 这是一个包含我们应用程序中使用的颜色状态列表的文件夹。颜色状态列表定义了颜色和基于组件状态的颜色变化。

  • drawable/: 这是一个包含图像和描述我们应用程序中使用的可绘制对象的 XML 文件的文件夹。

  • mipmap/: 这是一个包含应用程序启动器图标的文件夹。有不同分辨率的 drawable 文件夹。当我们创建第一个项目时,还创建了一个默认的应用程序图标。这个名为ic_launcher.png的图标已经存在于这些文件夹中。

  • layout/: 这是一个包含视图及其元素的 XML 定义的文件夹。

  • menu/: 这是一个包含应用程序菜单的 XML 定义的文件夹。

  • values/: 这是一个包含定义名称-值对的 XML 文件的文件夹。这些值可以是颜色、字符串或样式。有不同类型的值文件夹,它们被分类到不同的屏幕选项中,以适应界面;例如,当应用程序在平板电脑上运行时,可以放大组件或字体。

我们的基本项目包含一些基本资源。因此,这里讨论的所有文件夹并不一定默认包含。

清单文件

AndroidManifest.xml文件是一个强制性的文件,它包含 Android 系统运行应用程序所需的必要信息。清单文件必须包含的两个基本 XML 标签如下:

  • <manifest>: XML 文件中的根元素。package属性定义了应用程序的 Java 包名,这是应用程序的唯一标识符。此元素的其它属性允许您设置版本代码(android:versionCode)或版本名称(android:versionName)。

  • <application>:此元素在 <manifest> 中包含您的应用的其余元素,例如活动(<activity>)、服务(<service>)或内容提供者(<provider>)元素。您可以为此元素指定几个属性,例如,将应用设置为可调试(android:debuggable)、为应用设置用户可读的标签(android:label)或设置您的应用是否允许备份(android:allowBackup)。

清单文件还声明了您的应用需要的权限和功能。例如,如果您的应用需要互联网访问,则必须在清单文件中添加它:

<uses-permission android:name="android.permission.INTERNET" />

您也可以通过清单文件将有关 SDK 的信息呈现给 Android 系统。使用 <uses-sdk> 元素及其属性来指示您的应用支持的最小 SDK 版本和目标 SDK。

Gradle

Android Studio 中的应用使用 Gradle 构建。它是一个与 Android Studio 独立但完全集成的构建自动化工具。Gradle 使用基于 Groovy 的可扩展和声明式 领域特定语言DSL),Groovy 是一种面向对象的 Java 平台编程语言。Gradle 构建文件由一个或多个项目组成,每个项目包含一个或多个任务。任务代表要构建的工作片段。您可以在 www.gradle.org/ 上了解更多关于 Gradle 的信息。

构建过程的配置声明在 Android 项目中包含的 Gradle 构建文件中。如前所述,在项目结构中,Android 应用的构建配置文件定义在 /app/build.gradle 文件中。我们可以在该文件中配置的一些主要选项如下:

  • 变体:我们可以使用相同的工程配置应用的不同版本,例如,创建演示版和付费版。变体依赖于构建类型(buildTypes 标签)和产品风味配置(productFlavors 标签)。例如,两个构建类型是 debugrelease,两个产品风味是演示版和付费版。在您的应用 Gradle 构建文件中,您将找到用于发布的 buildType

    buildTypes {
       release {
          …
       }
    }
    
  • 依赖项:我们可以指示我们的项目对其他模块或库的本地或远程依赖项。这些依赖项在 dependencies 标签下声明。在您的应用 Gradle 构建文件中,您将找到一个对项目 lib 文件夹中包含的 JAR 文件的依赖项,以及对 JUnit 测试框架的依赖项:

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
    }
    
  • 清单条目:我们可以在构建文件中覆盖 Android 清单文件的一些条目,提供 manifest 文件的动态配置。例如,我们可以覆盖包名、最小 SDK 或目标 SDK 的值。这些配置定义在 android/defaultConfig 标签下:

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    
  • 签名: 我们可以为发布版本激活应用程序签名。构建系统使用默认证书来签名应用程序的调试版本。我们也可以配置我们的密钥和证书来签名发布版本。这些配置定义在android/signingConfigs标签下。你将在第九章准备发布中学习如何为你的应用签名。

项目设置

你可以通过文件 | 设置文件 | 项目结构来导航到包含项目设置的对话框。这两个选项也在工具栏中可用:

项目设置

从项目视图中选择你的项目,并导航到文件菜单中的设置设置对话框的左侧面板显示了以下部分结构化的选项:

  • 外观与行为: 你可以更改 Android Studio 的外观和行为,例如字体大小、主题、更新、密码或范围管理。

  • 快捷键映射: 这管理键盘快捷键。

  • 编辑器: 这通过选择颜色、使用模板或更改编码来自定义代码编辑器。默认编码是 UTF-8。你将在第四章使用代码编辑器中了解更多关于编辑器设置的信息。

  • 插件: 这管理插件。你可以安装和删除插件,启用或禁用它们,或者你可以检查它们的版本。

  • 版本控制: 在本节中,你可以找到与版本控制相关的设置;例如,你可以配置后台执行或添加要忽略的文件。版本控制将在第六章工具中更详细地解释。

  • 构建执行部署: 在本节中,你可以配置构建工具,如 Gradle、编译器和调试器。

  • 语言与框架: 这些是与你的项目中使用的框架相关的设置。

  • 工具: 本节包括与其它工具相关的设置。你可以管理网络浏览器、终端或添加服务器证书。

其中一些设置是通用设置,但其他一些设置仅适用于当前项目。你可以通过它们旁边的图标或设置标题中的标签当前项目来区分当前项目设置,如下一张截图所示:

项目设置

除了这些设置之外,在项目结构对话框中还有进一步的设置。导航到文件 | 项目结构菜单。设置包括以下内容:

  • SDK 位置: 你可以更改项目的 SDK。在第一章安装和配置 Android Studio 中,我们选择了一个 SDK 作为默认值。在这个屏幕上,我们可以更改这个 SDK,但仅限于当前项目。

  • 项目: 您可以更改 Gradle 版本或插件和库仓库。

  • 开发者服务: 您可以在您的应用中配置多个开发者服务。可用的服务包括以下内容:广告(AdMob)、分析(Google Analytics)、身份验证(Google Sign-In)、(Firebase)和通知(Google Cloud Messaging)。

  • 模块: 根据 IntelliJ IDEA (www.jetbrains.com/idea/webhelp/module.html) 的定义,以下是一个模块的定义:

    "一个模块是一个可以独立编译、运行、测试和调试的功能单元。"

    模块 菜单显示现有模块及其功能的列表。我们项目中的默认模块是 app 模块。设置选项卡对应以下 Gradle 构建文件配置:属性签名变体构建类型依赖项

您可以通过点击 项目结构 对话框左上角的添加按钮向您的项目添加新模块。此操作将打开一个模块选择向导,如下面的截图所示:

项目设置

您可以选择以下模块类型之一:手机和平板模块Android 库Android Wear 模块Android TV 模块Glass 模块导入 Gradle 项目导入 Eclipse ADT 项目导入 .JAR/.AAR 包Java 库Google Cloud 模块

摘要

我们看到了在 Android Studio 中项目是如何呈现的,以及创建项目时默认包含哪些文件夹。我们探讨了这些文件夹存在的原因,并检查了 AndroidManifest.xml 文件及其用途。我们还浏览了 首选项项目结构 对话框中的项目设置。到目前为止,您应该知道如何在 Android Studio 中操作和导航项目。

在下一章中,我们将讨论如何使用文本编辑器。对文本编辑器的适当了解对于提高我们的编程效率非常重要。您将了解编辑器设置以及如何自动完成代码、使用预生成的代码块以及导航代码。您还将了解一些有用的快捷键。

第四章:使用代码编辑器

现在你已经创建了你的第一个项目,并且学会了如何在不同文件夹、子文件夹和文件之间导航,现在是时候开始编程了。你有没有想过能够更高效地编程?你该如何加快你的开发过程?你想要学习有用的快捷键吗?例如,你如何一次性注释多行,查找和替换字符串,或者在方法调用中更快地移动到不同的参数?

在本章中,你将学习如何使用和自定义代码编辑器,以便在编程时感到更加舒适。了解代码编辑器的基本功能以增加你的生产力是值得的。你将了解代码补全和代码生成。最后,你将学习一些有用的快捷键和热键来加快开发过程。

本章我们将涵盖以下主题:

  • 自定义代码编辑器

  • 代码补全

  • 代码生成

  • 查找相关内容

  • 有用的快捷键

自定义编辑器设置

要打开编辑器设置,导航到文件 | 设置。在左侧面板的IDE 设置部分,选择编辑器编辑器设置分布在几个类别中:通用颜色与字体代码样式检查文件和代码模板文件编码实时模板文件类型版权Emmet图像意图语言注入拼写TODO

在本节以及本章接下来的几节中,我们将解释一些最有趣的内容。

通用

编辑器设置下选择通用设置。这将在右侧面板中显示设置。其中一些最有趣的选项如下:

  • 鼠标 | 使用 Ctrl + 鼠标滚轮更改字体大小(缩放):勾选此选项允许我们使用鼠标滚轮更改编辑器的字体大小,就像我们在其他程序(如网页浏览器)中做的那样。

  • 其他 | 鼠标移动时显示快速文档:勾选此选项可以在我们将鼠标移至代码片段并等待 500 毫秒后,在小型对话框中显示有关代码的快速文档。你可以更改默认的 500 毫秒延迟值。当我们再次移动鼠标时,对话框会自动消失,但如果我们将鼠标移入对话框,则可以详细查看文档。这对于阅读方法的功能和识别其参数而不需要导航到它非常有用。以下截图显示了此功能:通用

通用设置也分布在几个子类别中:

  • 自动导入: 此类别配置当我们将使用未导入当前类的类的代码粘贴到编辑器时,编辑器的行为方式。默认情况下,当我们这样做时,会弹出一个窗口,提示我们添加import命令。如果我们勾选了自动添加不明确的导入选项,则import命令会自动添加,无需我们的交互。通用

  • 外观: 此类别配置编辑器的外观。我们建议检查以下两个选项:

    • 显示行号: 这会在编辑器的左侧边缘显示行号。当我们进行调试或检查日志时,这可能非常有用。

    • 显示方法分隔符: 这在视觉上分隔类的各个方法。

  • 代码补全: 此类别配置代码补全选项。我们将在下一节中详细检查代码补全。

  • 代码折叠: 此类别可以折叠或展开代码块,使我们能够隐藏不编辑的代码块,简化代码视图。我们可以使用编辑器中的图标折叠或展开块,如图中所示,或者使用代码中的折叠菜单。通用

  • 控制台: 此配置控制台。您可以修改命令历史大小或折叠的行数。

  • 编辑器标签: 此配置编辑器标签。我们建议您选择用星号标记已修改的标签选项,以便轻松检测已修改和未保存的文件。

  • 后缀补全: 这配置了一种称为后缀补全的代码补全类型。我们将在下一节中详细检查代码补全。

  • 智能键: 此类别配置在键入时自动执行的操作,例如添加闭合括号、引号或标签,以及在我们按下Enter键时缩进行。

颜色与字体

此类别更改字体和颜色。有许多选项和元素可以配置(关键字、数字、警告、错误、注释、字符串等)。您可以从颜色与字体设置的主屏幕配置中保存配置为方案。

代码样式

代码样式设置仅影响当前项目。您可以从此设置类别的主面板中保存样式配置为方案。您可以为以下几种文件类型分别配置:C/C++GroovyHTMLJavaJSONPropertiesXML和其他文件类型。

以下是一些您可以配置的样式功能:

  • 制表符和缩进: 配置是否要使用制表符或空格(我们建议不要使用制表符)以及它们的某些属性,例如大小或缩进。

  • 空格: 配置在括号前、运算符周围、左大括号前、关键字前等插入空格。

  • 换行和括号: 配置行断点、括号放置(例如,行尾下一行)、参数放置、控制语句等。

  • 空白行: 配置空白行的插入,例如在导入之前或之后、方法体周围或字段周围。

适当的代码风格可以使你的代码更容易理解。如果代码由多个开发者编写或你的代码与其他开发者共享,使用通用的代码风格非常重要。

文件和代码模板

此类别允许你编辑和创建文件、文件头或代码的模板。文件和代码模板设置仅影响当前项目。你可以从设置类别的主面板保存样式配置为方案。

你可以使用详细面板中解释的一些预定义变量来更改你项目的文件头模板(${PACKAGE_NAME}, ${USER}, ${DATE}, ${TIME}, ${PROJECT_NAME} 等)。

点击文件和代码模板设置的包含选项卡,并选择文件头模板。每次创建新文件时,都会添加以下头部:

/**
 * Created by ${USER} on ${DATE}.
 */

你可以通过添加文件包来修改它:

/**
 * ${PACKAGE_NAME}
 * Created by ${USER} on ${DATE}.
 */

你还可以创建和修改在创建新活动、片段、服务、资源文件等时应用的模板。例如,这是活动的模板:

package ${PACKAGE_NAME};

import android.app.Activity;
import android.os.Bundle;

#parse("File Header.java")
public class ${NAME} extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

你可以在 IntelliJ IDEA 文档中了解更多信息,链接为 www.jetbrains.com/help/idea/2016.1/file-and-code-templates.html

代码补全

代码补全通过使用基于我们刚刚输入的内容动态生成的建议列表自动完成代码,帮助我们快速编写代码。

基本代码补全是在我们输入时出现的建议列表,如下面的截图所示。如果列表没有显示,按 Ctrl空格键 打开它:

代码补全

继续输入,从列表中选择一个命令,然后按 Enter 键或双击以将其添加到你的代码中。如果你正在编写的代码是一个表达式,并且想要以否定形式插入该表达式,则从建议列表中选择该表达式,而不是按 Enter 键或双击它,按感叹号键 (!)。表达式将以否定形式添加。

代码补全的另一个实用功能是语句补全。输入一个语句,按Ctrl + Shift + Enter(在 OS X 上为Cmd + Shift + Enter),注意如何自动添加结束标点符号。如果你在输入if关键字后按这些键,将添加括号和方括号以完成条件语句。此快捷键也可以用于完成方法声明。开始输入一个方法,在输入开括号或方法参数后,按Ctrl + Shift + Enter(在 OS X 上为Cmd + Shift + Enter)。将添加闭括号和方括号以完成方法规范。

智能类型补全

另一种代码补全类型是智能类型代码补全。如果你正在输入一个带有String参数的方法调用命令,那么只建议String对象。这种智能补全发生在赋值语句的右侧、方法调用的参数、返回语句或变量初始化器中。要打开智能建议列表,请按Ctrl + Shift键,然后按空格键。

要显示这两种类型建议列表之间的差异,在你的代码中创建两个不同类的对象,Stringint。然后调用一个带有String参数的方法,例如Log类的i方法。在输入String参数时,注意打开基本建议列表(Ctrl + 空格键),如下一个截图所示,以及打开智能类型建议列表(Ctrl + Shift + 空格键),如第二个截图所示:

智能类型补全

在第一个列表中,如前一个截图所示,建议了两个对象,尽管int对象与参数类不匹配。在第二个列表中,如以下截图所示,只建议String对象:

智能类型补全

后缀补全

后缀补全是一种代码补全类型,它将已输入的表达式进行转换。转换取决于你写的后缀、上下文和表达式的类型。后缀表达式在基本代码补全建议列表中建议。以下是一个后缀模板示例notnull,如以下截图所示:

后缀补全

当你将notnull模板应用于表达式expr时,表达式将转换为if (expr != null)。前一个截图中的表达式在执行notnull转换后成为以下代码:

if (savedInstanceState != null) {
}

如果你只想在建议列表中看到可用的后缀模板,请按Ctrl + J(在 OS X 上为Cmd + J)。下一个截图中的对话框列出了可以应用于当前表达式的所有可用后缀模板:

后缀补全

您可以从编辑器设置中管理不同的后缀模板,在常规 | 后缀完成中。所有可用模板的完整列表及其描述在右侧面板中显示。

下一张截图显示了for后缀模板的描述和转换:

后缀完成

代码生成

要在类中生成代码块,请导航到代码 | 生成,或者按Alt + Insert快捷键 (在 OS X 上为Cmd* + N)。将显示如下对话框:

代码生成

生成菜单中,您可以生成构造函数、获取器和设置器方法、超方法调用,或者equalstoString方法。我们还可以重写或委派方法。

生成代码的另一种方式是将一些代码用语句(ifif/elsewhilefortry/catch等)包围起来。选择一行代码,并导航到代码 | ** Surround With,或者按Ctrl + Alt + T (在 OS X 上为Cmd* + Alt + T)。以下截图显示了 Surround With**选项的菜单:

代码生成

第三种选项,如前一张截图所示,是插入一个Live Template。您可以使用** Surround With选项将代码包围在一个Live Template中,或者导航到代码** | ** Surround with Live Templates**,或者按Ctrl + Alt + J (在 OS X 上为Cmd* + Alt + J)。

导航到代码 | 插入 Live Templates,或者按Ctrl + J (在 OS X 上为Cmd* + J)以打开可用 Live Templates 的对话框。这些模板可以插入用于迭代集合、数组、列表等的代码;用于打印格式化字符串的代码;用于抛出异常的代码;或用于添加静态和最终变量的代码。对话框的左侧显示每个模板的前缀。如果您在编辑器中输入前缀并按Tab键,代码模板将自动添加。

在我们主活动的onCreate方法末尾输入inn并按Tab键。将出现一个条件块。在这个新块中,输入soutv并再次按Tab键。结果如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
 System.out.println("savedInstanceState = " + savedInstanceState);
 }
}

导航代码

导航到声明或类型声明最直接的方式是按下Ctrl (在 OS X 上为Cmd)并点击显示为链接的方法名称。此选项也可以从导航 | 声明菜单或按Ctrl* + B (在 OS X 上为Cmd* + B)访问。

我们可以从编辑器的左侧边缘导航到方法层次结构。在属于方法层次结构的方法声明旁边,有一个图标指示方法是否实现接口方法、实现抽象类方法、覆盖超类方法,或者被其他后代实现或覆盖。点击这些图标以导航到层次结构中的方法。此选项也可以通过导航 | 超类方法导航 | 实现访问。你可以在我们第一个项目的活动主类(MainActivity.java)中测试它,如下面的截图所示:

导航代码

在编辑器的左侧边缘,你可以找到另一种类型的导航图标。打开你的主活动类,查看下一个截图所示的转到相关文件图标:

导航代码

转到相关文件菜单,你可以导航到与当前文件和类相关的文件。在这个例子中,相关文件是与你的活动关联的布局文件以及应用清单文件。

与代码导航相关的另一个有用工具是自定义区域的使用。自定义区域是你想要分组并命名的代码片段。例如,如果一个类有多个方法,我们可以创建一些自定义区域来在这些方法之间分配它们。区域有一个名称或描述,并且可以通过代码折叠来折叠或展开。

要创建一个自定义区域,我们可以使用代码生成。选择代码片段,导航到代码 | 环绕,并选择以下两个选项之一:

  • <editor-fold…> 注释

  • region…endregion 注释

这两个选项都创建一个区域,但使用不同的样式。

当我们使用自定义区域时,我们可以使用导航菜单中的自定义折叠菜单来导航到它们。其余的导航选项都可以从导航菜单中访问。以下是一些选项:

  • /文件/符号:通过名称查找类、文件或符号。

  • :此选项通过编号跳转到代码行。

  • 上次编辑位置:这会导航到最近的更改点。

  • 测试:这会导航到当前类的测试。

  • 文件结构:这会打开一个对话框,显示文件结构。打开我们主活动的文件结构,观察结构是如何呈现的,显示方法列表以及指示元素类型或可见性的图标,如下面的截图所示:导航代码

  • 类型层次结构:这会打开一个对话框,显示所选对象的类型层次结构。

  • 方法层次结构:这会打开一个对话框,显示所选方法的方法层次结构。

  • 调用层次结构:这会打开一个对话框,显示所选方法的调用层次结构。

  • 下一个高亮错误:这会导航到下一个错误。

  • 上一个高亮错误: 这将导航到上一个错误。

  • 下一个方法: 这将导航到下一个方法。

  • 前一种方法: 这将导航到前一种方法。

有用的快捷键

您可以通过 设置 中的 键映射 选项找到所有可用的快捷键并更改它们。如果您双击操作,将显示 编辑快捷键 菜单。从该菜单中,您可以删除快捷键或添加新的快捷键,这可以是键盘快捷键、鼠标快捷键或缩写。

以下列表中包含了一些 Windows 和 OS X 的有用快捷键:

  • Ctrl + W (Alt + 向上箭头在 OS X 上): 这将根据语法选择表达式。按这些键重复以扩展选择。相反的命令是 Ctrl + Shift + W (Alt + 向上箭头在 OS X 上)。

  • Ctrl + / (Cmd + / 在 OS X 上): 这将对所选代码的每一行进行注释。要使用块注释,请使用 Ctrl + Shift + / (Alt + Cmd + / 在 OS X 上)。

  • Ctrl + Alt + I: 这将缩进所选代码。这在清理你完成编写后的代码块或方法时非常有用。

  • Ctrl + Alt + O: 这将优化导入,删除未使用的导入,并重新排序其余的导入。

  • Shift + Ctrl + 方向键 (Alt + Shift + 方向键在 OS X 上): 这将所选代码移动到上一行或下一行。

  • Alt + 方向键 (Ctrl + 方向键在 OS X 上): 这将在编辑器的打开标签页之间切换。

  • Ctrl + F (Cmd + F 在 OS X 上): 这将在编辑器的活动标签页中查找字符串。

  • Ctrl + R (Cmd + R 在 OS X 上): 这将在编辑器的活动标签页中替换字符串。

  • Ctrl + A (Cmd + A 在 OS X 上): 这将选择打开文件的全部代码。

  • Ctrl + D (Cmd + D 在 OS X 上): 这将复制所选代码并将其粘贴到选择的末尾。如果没有选择代码,则整个行将被复制并粘贴到新行中。

  • Ctrl + Y (Cmd + Delete 在 OS X 上): 这将删除整行,而不留下空白行。

  • Ctrl + Shift + U (Cmd + Shift + U 在 OS X 上): 这将切换大小写。

  • Ctrl + O (Cmd + O 在 OS X 上): 这将打开一个搜索框,以便在项目类中导航。

  • Ctrl + Shift + O (Cmd + Shift + O 在 OS X 上): 这将打开一个搜索框,以便在项目文件中导航。

  • Ctrl + Shift + A (Cmd + Shift + A 在 OS X 上): 这将打开一个搜索框,以便在 IDE 中导航到可用的操作。

  • Tab: 这将移动到下一个参数。

摘要

到本章结束时,您应该已经学会了一些有用的技巧和提示,以便充分利用代码编辑器。您现在知道如何使用代码补全、代码生成以及一些有用的快捷键来加快不同的操作。我们还自定义了我们的代码编辑器,现在可以开始编程了。

在下一章中,我们将开始使用布局创建我们的第一个用户界面。你将学习如何使用图形向导创建布局,以及通过使用基于文本的视图编辑 XML 布局文件。我们将使用文本视图组件创建我们的第一个应用程序,一个经典的Hello World示例。你还将学习如何为多个屏幕尺寸准备我们的应用程序,并适应不同的设备方向。最后,你将了解 UI 主题以及如何处理事件。

小贴士

下载示例代码

代码本书的序言中详细说明了下载代码包的步骤。本书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Android_Studio_2_Essentials_Second_Edition_Code。我们还有其他来自我们丰富图书和视频目录的代码包,可在github.com/PacktPublishing/找到。去看看它们吧!

第五章:创建用户界面

现在我们已经创建了第一个项目,并且熟悉了代码编辑器和其功能,我们将通过创建用户界面来开始我们的应用程序。在 Android Studio 中创建用户界面有不止一种方法吗?你如何向用户界面添加组件?你是否曾经想过如何让你的应用程序支持不同的屏幕尺寸和分辨率?

本章重点介绍使用布局创建用户界面。布局可以通过图形视图或基于文本的视图创建。你将学习如何使用这两种方式来创建你的布局。我们还将使用简单的组件编写一个Hello World应用程序。由于有超过 18,000 种 Android 设备类型,你将了解不同屏幕类型上的碎片化问题,我们将讨论如何为这个问题准备我们的应用程序。我们将以处理我们应用程序中的事件的基本概念结束本章。

本章我们将涵盖以下主题:

  • 现有的布局编辑器

  • 创建新布局

  • 添加组件

  • 支持不同屏幕

  • 更改 UI 主题

  • 处理事件

图形编辑器

在我们的项目中打开位于 /src/main/res/layout/activity_main.xml 的主布局。图形编辑器将默认打开。图形编辑器的中心面板是预览,在这里你可以查看你的布局看起来如何。从预览中你可以看到,最初这个主布局只包含一个带有Hello World!信息的文本视图。要切换图形和文本编辑器,请点击屏幕底部的设计文本标签,如图所示:

图形编辑器

工具栏选项包含一些可以用来更改布局样式和预览的选项。以下截图所示的工具栏选项将在本章中解释:

图形编辑器

组件树面板显示了布局中放置的组件作为层次结构。在我们的布局中有两个组件:一个作为根元素的RelativeLayout,以及一个显示Hello World!信息的TextView。当你选择组件树面板上的一个元素时,该元素在预览中突出显示,其属性列在属性检查器面板中。它显示了从布局中选择的组件的属性,并允许我们更改它们。调色板列出了可以放置在我们布局中的现有用户界面UI)组件。它将组件组织在不同的类别中。让我们看看组件调色板中可用的选项:

  • 布局: 布局是一个容器对象,用于在屏幕上分布组件。UI 的根元素是一个布局对象,但布局也可以包含更多的布局,从而创建一个由布局结构化的组件层次结构。建议尽可能保持此布局层次结构简单。我们的主布局以RelativeLayout作为根元素。

  • Widgets: 这个类别包含文本视图、按钮、复选框、开关、图像视图、进度条、滑动条、评分条、旋转器和网页视图等选项。它们是最常用的组件,并且被用于大多数布局中。我们的主布局在根相对布局内包含TextView

  • 文本字段: 这些是可以编辑的字段,用户可以在其中输入不同类别的文本。不同选项之间的区别在于用户可以输入的文本类型。

  • 容器: 这个类别将具有共同行为的组件分组。单选按钮组、列表视图、网格视图、滚动视图和标签宿主是一些例子。

  • 日期和时间: 这个类别包含以日历或时钟形式相关的日期和时间组件。

  • 专家: 这个类别中的组件不如Widgets类别中的组件常见,但值得一看。

  • 自定义: 这个类别包含允许我们包含自定义组件的组件,这些组件通常是我们的项目中的其他布局。

基于文本的编辑器

通过点击文本选项卡将图形编辑器更改为文本编辑器:

基于文本的编辑器

工具栏面板与图形编辑器上的相同。预览窗口显示布局,但不能更改。要更改,您应该使用设计选项卡。组件是通过它们的 XML 声明添加到布局中的。属性也是通过 XML 声明配置的。与图形编辑器一样,文本编辑器包含两个 XML 元素:作为根元素的相对布局和根布局内的文本视图元素。

XML 标签名称定义了我们声明的组件类型。对于相对布局,我们使用RelativeLayout标签,对于文本视图,我们使用TextView标签。我们可以通过在 XML 标签中包含属性来向元素添加属性。例如,我们主布局中的文本视图有三个属性:

  • android:layout_widthwrap_content值:此属性设置元素在其父元素内部的高度。wrap_content值意味着元素的高度将由其内容宽度决定。您可以为此属性设置的另一个默认值是match_parent,这意味着元素将具有与其父元素相同的宽度。

  • android:layout_heightwrap_content值:此属性设置元素在其父元素内部的高度。值的行为与宽度相同。

  • android:text,值为Hello World!:此属性设置要在文本视图中显示的文本。

创建新布局

当我们创建主活动时,关联的布局也会被创建。这是在创建活动时创建布局的一种方式。

要添加一个不创建新活动的独立布局,在layout文件夹(res/layout/)上右键单击,然后导航到新建 | 布局资源文件。你还可以使用相同的右键菜单通过导航到新建 | XML | 布局 XML 文件来创建布局文件。你还可以使用顶部的文件菜单导航到这两个选项。下一个截图将显示以下对话框以配置新的布局组件:

创建新布局

输入布局文件名根标签。我们主布局的根元素是一个相对布局,但你可以选择不同的根标签。布局有五种类型:

  • FrameLayout:这种布局通常在屏幕的一个安排区域内只显示一个子组件。如果添加了多个子组件,则视图将堆叠显示。

  • LinearLayout:这种布局通过将子组件一个接一个地排列在一个方向上来显示其子组件。线性布局有两种类型:垂直和水平,这由布局的android:orientation属性来识别。

  • TableLayout:这种布局通过在行和列中分配子组件来显示其子组件。除了表格布局外,还需要使用TableRow元素来创建行和列的分配。

  • GridLayout:这种布局通过在矩形网格中显示其子组件。子组件可以使用rowSpeccolumnSpec等属性填充多个单元格。

  • RelativeLayout:这种布局通过子组件之间的相对位置来显示其子组件。你必须使用子视图中的位置属性来确定它们的位置。至少需要一个子视图具有相对于父视图的位置属性,这样该子视图以及相对于它的视图就可以在父布局内定位。这些属性中的一些是android:layout_belowandroid:layout_toLeftOfandroid:layout_alignBottom

一旦创建了布局,可以使用编辑器将其关联的活动更改为不同的活动。如果布局没有活动,任何现有的活动都可以从编辑器中链接到它。要完成此操作,在布局编辑器的工具栏中搜索关联活动选项,点击它,然后选择关联到其他活动选项,如图所示:

创建新布局

将打开一个对话框,列出你项目的所有活动,你可以从中选择一个。

添加组件

我们的主要布局是一个相对布局,包含一个显示Hello World!的文本视图。现在让我们添加一个新的组件。最简单的方法是使用图形编辑器,所以打开设计选项卡。选择一个组件并将其拖动到布局预览中;例如,导航到文本字段中的姓名组件,并将其放置在文本视图下方。

由于我们的根布局是相对布局,当你拖动布局中的元素时,会显示一些参考线。当你尝试在布局中拖放元素时,与位置相关的属性也会在预览的顶部部分显示。以下截图中的这些线和建议的属性可以帮助你正确地对齐屏幕上的元素。它们还有助于你设置元素相对于布局中已存在的其他元素的位置。

添加组件

上一截图中的预览面板中建议的属性将文本字段对齐到父元素的左侧(alignParentLeft),将文本字段的位置设置为在Hello World!文本视图下方(below=textView),并为文本视图添加 38 dp 的边距(margin=38 dp)。

组件树视图中,现在有一个新的editText对象。保持文本字段选中状态,以检查在属性检查器中加载的属性。让我们更改其中一些属性,并观察布局预览和组件树中的差异:

  • layout:width:此选项将使字段的宽度适应其内容。其当前值是wrap_content。将其更改为match_parent以适应父布局的宽度(根相对布局)。

  • 提示:将字段的提示信息设置为Enter your name。当字段为空时,提示信息会显示出来,以指示应输入的信息。由于字段有一个默认值Name,所以提示信息是不可见的。

  • id:当前的 ID 是@+id/editText。ID 将在代码中使用以获取对对象的访问权限,并在组件树中显示。此 ID 也可以由布局中的其他元素使用,以确定它们相对于它的相对位置。将其更改为@+id/editText_name以方便地从其他文本字段中区分它。检查组件树窗口中组件 ID 是否也已更改,如下面的截图所示:添加组件

  • text:这将删除此字段的值。现在应该可以看到提示信息。

如果我们切换到文本编辑器,我们可以看到我们编辑过的文本字段的 XML 定义:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textPersonName"
    android:ems="10"
    android:id="@+id/editText_name"
    android:layout_marginTop="38dp"
	android:layout_below="@+id/textView"
	android:layout_alignParentLeft="true"
    android:hint="Enter your name"
/>

XML 定义的属性有推荐的顺序。特定的顺序有助于在阅读代码时理解代码,并使修改元素更容易。选择EditText代码定义并执行代码菜单中的格式化代码操作。现在属性顺序已更改,将android:id放置在第一个位置:

<EditText
    android:id="@+id/editText_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/textView"
    android:layout_marginTop="38dp"
	android:ems="10"
	android:hint="Enter your name"
    android:inputType="textPersonName" 
/>

当你在布局中拖动编辑文本时,你可以检查与图形编辑器中显示的属性相匹配的位置属性(android:layout_marginTopandroid:layout_belowandroid:layout_alignParentLeft)。请注意,android:layout_below属性使用文本视图的 ID 来识别它。

从文本编辑器,也可以更改现有组件及其属性。将文本视图 ID(android:id属性)从@+id/textView更改为@+id/textView_greeting。具有描述性的 ID 很重要,因为它将被我们的代码使用。描述性变量名允许代码自我说明。您需要将所有对文本视图 ID 的引用更改为新 ID。

让我们这次使用文本编辑器添加另一个组件。按打开标签键并开始键入Button。将出现一个建议列表,以帮助您完成代码。让建议列表出现并选择一个Button对象。在Button标签内,添加以下属性:

  • android:id,值为@+id/button_accept:这创建了 ID 属性。

  • android:layout_width,值为wrap_content:这使宽度适应按钮内容。

  • android:layout_height,值为wrap_content:这使高度适应按钮内容。

  • android:layout_below,值为@id/editText_name:这将在名称文本字段下方放置按钮。我们通过其 ID(@id/editText_name)引用名称文本字段。

  • android:layout_centerHorizontal,值为true:这将在父布局中水平居中按钮。

  • android:text,具有Accept值:这设置了按钮的文本。向组件添加文本的推荐方式是将它添加到strings.xml文件中。组件应配置为使用字符串标识符,而不是直接使用字符串。为了简单起见,我们直接将字符串添加到按钮中。

按钮的最终 XML 定义如下:

<Button
  android:id="@+id/button_accept"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_below="@+id/editText_name"
  android:layout_centerHorizontal="true"
  android:text="Accept"
/>

按钮在预览中显示。下一张截图显示,如果我们切换到图形编辑器,按钮将在其中显示,并在组件树中显示:

添加组件

组件属性

我们在主布局中添加或修改的属性也可以通过代码进行修改,而不仅仅是使用布局编辑器。例如,如果你在代码中有一个Button对象,你可以使用setText方法来更改其文本:

myButton.setText("Accept");

可用于View对象的某些属性如下:

  • android:alpha: 这个 XML 属性设置视图的 alpha 值,介于01之间,表示视图的不透明度。您也可以使用代码中的setAlpha方法。

  • android:background: 这个 XML 属性设置视图的背景。您也可以使用代码中的setBackground方法。

  • android:clickable: 这个 XML 属性设置视图是否可点击,是否接收点击事件。您也可以使用代码中的setClicklable方法。

  • android:elevation: 这个 XML 属性设置视图的抬升值,即其 z 深度值。您也可以使用代码中的setElevation方法。

  • android:fadeScrollbars: 这个 XML 属性设置当滚动条未使用时是否淡出。您也可以使用代码中的setScrollbarFadingEnabled方法。

  • android:focusable: 这个 XML 属性设置视图是否可以获取焦点。您也可以使用代码中的setFocusable方法。

  • android:foreground: 这个 XML 属性设置视图的前景。您也可以使用代码中的setForeground方法。

  • android:foregroundTint: 这个 XML 属性设置视图前景的着色颜色。您也可以使用代码中的setForegroundTintList方法。

  • android:id: 这个 XML 属性设置视图的标识符。您也可以使用代码中的setId方法。

  • android:minHeight: 这个 XML 属性设置视图应具有的最小高度。您也可以使用代码中的setMinimumHeight方法。

  • android:minWidth: 这个 XML 属性设置视图应具有的最小宽度。您也可以使用代码中的setWidth方法。

  • android:padding: 这个 XML 属性设置视图四边的填充。您也可以使用代码中的setPadding方法。与此属性类似的还有:android:paddingBottomandroid:paddingEndandroid:paddingLeftandroid:paddingRightandroid:paddingStartandroid:paddingTop

  • android:scrollIndicators: 这个 XML 属性设置是否为视图显示滚动指示器。您也可以使用代码中的setScrollIndicators方法。

  • android:textAlignment: 这个 XML 属性设置视图中文本的对齐方式。您也可以使用代码中的setTextAlignment方法。

  • android:visibility: 这个 XML 属性设置视图是否可见。您也可以使用代码中的setVisibility方法。

除了View对象属性外,View子类还可以提供一些更具体的属性。例如,TextView对象也有这些属性:android:editableandroid:fontFamilyandroid:hintandroid:textandroid:textColor

支持多屏幕

在创建 Android 应用程序时,我们必须考虑到存在多种屏幕尺寸和屏幕分辨率。检查我们的布局在不同屏幕配置中的显示方式非常重要。为了实现这一点,Android Studio 提供了一个功能,可以在设计模式下更改渲染布局预览的虚拟设备。

我们可以在工具栏中找到这个功能,点击它以打开可用设备定义的列表,如下面的截图所示:

支持多屏幕

尝试其中一些。平板设备与 Nexus 系列设备等之间的差异非常明显。我们应该将视图适配到我们应用程序支持的所有屏幕配置,以确保它们能够最优显示。请注意,Android Wear(方形圆形带下巴的圆形设计)和 Android TV 都有设备定义。

设备定义指示屏幕尺寸、分辨率和屏幕密度。Android 屏幕密度包括 ldpi、mdpi、tvdpi、hdpi、xhdpi,甚至 xxhdpi。让我们看看它们的值:

  • ldpi:这是低密度每英寸点数,其值约为 120 dpi

  • mdpi:这是中等密度每英寸点数,其值约为 160 dpi

  • tvdpi:这是中等密度每英寸点数,其值约为 213 dpi

  • hdpi:这是高密度每英寸点数,其值约为 240 dpi

  • xhdpi:这是超高密度每英寸点数,其值约为 320 dpi

  • xxhdpi:这是超超高密度每英寸点数,其值约为 480 dpi

  • xxxhdpi:这是超超超高密度每英寸点数,其值约为 640 dpi

Google 发布的最新仪表板显示,大多数设备具有高密度屏幕(42.3%),其次是 xhdpi(24.8%)和 xxhdpi(15.0%)。因此,通过使用这三个屏幕密度测试我们的应用程序,我们可以覆盖所有设备的 82.1%。如果您想覆盖更多比例的设备,还可以使用 mdpi 屏幕(12.9%)测试您的应用程序,这样覆盖率将达到所有设备的 95.0%。官方 Android 仪表板可在developer.android.com/about/dashboards找到。

另一个需要考虑的问题是设备方向。我们想在应用程序中支持横屏模式吗?如果是的话,那么我们必须在横屏方向测试我们的布局。在工具栏上,点击布局状态选项以更改模式,从纵向切换到横屏或从横屏切换到纵向。

如果我们的应用程序支持横屏模式,并且布局在此方向上未按预期显示,我们可能需要创建布局的变体。点击工具栏的第一个图标,即 配置以在 IDE 中渲染此布局 选项,并选择 创建横屏变体 选项,如图下所示:

支持多屏幕

在编辑器中将打开一个新的布局。此布局已在 resources 文件夹下的 layout-land 目录中创建,并使用与横屏布局相同的名称 - /src/main/res/layout-land/activity_main.xml。Android 系统将根据当前设备方向决定需要使用哪个版本的布局。现在,我们可以编辑新的布局变体,使其完美符合横屏模式。

同样,我们可以为超大型屏幕创建布局的变体。选择 创建 layout-xlarge 变体 选项。新布局将在 layout-xlarge 文件夹中创建,使用与原始布局相同的名称 - /src/main/res/layout-xlarge/activity_main.xml。Android 将分为实际屏幕尺寸的小型、正常、大型和超大型:

  • 小型:本类别中的屏幕至少为 426 dp x 320 dp。

  • 正常:本类别中的屏幕至少为 470 dp x 320 dp。

  • 大型:本类别中的屏幕至少为 640 dp x 480 dp。

  • 超大型:本类别中的屏幕至少为 960 dp x 720 dp。

密度无关像素dp)相当于在 160 dpi 屏幕上的一个物理像素。谷歌发布的最新仪表板显示,大多数设备具有正常屏幕尺寸(85.1%),其次是大型屏幕尺寸(8.2%)。官方的 Android 仪表板可在 developer.android.com/about/dashboards 查找。

要同时显示多个设备配置,请点击工具栏中的 配置以在 IDE 中渲染此布局 选项,并选择 预览所有屏幕尺寸 选项,或者点击 预览代表性样本 选项以仅打开最重要的屏幕尺寸,如图下所示。我们还可以通过右键单击并从菜单中选择 删除 选项来删除任何样本。此菜单的另一个有用操作是 保存截图 选项。它允许我们捕获布局预览的截图:

支持多屏幕

如果我们创建了不同的布局变体,我们可以通过选择 预览布局版本 选项来预览所有这些变体。如果我们想预览不同 Android 版本的布局外观,我们可以使用 预览 Android 版本 选项。

现在我们已经了解了如何添加不同的组件以及如何为不同屏幕优化我们的布局,让我们开始使用主题。

更改 UI 主题

布局和小部件使用我们项目的默认 UI 主题创建。我们可以通过创建样式来更改 UI 元素的外观。样式可以分组以创建主题,主题可以应用于活动或整个应用。一些主题是默认提供的,例如Material DesignHolo样式。样式和主题作为资源创建在/src/res/values文件夹下。

为了继续我们的示例,我们将更改我们在应用中使用的主题的默认颜色。使用图形编辑器,您可以看到我们的布局所选的主题在工具栏中显示为AppTheme。此主题是为我们的项目创建的,可以在styles文件中的/src/res/values/styles.xml找到。

打开styles文件。Android Studio 建议我们使用主题编辑器。您可以点击消息链接,或者您可以导航到工具 | Android | 主题编辑器来打开它。您可以在下一张屏幕截图中看到主题编辑器

更改 UI 主题

左侧面板显示了不同的 UI 组件的外观。例如,您可以查看应用栏、不同类型的按钮、文本视图或状态栏的外观。主题编辑器的右侧面板包含主题的设置。您可以从右侧面板更改值,并查看主题编辑器左侧面板中的组件如何变化。

在右侧配置面板中,您可以更改主题以进行修改,您可以更改所选主题的主题父级,并且可以更改主题颜色。您会注意到AppTheme默认是另一个主题Theme.AppCompat.Light.DarkActionBar的扩展。

让我们尝试更改我们应用的主颜色。按照以下步骤操作:

  1. 主题编辑器的右侧面板中查找colorPrimary属性。

  2. 点击colorPrimary属性的彩色方块。以下屏幕截图将打开颜色选择器:更改 UI 主题

  3. 选择不同的颜色,然后点击确定按钮。请注意,主题已更改,现在应用栏在主题编辑器中显示新颜色。

  4. 打开您的主布局文件。布局预览的颜色也发生了变化。由于我们在主题中而不是仅在布局中配置了它,因此此主题主颜色将应用于所有我们的布局。

颜色的规范保存在/src/res/values/colors.xml中的colors文件中。这是colors文件当前的内容:

<resources>
    <color name="colorPrimary">#009688</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>

您也可以从该文件更改颜色。修改colorPrimaryDark,保存文件,并注意在主题编辑器中,状态栏颜色已更改为新颜色。切换到您的主布局文件,并观察布局预览也已更改为显示状态栏中的新颜色。

要完全更改布局主题,请在图形编辑器的工具栏中单击主题选项。现在将打开主题选择对话框,显示可用的主题列表,如下面的屏幕截图所示:

更改 UI 主题

在我们自己的项目中创建的主题列在 项目主题 部分中。清单主题 部分显示了在应用程序清单文件(/src/main/AndroidManifest.xml)中配置的主题。所有 部分列出了所有可用的主题。

处理事件

如果应用程序的其余部分无法与之交互,则用户界面将毫无用处。Android 中的事件是在用户与我们的应用程序交互时生成的。所有 UI 小部件都是 View 类的子类,并且它们共享以下监听器处理的一些事件:

  • OnClickListener: 这捕捉了用户点击视图元素时的事件。要在视图中配置此监听器,请使用 setOnClickListener 方法。OnClickListener 接口声明以下方法以接收点击事件:

    public abstract void onClick(View v)
    
  • OnCreateContextMenu: 这捕捉了用户在视图元素上执行长按操作并希望打开上下文菜单时的事件。要在视图中配置此监听器,请使用 setOnCreateContextMenu 方法。OnCreateContextMenu 接口声明以下方法以接收长按事件:

    public abstract void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    
  • OnDragListener: 这捕捉了用户拖动并放下事件元素时的事件。要在视图中配置此监听器,请使用 setOnDragListener 方法。OnDragListener 接口声明以下方法以接收拖动事件:

    public abstract boolean onDrag(View v, DragEvent event)
    
  • OnFocusChangedListener: 这捕捉了用户在相同视图中从一个元素导航到另一个元素时的事件。要在视图中配置此监听器,请使用 setOnFocusChangedListener 方法。OnFocusChangedListener 接口声明以下方法以接收焦点更改事件:

    public abstract void onFocusChange(View v, boolean hasFocus)
    
  • OnHoverListener: 这捕捉了用户在元素上移动时的事件。要在视图中配置此监听器,请使用 setOnHoverListener 方法。OnHoverListener 接口声明以下方法以接收悬停事件:

    public abstract boolean onHover(View v, MotionEvent event)
    
  • OnKeyListener: 这捕捉了用户在视图元素具有焦点时按下任何键的事件。要在视图中配置此监听器,请使用 setOnKeyListener 方法。OnKeyListener 接口声明以下方法以接收按键事件:

    public abstract boolean onKey(View v, int keyCode, KeyEvent event)
    
  • OnLayoutChangeListener: 这捕捉了视图布局因布局处理而更改其边界时的事件。要在视图中配置此监听器,请使用 setOnLayoutChangeListener 方法。OnLayoutChangeListener 接口声明以下方法以接收布局更改事件:

    public abstract void onLayoutChange(View v,
    int left, int top, int right, int bottom,
    int oldLeft, int oldTop, int oldRight, int oldBottom)
    
  • OnLongClickListener:这个监听器捕获用户触摸视图元素并保持触摸的事件。要在视图中配置这个监听器,使用setOnLongClickListener方法。OnLongClickListener接口声明以下方法来接收长按事件:

    public abstract boolean onLongClick(View v)
    
  • OnScrollChangeListener:这个监听器捕获视图滚动位置改变的事件。要在视图中配置这个监听器,使用setOnScrollChangeListener方法。OnScrollChangeListener接口声明以下方法来接收滚动改变事件:

    public abstract void onScrollChange(View v, 
    int scrollX, int scrollY, 
    int oldScrollX, int oldScrollY)
    
  • OnTouchListener:这个监听器捕获用户触摸视图元素的事件。要在视图中配置这个监听器,使用setOnTouchListener方法。OnTouchListener接口声明以下方法来接收触摸事件:

    public abstract boolean onTouch(View v, MotionEvent event)
    

除了这些标准事件和监听器之外,一些 UI 小部件还有一些更具体的事件和监听器。复选框可以注册一个监听器来捕获其状态改变时的事件(OnCheckedChangeListener),而旋转选择器可以注册一个监听器来捕获项目被点击时的事件(OnItemClickListener)。

最常见的捕获事件是当用户点击视图元素时。有一个简单的方法来处理它——使用视图属性。在我们的布局中选择接受按钮,并查找onClick属性。这个属性指示当用户按下按钮时将执行的方法的名称。这个方法必须在关联当前布局的活动(在这种情况下是我们的主活动MainActivity.java)中创建。将此属性的值设置为onAcceptClick

打开主活动以创建方法定义。当视图被点击时,事件回调方法必须是公共的,并具有void返回类型。它接收被点击的视图作为参数。此方法将在用户每次点击按钮时执行:

public void onAcceptClick(View v) {
  // Action when the button is pressed
}

从主活动,我们可以与界面的所有组件进行交互,所以当用户按下接受按钮时,我们的代码可以读取名称字段中的文本,并将问候语更改为包含该名称。

要获取view对象的引用,使用从Activity类继承的findViewById方法。此方法接收组件的 ID,并返回对应该 ID 的View对象。返回的视图对象必须转换为它的特定类,以便使用其方法,例如EditText类的getText方法,以获取用户输入的名称:

public void onAcceptClick(View v) {
  TextView tvGreeting =
    (TextView) findViewById(R.id.textView_greeting);
  EditText etName = (EditText) findViewById(R.id.editText_name);

  if(0 < etName.getText().length()) {
    tvGreeting.setText("Hello " + et_name.getText());
  }
}

在方法的头两行,获取布局元素的引用:包含问候语的文本视图和用户可以输入名字的文本字段。组件是通过它们的 ID 找到的,即我们在布局文件中元素属性中指定的相同 ID。所有资源 ID 都包含在R类中。R类在构建阶段自动生成,因此我们不应该编辑它。如果这个类没有自动生成,那么可能是一些资源文件中存在错误。

下一行是一个条件语句,用于检查用户是否输入了名字。如果他们输入了名字,文本将被替换为包含该名字的新问候语。在接下来的章节中,你将学习如何在模拟器中执行我们的应用程序,我们就能测试这段代码。

如果我们想要处理的事件不是用户的点击,那么我们必须通过代码在活动的onCreate方法中创建并添加监听器。有两种方法可以做到这一点:

  • 在活动中实现监听器接口,然后添加未实现的方法。接口所需的方法是用于接收事件的方法。

  • 在活动文件中创建一个私有的匿名监听器实现。接收事件的方法在这个对象中实现。

最后,必须使用设置方法(如setOnClickListenersetOnCreateContextMenusetOnDragListenersetOnFocusChangesetOnKeyListener等)将监听器实现分配给视图元素。监听器分配通常包含在活动的onCreate方法中。如果监听器在同一个活动中实现,那么传递给设置方法的参数是使用this关键字表示的自身活动,如下面的代码所示:

Button bAccept = (Button) findViewById(R.id.button_accept);
bAccept.setOnClickListener(this);

活动应该实现监听器和监听器接口所需的onClick方法:

public class MainActivity extends Activity 
implements View.OnClickListener {
  @Override
  public void onClick(View view) {
    // Action when the button is pressed
  }

如果我们使用一个私有的匿名类来实现它,代码如下所示:

bAccept.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Action when the button is pressed
    }
});

摘要

在这一章中,我们看到了如何使用图形和基于文本的编辑器创建和编辑用户界面布局。我们完成了我们的第一个小型应用程序,并使用一些基本组件对其进行了升级。你现在应该能够创建一个简单的布局,并使用不同的样式、屏幕尺寸和屏幕分辨率进行测试。你还了解了不同的可用 UI 主题。最后,你学习了关于事件以及如何使用监听器处理它们的内容。

在下一章中,你将了解 Android Studio 中一些有用的工具。我们将经常使用 SDK Manager 来安装不同的包。你还将了解 AVD Manager,用于测试不同虚拟设备上的应用程序。我们将使用 Javadoc 实用工具为我们的项目生成 Javadoc 文档,你还将了解 Android Studio 中可用的版本控制系统。

第六章. 工具

在上一章中,您学习了谷歌提供的有用服务,开发者可以使用这些服务来改进他们的应用程序。现在,您将了解 Android Studio 中可用的工具,这些工具可以让您的生活更轻松。您是否想过如何管理 Android 平台?您是否希望您的项目有清晰的文档?您是否作为一组开发者工作,并需要与 Android Studio 集成的版本控制管理器?

本章介绍了 Android Studio 中提供的最重要的附加工具:Android SDK 工具、Javadoc 和版本控制集成。首先,您将了解 Android Studio 中的 SDK 管理器,您可以通过它检查、更新和安装我们项目的不同组件。接下来,我们将回顾Android 虚拟设备AVD)管理器,在那里我们可以编辑我们将用于测试项目的虚拟设备。您还将学习如何使用 Javadoc 工具获得完整的文档,如何使用 Android Studio 中可用的系统进行版本控制,以及如何处理您的项目任务。

本章我们将涵盖以下主题:

  • SDK 管理器

  • AVD 管理器

  • Javadoc

  • 版本控制

  • 任务和上下文

软件开发工具包管理器

SDK 管理器是 Android Studio 中的一个工具,可用于控制我们的 Android SDK 安装。从这个工具中,我们可以检查系统中安装的 Android 平台,更新它们,安装新平台,或者安装其他组件,如 Google Play 服务或 Android 支持库。

要从 Android Studio 打开 SDK 管理器,请导航到工具 | Android | SDK 管理器。您也可以从工具栏中单击快捷方式。SDK 管理器是一个独立的 Android 工具,它已集成在 Android Studio 默认设置中的外观和行为 | 系统设置 | Android SDK,如下一张截图所示:

软件开发工具包管理器

Android Studio 中配置的 SDK 路径显示在管理器的顶部。您可以通过单击编辑按钮来更改其路径。SDK 管理器显示具有以下属性的可用SDK 平台包列表:

  • 名称:这是聚合相关包的容器名称。在包列表下勾选显示包详细信息复选框,以查看容器的详细信息。

  • API 级别:这是包添加时的 API 编号。

  • 修订版:这是包修订版或版本。

  • 状态:这是软件包在您系统中的状态。状态可以是未安装已安装有更新可用不兼容过时。如果未勾选显示软件包详细信息复选框,状态还可以是部分安装。当SDK 平台Android SDK 源软件包都安装时,未勾选显示软件包详细信息的情况下,容器软件包被视为已安装。如果只有其中之一安装,容器软件包的状态为部分安装

SDK 工具选项卡中,您可以管理可用的 SDK 开发者工具,例如Android SDK 平台工具Android 支持库Google Play 服务,这些将在第七章中解释,Google Play 服务

SDK 更新站点选项卡中,我们可以检查提供附加组件和额外软件包的官方站点列表。我们可以使用列表底部的添加按钮添加自定义外部站点。

点击屏幕底部的启动独立 SDK 管理器按钮以打开独立的 SDK 管理器。在 Android Studio 的旧版本中,这是唯一可用的选项。从独立的 SDK 管理器中,SDK 平台和工具的列表与集成 SDK 管理器中的列表类似,但我们还可以找到一些更多选项来过滤和选择软件包。

您可以使用列表下方的复选框根据其状态过滤软件包。这些选项也可以从顶部的软件包菜单中访问。

在软件包名称旁边有一个复选框,用于选择我们想要安装、更新或删除的软件包。如图所示,在系统中已安装且也有更新可用的软件包默认勾选:

软件开发工具包管理器

如果有未安装的新 Android 平台版本,其软件包也将被检查,如下面的截图所示:

软件开发工具包管理器

要安装或更新的所选软件包总数在对话框底部的按钮文本中指示。其下的按钮指示要删除的所选软件包总数。您可以删除已弃用或不再需要的软件包。

勾选需要更新的软件包,并勾选最后一个 Android 平台。此外,您还应该勾选我们应用程序支持的最小平台(Android 4.1.2,API 16),以便能够使用此版本在虚拟设备上测试我们的应用程序。点击安装按钮。

在下一个对话框中,我们必须接受软件包许可协议。勾选接受许可单选按钮,然后点击安装按钮。软件包的安装或更新将开始显示其进度。首先,管理器下载软件包,然后解压缩它们,最后安装它们。

记得定期检查 SDK 管理器以获取更新。

AVD 管理器

AVD 管理器是 Android Studio 中可访问的 Android 工具,用于管理将在 Android 模拟器中执行的手机虚拟设备。

要从 Android Studio 打开 AVD 管理器,请导航到工具 | Android | AVD 管理器。您也可以从工具栏中点击快捷方式。AVD 管理器显示现有虚拟设备的列表。由于我们尚未创建任何虚拟设备,列表最初将是空的。要创建我们的第一个虚拟设备,请单击创建虚拟设备按钮以打开配置对话框。

第一步是选择虚拟设备的硬件配置。设备定义列在窗口的左侧。设备定义可以分为以下类别之一:手机平板穿戴电视。在手机类别中选择一个,例如 Nexus 6,以查看右侧的详细信息,如下面的截图所示:

AVD 管理器

我们还可以从 AVD 管理器配置自己的硬件设备定义。我们可以使用新建硬件配置文件按钮创建一个新的定义。克隆设备…按钮创建现有设备的副本。

单击新建硬件配置文件按钮以检查现有配置参数。定义设备的参数包括:

  • 设备名称:这是设备的名称。

  • 设备类型:这是设备类型,可以是手机/平板Android WearAndroid TV

  • 屏幕尺寸:这是屏幕尺寸,以英寸为单位。此值决定了设备的尺寸类别。输入4.0的值,注意右侧的尺寸值(尺寸)变为正常,如下面的截图所示:AVD 管理器

    现在,输入7.0的值,尺寸字段将更改其值到,如下面的截图所示:

    AVD 管理器

    此参数,连同屏幕分辨率,也决定了密度类别。

  • 分辨率:这是屏幕分辨率,以像素为单位。此值决定了设备的密度类别。对于 4.0 英寸的屏幕尺寸,输入768 x 1280的值,并注意密度值变为360 dpi。将屏幕尺寸更改为6.0英寸,密度值将更改为hdpi。现在,将分辨率更改为480 x 800密度值将是mdpi

  • RAM:这是设备的 RAM 内存大小。

  • 输入:这配置软件和硬件输入。有硬件按钮复选框表示设备的返回主页菜单按钮是否通过软件或硬件可用。有硬件键盘复选框表示键盘是否通过软件或硬件可用。导航样式选择器通过方向垫(D-Pad)、轨迹球滚轮启用导航控件。

  • 支持的设备状态:这检查允许的状态,即纵向横向

  • 摄像头:这检查设备是否有前置摄像头后置摄像头

  • 传感器:这些是设备中可用的传感器。它们是加速度计陀螺仪GPS接近传感器

  • 默认皮肤:这选择额外的硬件控件。

创建一个屏幕大小为 5.5 英寸,分辨率为 1080 x 1920,RAM 值为 2048 MiB,软件按钮(留空输入框未勾选),并启用横竖屏两种状态的设备。命名为My Device。然后,点击完成按钮。硬件定义已添加到配置列表中。如果您右键单击新的硬件配置文件,您可以编辑它、克隆它、导出它或删除它。硬件配置文件使用 XML 格式导出。

点击下一步按钮继续创建新的虚拟设备。下一步是选择虚拟设备系统镜像和目标 Android 平台。每个平台都有自己的架构。系统镜像列在左侧面板上,所选系统镜像的详细信息显示在右侧面板上。如果详细面板中显示推荐消息,如下一张截图所示,请遵循推荐并选择不同的镜像。

AVD 管理器

除了系统镜像的发布名称外,还有一个下载按钮。选择 Marshmallow(API 级别 23)发布中带有 Google API 的推荐镜像之一,然后点击下载按钮。等待安装完成,然后点击下一步按钮。

最后一步是验证虚拟设备的配置。在AVD 名称字段中输入 AVD 的名称。给虚拟设备一个有意义的名称以便于识别,例如AVD_nexus6_api23。点击显示高级设置按钮。我们可以为虚拟设备配置的设置如下:

  • 启动大小和方向:选择屏幕大小和设备的初始方向。我们建议选择自动缩放。

  • 摄像头:如果模拟器有前置摄像头或后置摄像头,请选择此选项。摄像头可以是模拟的(模拟设备实际上使用摄像头录制视频)或真实(通过计算机上的网络摄像头)。

  • 网络:选择模拟网络的速率和处理网络数据延迟。这对于测试低连接或缺失响应的应用程序很有用。

  • 模拟性能:选择设备中图形的渲染方式。它们可以使用你的计算机的图形(硬件)或通过软件模拟(软件)。我们建议选择自动选项。

  • 内存和存储:选择虚拟设备的内存参数。保留默认值不变,但如果显示警告信息,请遵循该信息的说明。例如,选择1536M作为RAM内存,64作为VM Heap内部存储选项也可以配置,例如,200 MiB。选择SD 卡的大小或选择一个文件作为 SD 卡使用。

  • 设备框架:如果模拟器中显示额外的硬件控制,请选择此选项。

  • 键盘:如果模拟器中显示硬件键盘,请选择此选项。

点击完成。新的虚拟设备现在列在 AVD 管理器中。在最近创建的虚拟设备的操作部分,你可以找到以下操作:

  • 启动图标:这将运行虚拟设备。

  • 编辑图标:这将编辑虚拟设备的配置。

  • 复制:这将创建一个新的设备配置,显示创建过程的最后一步。你可以更改其配置参数,然后验证新的设备。

  • 擦除数据:这将从虚拟设备中删除用户文件。

  • 显示在磁盘上:这将打开系统中的虚拟设备目录。

  • 查看详情:这将打开一个对话框,详细说明虚拟设备的特性。

  • 删除:这将删除虚拟设备。

  • 停止:这将停止虚拟设备。

操作部分中,如下一张截图所示,有一个下载按钮,表示该 AVD 的系统镜像缺失。点击下载按钮将其安装到你的系统中:

AVD 管理器

最近创建的 AVD 也会列在布局图形编辑器的设备选择器中。在 Android Studio 中,使用图形编辑器打开主布局,并点击设备列表。如图所示,我们的自定义设备定义出现,我们可以选择它来预览布局:

AVD 管理器

Android 模拟器

现在我们已经在 AVD 管理器中创建了一个 AVD,我们可以在 Android 模拟器上运行它。打开 AVD 管理器并点击 AVD 的启动按钮。模拟器将打开,如下一张截图所示。等待它完全加载后,你就可以尝试使用了。

Android 模拟器

在模拟器旁边,在其右侧,有一个包含操作的条:电源按钮、音量加减、左右旋转、截图、缩放、后退按钮、主页按钮、概览按钮和扩展控制。

点击更多选项以打开下一组扩展控制:

  • 位置: 这通过设置纬度、经度和海拔来模拟设备的地理位置。您还可以模拟一系列的位置变化。遗憾的是,没有提供地图以便轻松选择位置,但您可以使用 Google Maps 获取您想要模拟的位置的纬度和经度。如果您的应用显示地图或依赖于用户的位置来触发特定操作,此机制非常有用。要尝试此功能,请在虚拟设备上打开 Google Maps 应用。在扩展控制中输入一些坐标,然后点击发送。观察 Google Maps 如何绘制您输入的位置,如下截图所示:Android 模拟器

  • 蜂窝网络: 这模拟网络的速率(全速HSDPAUMTS等)。这还模拟数据状态语音状态。如果您的应用依赖于外部数据,此机制非常有用,可以检查它如何与慢速网络连接一起工作。通过将网络类型更改为EDGE来尝试此功能,并注意在模拟器中的变化:Android 模拟器

  • 电池: 这模拟电池的充电水平,如果设备连接到充电器,则模拟电池健康状态或电池状态。如果您的应用根据电池状态改变其行为,此机制非常有用。例如,如果电池电量低,您可以避免不必要的网络请求以减少电池消耗。如果您将充电水平更改为10%并将充电器连接设置为,模拟器将显示低电量通知:Android 模拟器

  • 电话: 这模拟电话通话或短信消息。例如,要检查您的应用如何从中断中恢复,此机制非常有用。要尝试此功能,请点击呼叫设备按钮,并观察设备如何接收通话,如下截图所示:Android 模拟器

  • 方向键: 这模拟了一个方向键。

  • 指纹: 这模拟手指触摸指纹传感器。如果您的应用具有指纹安全步骤,例如进行支付,此机制非常有用。要尝试此功能,请在虚拟设备上打开 Android 设置,进入安全,然后点击指纹。按照以下截图所示的步骤添加指纹。您将到达需要将手指放在传感器上的步骤:Android 模拟器

    扩展控制中点击触摸传感器按钮。指纹将按以下截图所示添加:

    Android 模拟器

    点击电源按钮以锁定设备,然后再次点击以解锁它。随后需要指纹验证。使用相同的指纹点击触摸传感器按钮,设备将被解锁。

  • 设置:这些是模拟器的设置。例如,您可以更改保存截图的文件夹,或者如果您想发送崩溃报告。

  • 帮助:这包含键盘快捷键模拟器帮助关于

最后,如果您在创建设备定义时选择了模拟摄像头,您可以通过在模拟器中打开摄像头应用程序来测试它。打开它,并注意随机视频如何像摄像头正在捕获它一样出现:

Android 模拟器

生成 Javadoc

Javadoc 是一个用于以 HTML 格式文档化 Java 代码的实用程序。Javadoc 文档是从添加到 Java 类或方法的注释和标签生成的。注释以/**字符串开始,以*/结束。在这些注释内部,可以添加标签。以下标签,按应添加的顺序排列,在 Javadoc 中可用:

  • @author:这表示代码的作者或作者。

  • @version:这表示类或方法的版本。用于类和接口。

  • @param:这描述了方法参数。仅在方法和构造函数中使用。

  • @return:这描述了方法的返回对象。仅在不需要返回void的方法中使用。

  • @throws:这描述了方法可能抛出的异常。等同于@exception

  • @see:这表示一个引用,可以是 URL、文档中的另一个元素或只是一些文本。

  • @serial:这表示字段是否可序列化。

  • @deprecated:这表示一个方法已过时,并有一个替代方案。

在 Android Studio 中,Javadoc 的使用是集成的。我们可以在输入 Javadoc 注释时使用代码补全。Javadoc 文档将显示在代码元素的弹出工具提示中。

要生成完整的 Javadoc,我们必须编写关于我们的类和方法的 Javadoc 注释。打开我们项目的 MainActivity,将 Javadoc 注释添加到我们在第五章中创建的onAcceptClick方法。在方法声明之前的行上放置光标,输入/**,然后按Enter。Javadoc 注释将自动插入,包含来自方法声明的可用信息:参数和返回类型。在这种情况下,没有返回类型,因此自动生成的 Javadoc 如下所示:

/**
 * 
 * @param v
 */

文档注释的第一行是方法描述。然后,它解释每个参数和返回类型。现在,方法应看起来像这样:

/**
 * Method executed when the user clicks on the Accept button.
 * Change the greeting message to include the name introduced by the user in the editText box.
 *
 * @param v View the user clicked
 */
public void onAcceptClick(View v) { ... }

此方法的信息现在将作为其文档显示在出现的对话框中。以下截图显示了应出现在方法上方的对话框:

生成 Javadoc

要生成 Javadoc 文档,请转到工具 | 生成 Javadoc...。将打开显示 Javadoc 选项的对话框。我们可以选择范围,如果我们想包括测试或库源,输出目录以及包含元素的可见性。关于文档格式,如果需要,我们可以创建层次结构树、导航栏和索引。

当前文件作为范围以生成我们主活动的文档。从您的系统中选择一个输出目录。将可见性降低到公共并点击确定按钮。HTML 格式的 Javadoc 文档已创建在输出目录中。index.html文件是起点。打开index.html文件并浏览文档以打开MyActivity类,如下面的截图所示。请注意,由于我们将生成的 Javadoc 的可见性降低到公共元素,因此onCreate方法(其可见性为受保护的)没有显示。

生成 Javadoc

任务和上下文

Android Studio 集成了多个问题跟踪系统。问题跟踪系统是一种管理问题列表的软件工具。Android Studio 支持的一些问题跟踪系统包括:Jira、YouTrack、Lighthouse、Mantis、Trello 或 Bugzilla。

要使用 Android Studio 将其中一个跟踪系统集成到您的项目中,请转到工具 | 任务与上下文 | 配置服务器...。点击添加按钮并选择一个可用的系统。您需要输入服务器 URL、身份验证值以及根据系统类型的一些附加参数。

任务与上下文菜单中,您可以找到管理任务的操作,例如在任务之间切换、创建新任务、关闭当前任务或编辑当前任务。

任务通过其名称识别,通常与您问题跟踪系统中的一个问题相关联。任务还可以与上下文相关联,它定义了当您在此任务上工作时将在编辑器中打开的一组文件。您可以从任务与上下文菜单创建、加载或清除上下文。

让我们创建一个任务。转到工具 | 任务与上下文 | + 打开任务...。输入名称,例如,我的第一个任务,然后点击创建新任务 '我的第一个任务'。创建对话框将显示如下截图:

任务和上下文

当您创建新任务时,您可以清除上下文并在您的 VCS 中创建一个新的分支。点击确定完成创建。如果您选中清除当前上下文选项,则现在编辑器中打开的所有文件都将关闭。

在 Android Studio 的工具栏中有一个新项目,一个包含您任务的下拉列表。如图所示,我们的当前任务是最近创建的我的第一个任务。请注意存在一个先前任务,默认任务

任务和上下文

当你准备好关闭任务时,请导航到 工具 | 任务与上下文 | 关闭活动任务...。在关闭任务对话框中,你可以提交更改并合并当前分支。

版本控制系统

Android Studio 集成了一些 版本控制系统VCS):GitHub、CVS、Git、Google Cloud、Mercurial 和 Subversion。要启用版本控制集成,请导航到 VCS | 启用版本控制集成... 并选择系统类型。现在,一些更多选项将被添加到 VCS 菜单中:

  • 要更新整个项目,请导航到 VCS | 更新项目...

  • 要提交项目中的所有更改,请导航到 VCS | 提交更改...

第一步是从版本控制系统进行检出。导航到 VCS | 从版本控制检出,点击添加图标,并输入存储库 URL 或存储库配置。

版本控制操作也可以应用于单个文件。在项目的任何文件上右键单击,然后选择 Subversion 部分。从出现的菜单中,我们可以将文件添加到存储库,将其添加到忽略列表,浏览更改,撤销更改或锁定它。

使用 本地历史记录 选项是控制文件版本的一个更简单的方法。在编辑器中打开主活动文件,然后导航到 VCS | 本地历史记录 | 显示历史记录。文件历史记录对话框将被打开。在对话框的左侧,列出了文件的可用版本。选择一个较旧的版本,以将其与文件的当前版本进行比较。较旧版本与当前版本之间的差异会被突出显示。灰色用于表示已删除的代码块,蓝色用于突出显示已更改的文本,绿色用于表示新插入的文本。从顶部的图标中,我们可以撤销更改并配置空白可视化。以下截图显示了我们的主活动两个版本的比较。我们可以观察到我们最近添加的方法——onAcceptClick 方法——以绿色突出显示:

版本控制系统

我们还可以检查特定代码块的本地区历史记录。关闭对话框,从编辑器中选择一些代码行,然后导航到 VCS | 本地历史记录 | 显示选择的历史记录。将打开相同的历史记录对话框,但这次它显示所选代码的版本。

摘要

到本章结束时,你将拥有使用 Android SDK 管理器工具安装、更新或检查项目可用平台所需的知识。你可以在需要时创建新的 AVD 并对其进行编辑。使用 Javadoc 为我们的项目创建完整的文档应该不再成为问题,我们还应该能够与集成在 Android Studio 中的版本控制系统(VCS)一起工作。

在下一章中,你将了解可用的 Google Play 服务以及如何使用 Android Studio 将它们集成到你的项目中。我们还将探讨如何安装和集成与 Google 技术一起提供的不同库,例如 Google Maps、Google Cloud Messaging 以及更多。

第七章. Google Play 服务

现在我们已经熟悉了在布局中使用组件的使用,是时候开始考虑额外的功能了。Google Play 服务为你提供了诸如 Google Maps、Google+等特性,以吸引用户。所有可用的功能有哪些?你如何将这些功能添加到你的应用程序中?使用 Google Play 服务需要满足哪些 Android 版本要求?

本章重点介绍使用 Android Studio 创建、集成和使用 Google Play 服务。你将了解可用的 Google 服务。你还将了解提供安全方式授予和接收访问令牌的标准授权 API。然后,你将了解这些服务的限制以及使用它们的优点。

这些是我们将在本章中讨论的主题:

  • 现有的 Google 服务

  • 从 IDE 中添加 Google Play 服务

  • 在你的应用程序中集成 Google Play 服务

  • 理解自动更新

  • 在你的应用程序中使用 Google 服务

Google Play 服务的工作原理

当 Google 在 2012 年的 Google I/O 上预览 Google Play 服务时,它表示该平台“由在设备上运行的组件和一个与你的应用程序打包的轻量级客户端库组成”(developers.google.com/events/io/2012/)。

这意味着 Google Play 服务得益于两个主要组件:

  • Google Play 服务客户端库:Google Play 服务客户端库包含了你的应用程序使用的每个 Google 服务的接口。当你打包应用程序时,库会被包含在内,并允许你的用户使用他们的凭证通过这些服务授权应用程序。Google 会定期升级客户端库,增加新功能和服务。你可以通过更新应用程序来升级库中的库,尽管如果你没有包含任何新功能,这并不是必需的。

  • Google Play 服务 APK:Google Play 服务的 APK 在 Android 操作系统中作为后台服务运行。使用客户端库,你的应用程序可以访问此服务,在运行时执行操作。该 APK 并不保证在所有设备上都已安装。如果设备没有预装该 APK,你可以从 Google Play 商店获取。

通过这种方式,Google 能够将他们服务的运行时与开发者所实施的实现分离,因此你不需要在 Google Play 服务升级时每次都更新你的应用程序。

Google Play 服务的 APK 文件会自动通过 Google Play 商店进行更新。任何运行 Android 2.3 或更高版本的 Android 设备都可以安装使用 Google Play 服务的任何应用程序。

可用服务

Google Play 服务让您能够轻松地为各种设备添加更多功能,同时使用由 Google 提供支持的知名功能。使用这些服务,您可以添加新的收入来源,管理应用的分发,访问统计数据,了解您的应用用户习惯,并通过易于实现的 Google 功能(如地图或 Google 的社会网络 Google+)来改进您的应用。以下是一些服务的说明:

  • Google+:使用 Android 的 Google+平台,您可以验证您的应用用户。一旦验证成功,您还可以访问他们的公共资料和社交图谱,以及其他操作。

  • Google Analytics:通过集成此服务,您可以让您的应用向 Google Analytics 发送信息。这是一个收集您应用指标的工具。指标可以帮助您通过跟踪事件(如按钮点击次数)或跟踪屏幕和组件的可视化来了解用户如何使用您的应用。

  • Google App Indexing:通过集成此服务,您可以让您的应用内容对 Google 应用索引可用。这将使您的应用更容易被用户找到。

  • Google Cast:通过集成此服务,您可以让您的应用与 Google Cast 设备(如 Chromecast 或 Android TV)交互。

  • Google Cloud Messaging:使用 Android 上的Google Cloud MessagingGCM),您可以在运行在基于 Android 的设备中的应用程序和您的服务器之间交换数据。使用 GCM,您的服务器可以开始与您的应用程序通信,从而可以向用户生成推送通知。

  • Google Drive:使用 Google Drive API,您可以让您的应用程序访问和管理用户存储在 Google Drive 账户中的文件。

  • Google Fit:使用 Google Fit API,您可以与蓝牙低功耗BLE)设备(如心率监测器、骑行传感器或计步器)交互,访问数据或管理 Google Fit 中的用户活动。

  • Google In-app Billing:使用 Google Play In-app Billing,您可以从您的应用中销售数字内容。您可以使用此服务销售一次性收费或时间订阅的高级服务和功能。

  • Google Location:通过集成位置 API,您可以让您的应用程序具备位置感知能力。

  • Google Maps:通过集成 Google Maps API,您可以在您的应用中使用 Google 提供的地图,并对其进行自定义。

  • Google Mobile Ads:使用 Google Mobile Ads API,您可以在您的应用中添加 AdMob 横幅广告。

  • Google Nearby:通过集成 Google Nearby 服务,您可以让您的应用与附近的设备交互,并根据距离执行操作。

  • Google Panorama Viewer:通过集成此服务,您可以让用户查看 360 度全景图片。

  • Google Places:通过集成 Google Places API,您可以在您的应用中使用 Google 提供的位置信息。

  • Google Play 游戏服务:使用 Google Play 游戏服务,你可以通过更社交化的体验来提升你的游戏体验,例如成就、排行榜、游戏礼物或玩家统计数据。

  • Google 登录:通过集成 Google 登录,用户可以使用他们的 Google 账户安全地注册到你的应用中。

  • Google 钱包:通过集成 Google 钱包,你可以在云中存储诸如礼品卡或忠诚度计划等对象,并使用它们在商店或在线支付。

将 Google Play 服务添加到 Android Studio

我们首先需要知道我们需要添加到 Android Studio 中的内容。你已经了解到 APK 在 Google Play 商店中可用,它是服务的实际运行时。作为开发者,我们在调试应用程序时只需要这个包在测试设备上。我们需要添加到 Android Studio 中的是 Google Play 服务客户端库。

这个库必须作为依赖项声明在你的应用程序中,因此请执行以下步骤:

  1. 打开你的应用程序模块的build.gradle文件(/app/build.gradle)。

  2. dependencies块中输入以下行以向你的应用程序构建添加新的依赖项:

    dependencies {
       …
       compile 'com.google.android.gms:play-services:8.4.0'
    }
    

    最新版本的 Google Play 服务是 8.4(2015 年 12 月)。当库的新更新发布时,你需要在build.gradle文件中更新版本号。

  3. 导航到工具 | Android | 与 Gradle 文件同步项目以将新的 Google Play 服务依赖项同步到你的项目。

  4. 最后,在应用程序的 manifest 文件中的应用程序块中添加它:

    <meta-data android:name="com.google.android.gms.version"
      android:value="@integer/google_play_services_version" />
    

    你应该在应用程序项目的app/build/intermediates/exploded-aar/com.google.android.gms/build文件夹中找到这个库,如下一截图所示:

    将 Google Play 服务添加到 Android Studio

正如你可以在之前的截图和你的项目中注意到的那样,所有 Google Play 服务都已包含:play-services-adsplay-services-analyticsplay-services-appindexing等等。如果你只需要一些服务而不想包含所有服务,这可能是完全不必要的。自 Google Play 服务版本 6.5 起,你可以独立添加服务。

例如,如果你只想添加 Google Maps 和 Google Places API,将build.gradle文件中之前的依赖项替换为以下两个依赖项:

dependencies {
   …
   compile 'com.google.android.gms:play-services-maps:8.4.0'
 compile 'com.google.android.gms:play-services-location:8.4.0'
}

导航到工具 | Android | 与 Gradle 文件同步项目以同步你的项目。现在你可以在应用程序项目的app/build/intermediates/exploded-aar/com.google.android.gms/build文件夹中找到 Google Maps 和 Google Places API,如下一张截图所示:

将 Google Play 服务添加到 Android Studio

如果你仍然有所有的play-services文件夹,通过导航到构建 | 清理项目来清理项目。

虽然我们推荐使用 Gradle 依赖项将 Google Play 服务包含到您的应用程序中,但还有另一种方法在您的应用程序中使用它们。您可以从我们的系统中下载并安装 Google Play 服务库。此库通过 Android SDK 管理器进行分发。现在,执行以下步骤:

  1. 导航到工具 | Android | SDK 管理器。打开独立的 SDK 管理器。我们可以在Extras文件夹下的包列表中找到 Google Play 服务。

  2. 选择Google Play services复选框,然后点击安装 1 个包...按钮:将 Google Play services 添加到 Android Studio

    执行这些操作将把库项目添加到我们的 SDK 安装文件夹的位置,/sdk/extras/google/google_play_services/。您可以通过将鼠标悬停在 SDK 管理器中的Google Play services行上并查看工具提示来检查确切路径。

  3. 导航到文件夹以检查其内容。samples文件夹包含一些示例项目,例如 Google Analytics(analytics/)、身份验证服务(auth/)、Google Cast(cast/)、Google Drive(drive/)、Google Maps(maps/)、Google Panorama(panorama/)或 Google Wallet(wallet/)的项目。libproject/文件夹包含 Google Play 服务库项目。google-play-services.jar文件放置在此文件夹的libproject/google-play-services_lib/libs/google-play-services.jar中。docs/文件夹包含文档。

  4. 通过将 JAR 文件拖入libs/文件夹,简单地将此 JAR 文件添加到您的项目中。

  5. 选择 JAR 文件,然后右键单击它。

  6. 选择添加为库...选项,如下一张截图所示:将 Google Play services 添加到 Android Studio

    创建库对话框中选择您的应用程序模块,然后点击确定。现在您可以在项目的libs/文件夹下找到可用的google-play-services.jar,您现在将能够从您的代码中引用 Google Play 服务。

  7. 最后,您需要将库添加到您的 Gradle 构建文件中。为此,只需编辑MyApplication/下的build.gradle文件,并在dependencies部分添加以下行:

    dependencies {
       …
      compile files('libs/google-play-services.jar')
    }
    

Google Maps Android API

Google Maps Android API 允许您的应用程序用户通过 Google 服务探索可用的地图。它提供了诸如 3D 地图、室内和卫星地图、基于矢量的高效缓存和绘图技术,以及通过地图的动画过渡等功能。将以下依赖项添加到您的 Gradle 构建文件中,以将 Google Maps API 包包含到您的应用程序中:

compile 'com.google.android.gms:play-services-maps:8.4.0'

让我们创建一个新的活动,Google Maps Activity,来检查最重要的生成类。导航到 文件 | 新建 | 活动 | 图库...。在 添加活动到移动 对话框中,选择 Google Maps Activity 并点击 下一步。在 自定义活动 步骤中,保留默认值,如截图所示:MapsActivity 作为 活动名称activity_maps 作为 布局名称Map 作为 标题

Google Maps Android API

点击 完成。创建了三个新文件:活动 MapsActivity.java(位于 src/main/java),布局 activity_maps.xml(位于 src/main/res/layout),以及一个资源文件,google_maps_api.xml(位于 /src/debug/res/values/src/release/res/values)。此资源文件包含您需要使用 Google Maps API 的 Google Maps API 密钥。打开资源文件中提供的链接,并按照说明操作。一旦您创建了密钥,将其粘贴到资源文件中,替换 YOUR_KEY_HERE 文本。

src/main/java/ 下打开 MapsActivity 类。检查活动中的 import 语句,注意 com.google.android.gms.maps 包包含 Google Maps Android API 类。活动有一个 private 类型的 GoogleMap 变量,这是 API 的主要类,也是所有与地图相关方法的入口点。您可以根据应用程序风格更改地图的主题颜色和图标。您还可以通过向其添加标记来自定义地图。要添加一个简单的标记,您可以使用 GoogleMap 类的 addMarker 方法。检查 MapsActivity 中的 onMapReady 方法,以查看以下代码:

LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));

addMarker 方法接受一个 MarkerOptions 对象作为参数。使用 position 方法,我们指定地图上标记的坐标,并使用 title 方法,我们可以添加一个自定义字符串,使其显示在标记上。

要将地图添加到布局中,我们可以使用扩展了 View 类并显示地图的 MapView 类。然而,将地图放置在应用程序中最简单的方法是使用 MapFragment 对象。fragment 代表用户界面或行为的一部分,可以嵌入到活动中。fragment 是一个可重用的模块。

MapFragment 类封装了一个地图视图,以自动处理组件所需的生命周期要求。要查看此代码的使用情况,请打开与 MapsActivity 类关联的布局。这是位于 /res/layout/ 下的 activity_maps.xml 文件。MapFragment 类扩展了 Fragment 类,因此可以通过添加以下 XML 代码将其添加到布局中:

<fragment
    android:id="@+id/map"
	android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

最后,我们需要代码来从片段中获取 GoogleMap 对象。我们可以使用 findFragmentById 方法找到 Fragment 地图,然后使用 getMap 方法从 Fragment 获取地图:

MapFragment mapFragment = (MapFragment)  
   getFragmentManager().findFragmentById(R.id.map);

您可以在 MapsActivity 类的 onCreate 方法中看到此代码的示例。

最后一个重要的类是 GoogleMapOptions 类,如果您以编程方式创建地图,则可以使用它。它定义了地图的配置。您还可以通过编辑布局 XML 代码或使用活动代码中的地图设置器方法来修改地图的初始状态。以下是一些可用的有趣选项:

  • mapType:这指定了地图的类型。其值可以是 nonenormalhybridsatelliteterrain

  • compassEnabled:这定义了是否启用或禁用指南针控件。

  • zoomControlsEnabled:这定义了是否启用或禁用缩放控件。

  • rotateGesturesEnabled:这定义了是否启用或禁用旋转手势。

在 Google Map 的 GitHub 上有一些示例演示:github.com/googlemaps/android-samples

Google Places

使用 Google Places API,您的应用可以访问 Google 的地点数据库。这个数据库包含有关商业和本地地点的信息:名称、地址、照片、电话号码、评分、类型、坐标、网站或价格水平。在您的 Gradle 构建文件中添加以下依赖项以将 Google Places API 包包含到您的应用中:

compile 'com.google.android.gms:play-services-location:8.4.0'

要使用 Google Places API,需要一个 API 密钥。这个密钥与您用于 Google Maps API 的密钥相同。一旦您有了它,请将其添加到您的应用清单文件中的 application 元素内,使用以下代码:

<meta-data android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY_HERE"/>

使用 GoogleApiClient 类来访问 API。通过指示两个可用的地点 API 密钥之一,在 Build 方法中将 Google Places API 添加到 Build 方法中:

  • Geo Data API:此 API 提供对 Google 数据库的访问,该数据库包含有关本地地点和商业的信息。此 API 的密钥是 Places.GEO_DATA_API

  • 地点检测 API:此 API 获取设备位置并检测附近的地点。此 API 的密钥是 Places.PLACE_DETECTION_API

您也可以添加它们两个。以下代码是您活动 onCreate 方法的示例:

GoogleApiClient gac = new GoogleApiClient
        .Builder(this)
        .addApi(Places.GEO_DATA_API)
        .addApi(Places.PLACE_DETECTION_API)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();

除了这两个 API 之外,还有一个默认对话框,您的应用可以显示它,让用户在地图中选择地点——地点选择 UI。使用此元素,您不需要实现自己的自定义对话框。使用 PlacePicker 类的 IntentBuilder 方法创建一个 Intent 并启动活动,如下面的代码所示:

PlacePicker.IntentBuilder builder = 
   new PlacePicker.IntentBuilder();
startActivityForResult(builder.build(this), PLACE_PICKER_REQUEST);

活动的结果将返回用户选择的地点,您可以使用 PlacePicker 类的 getPlace 方法获取:

@Override
public void onActivityResult(int requestCode, int resultCode, Intenta data) {
   if (requestCode == PLACE_PICKER_REQUEST) {
      if (resultCode == Activity.RESULT_OK) {
         Place place = PlacePicker.getPlace(data, getActivity());
      }
   }
}

Geo Data API

使用与 Google 数据库相连的 Geo Data API,您可以通过标识符或查询找到地点,您可以获取地点的照片,或者您可以添加新的地点。这些是 GeoDataApi 接口中的主要方法:

  • addPlace: 此方法允许您将新地点添加到谷歌数据库中。该地点将对您的应用可用,但在添加到谷歌数据库之前需要经过审核。关于新地点的信息包含在AddPlaceRequest对象中。

  • getAutocompletePredictions: 此方法根据查询返回地点列表,该查询查找地点的名称和地址。除了搜索字符串外,您还可以添加更多过滤器,例如纬度和经度限制或仅返回企业的标志。

  • getPlaceById: 此方法返回具有指定地点 ID 的Place对象列表。

  • getPlacePhotos: 此方法返回最多 10 张指定 ID 的地点照片。

地点检测 API

要获取用户所在位置的估计,您需要使用地点检测 API。PlaceDetectionApi接口提供了getCurrentPlace方法,该方法返回一个包含候选地点列表及其用户位于这些地点的可能性(PlaceLikelihood对象)的缓冲区(PlaceLikelihoodBuffer对象)。PlaceLikelihood对象有两个公共方法:

  • getLikelihood: 此方法返回一个float值,表示可能性,其值从 0.0 到 1.0。值越高,用户位于候选地点的置信度就越高。

  • getPlace: 此方法返回包含候选地点所有信息的Place对象。

getCurrentPlace方法可以接收一个过滤器以细化结果(PlaceFilter对象)。您可以过滤当前是否开放的地点,以及可以按特定地点标识符进行过滤。

小贴士

要查看更多代码和示例,请查看谷歌 GitHub 上的示例演示:github.com/googlesamples/android-play-places

Google Sign-In

Google Sign-In for Android 允许开发人员使用用户在谷歌上使用的相同凭据进行用户身份验证。用户将能够使用他们的谷歌凭据登录您的应用。在您的 Gradle 构建文件中添加以下依赖项以将 Google Sign-In 包包含到您的应用中:

compile 'com.google.android.gms:play-services-auth:8.4.0'

这些是您需要了解的主要 Google Sign-In API 类:

  • SignInButton: 这是默认的 Google Sign-In 按钮。您需要在您的应用中添加默认按钮或自定义按钮,以便用户可以触发登录流程。您可以使用以下代码在布局文件中添加默认按钮:

    <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    

    此默认按钮可以根据范围进行自定义,包括大小和颜色。例如,您可以选择以下这些大小值,您可以在下一张截图中进行比较:SignInButton.SIZE_ICON_ONLYSignInButton.SIZE_STANDARDSignInButton.SIZE_WIDE

    Google Sign-In

  • GoogleSignInOptions: 这个类配置 Google Sign-In API 选项。您可以使用GoogleSignInOptions.DEFAULT_SIGN_IN选项请求用户的 ID 和基本资料。您还可以构建一个新的选项来请求额外的信息,例如使用以下代码请求用户的电子邮件:

    GoogleSignInOptions gsio = new
      GoogleSignInOptions.Builder(
          GoogleSignInOptions.DEFAULT_SIGN_IN)
      .requestEmail()
      .build();
    
  • GoogleApiClient: 这个类用于访问 API。在Build方法中通过指定Auth.GOOGLE_SIGN_IN_API密钥添加 Google Sign-In API。构建方法还会接收一个GoogleSignInOptions对象。您可以将以下代码添加到活动的onCreate方法中,以获取GoogleApiClient对象:

    GoogleApiClient gac = new GoogleApiClient.Builder(this)
        .enableAutoManage(this, this)
        .addApi(Auth.GOOGLE_SIGN_IN_API, gsio)
        .build();
    

要查看更多代码和示例,请查看 Google 的 GitHub 上的示例演示:github.com/googlesamples/google-services/tree/master/android/signin

Android 的 Google+平台

Android 的 Google+平台现在已成为 Google Sign-In 的一部分。您需要将 Google Sign-In 添加到您的应用中以使用 Google+。这使您能够通过用户名欢迎用户,显示他们的图片或与朋友连接,以使用公共资料和社交图谱。

创建一个GoogleApiClient对象以访问 API 并使用登录功能。通过指定密钥Plus.API和这两个作用域:Scopes.PLUS_LOGINScopes.PLUS_ME,添加 Google+ API,如下面的代码所示:

GoogleApiClient gac = new GoogleApiClient.Builder(this)
        .enableAutoManage(this, this)
        .addApi(Plus.API)
        .addScope(Scopes.PLUS_LOGIN)
        .addScope(Scopes.PLUS_ME)
        .build();

PlusShare类包括在 Google+上共享的帖子中的资源。PlusOneButton类实现了一个+1按钮,用于在 Google+上推荐 URL。+1按钮的可用尺寸有小型、中型、大型或标准型。您可以使用以下代码将其添加到布局中:

<com.google.android.gms.plus.PlusOneButton
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  plus:size="standard" />

要查看更多代码和示例,请查看 Google 的 GitHub 上的示例演示:github.com/googleplus/gplus-haiku-client-android

Google Play 应用内计费

应用内计费允许您从您的应用中销售虚拟内容。这种虚拟内容可以是付费内容,一次计费或通过订阅或费用进行时间折扣。使用这项服务,您可以对额外功能和访问高级内容进行收费。

任何在 Google Play 商店发布的应用都可以实现应用内计费 API,因为它只需要与发布应用相同的资产:一个 Google Play 开发者控制台账户和一个 Google Wallet 商户账户。

使用 Google Play 开发者控制台,您可以定义您的产品,包括类型、识别码(SKU)、价格、描述等。一旦您定义了您的产品,您就可以从该应用程序访问这些内容。当用户想要购买此内容时,您的应用内计费应用程序和 Google Play 之间将发生以下购买流程:

  1. 您的应用调用isBillingSupported()到 Google Play 以检查您使用的应用内计费版本是否受支持。

  2. 如果支持 In-app Billing API 版本,你可以使用getPurchases()来获取已购买项目的 SKU 列表。这个列表将返回在一个Bundle对象中。

  3. 你可能想要通知用户可用的应用内购买。为此,你的应用可以发送一个getSkuDetails()请求,这将生成一个包含价格、标题、描述以及更多关于所提供项目的信息的列表。

要查看更多代码和示例,请查看 Google 的 GitHub 上的示例演示:github.com/googlesamples/android-play-billing

Google Cloud Messaging

Google Cloud MessagingGCM)为 Android 提供了服务器和你的应用之间通过异步消息进行通信的功能。你需要在你的 Android 应用中实现客户端实现,同时也需要在服务器端实现以发送消息并存储客户端数据。你不需要担心处理此通信的低级方面,如队列和消息构建。使用此服务,你可以轻松地为你的应用实现一个通知系统。

以下图像显示了 GCM 的工作原理。这个过程涉及三个元素:你的应用、你的服务器和 GCM 服务器。

  1. 你的应用首先需要在 GCM 中进行注册以获取一个注册 ID,这个 ID 用于在特定设备上标识你的应用。

  2. 你的应用必须将注册 ID 发送到你的服务器以便保存。这一步是必要的,因为你的服务器需要知道用户设备的注册 ID,以便在该设备上向你的应用发送消息。

  3. 当你的服务器想要发送消息时,它将消息发送到 GCM 服务器,并指示消息信息和将接收消息的设备的注册 ID。

  4. 最后,GCM 将消息发送到那些设备上的你的应用。Google Cloud Messaging

使用 GCM 时,你有两种选择:

  • 服务器可以在有新数据可供从服务器获取时通知你的应用,然后应用获取这些数据。

  • 服务器可以直接在消息中发送数据。消息有效载荷可以达到 4 KB。这允许你的应用一次性访问数据并相应地采取行动。

在你的 Gradle 构建文件中添加以下依赖项,以将 Google Maps API 包包含到你的应用中:

compile 'com.google.android.gms:play-services-gcm:8.4.0'

为了从你的应用(客户端)发送或接收消息,你需要获取一个注册 ID。这个 ID 标识了设备和应用的组合。为了允许你的应用使用 GCM 服务,你需要在你的项目清单文件中添加以下行:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>

你还必须在清单文件中添加以下三个类的声明:

  • GCM 接收器:这个类管理你的应用中接收到的消息。这个接收器已经属于 GCM API,你不需要创建它。使用以下代码将其添加到你的清单文件中:

    <receiver 
    android:name="com.google.android.gms.gcm.GcmReceiver"
    android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
       <intent-filter>
          <action
          android:name="com.google.android.c2dm.intent.RECEIVE" />
          <category android:name="com.example.gcm" />
       </intent-filter>
    </receiver>
    
  • GCM 监听服务: 这个服务类,您需要在您的应用中创建,应该扩展 GcmListenerService 类。通过实现这个服务子类,您可以在其 onMessageReceived 方法中处理消息。使用以下代码将其添加到您的清单文件中:

    <service
    android:name="com.example.MyGcmListenerService"
    android:exported="false" >
       <intent-filter>
          <action
          android:name="com.google.android.c2dm.intent.RECEIVE" />
       </intent-filter>
    </service>
    
  • 实例 ID 监听服务: 这个服务类,您需要在您的应用中创建,应该扩展 InstanceIDListenerService 类。通过实现这个服务子类,您可以处理注册 ID。使用以下代码将其添加到您的清单文件中:

    <service
    android:name="com.example.MyInstanceIDListenerService"
    android:exported="false">
       <intent-filter>
          <action
          android:name="com.google.android.gms.iid.InstanceID" />
       </intent-filter>
    </service>
    

要查看更多代码和示例,请检查 Google 的 GitHub 上的示例演示:github.com/googlesamples/google-services/tree/master/android/gcm.

更多示例应用

如果您对 Google Play 服务感兴趣,Google 的 GitHub 上有可用的示例应用。以下是它们的链接:

摘要

在本章中,我们讨论了可用的 Google Play 服务。你学习了如何通过其客户端库和 Android 包使用 Google Play 服务来改进我们的应用程序。你应该已经使用 SDK 管理器成功安装了 Google Play 服务客户端库,并且现在应该能够使用库功能构建应用程序。你还了解了一些关于 Google Maps v2、Google+ 平台 Android 身份验证、Google Play 内部计费和 GCM 的技巧。

在下一章中,你将了解 Android Studio 中可用的某些有用工具。我们将经常使用 SDK 管理器来安装不同的包。你还将了解 AVD 管理器,用于测试我们的应用程序的不同虚拟设备。我们将使用 Javadoc 工具为我们的项目生成 Javadoc 文档,你还将了解 Android Studio 中可用的版本控制系统。

第八章。调试

调试环境是集成开发环境(IDE)最重要的功能之一。使用调试工具可以让你轻松优化应用程序并提高其性能。你希望在 Android Studio 编程时使用调试工具吗?Android Studio 包含了 Dalvik 调试监控服务器DDMS)调试工具。

在本章中,您将从学习 运行调试 选项以及如何在之前章节中创建的 Android 虚拟设备中模拟应用程序开始。您将深入了解 调试器控制台日志输出 选项卡。您还将学习在使用调试器时如何使用断点。我们将以关于 Android Studio DDMS 中包含的高级调试工具的每个选项卡的信息结束本章,以及层次视图。

本章我们将讨论以下主题:

  • 调试

  • 日志输出

  • 即时运行

  • 设备监控工具

  • 层次视图

运行和调试

Android 应用程序可以通过 USB 连接在真实设备上或在虚拟设备中使用模拟器运行。虚拟设备使我们能够在不同的硬件和软件配置上测试我们的应用程序。在本章中,我们将使用模拟器来运行和调试我们的应用程序,因为它简单且灵活。

要直接运行应用程序,请导航到 运行 | 运行 'app'。您也可以从工具栏中点击播放图标。要调试应用程序,请导航到 运行 | 调试 'app' 或从工具栏中点击虫子图标。如果您的应用程序已经运行,您可以通过导航到 运行 | 附加调试器到 Android 进程 来启动调试模式。

当我们选择 调试 'app' 选项时,会打开一个选择设备的对话框。已连接设备部分用于选择正在运行的设备;列出了当前连接的设备,无论是真实设备还是虚拟设备。可用模拟器部分用于启动模拟器的新实例;列出了可用的虚拟设备。您也可以使用 创建新模拟器 按钮从该对话框创建新的模拟器。此选项将打开 第六章 中解释的虚拟设备配置对话框。此对话框中的最后一个选项是 为将来启动使用相同选择 复选框。如果您想在未来跳过此步骤,请选中此复选框。

可用模拟器 部分选择在 第六章 中创建的虚拟设备,如以下截图所示,然后点击 确定

运行和调试

模拟器将被启动。下次我们运行或调试应用程序时,模拟器将正在运行,因此我们将从 已连接设备 部分选择它。

在调试过程中,您会注意到,在下一张截图所示的 Android Studio 的底部,有一个新的面板,调试,其中包含两个选项卡:调试器控制台Android Monitor 选项卡包含另外两个工具:日志输出监视器

运行和调试

控制台

控制台显示在启动或运行模拟器时发生的事件。打开它以检查消息并确认模拟器和应用程序正在正确执行。应该出现的操作是:

  • 等待设备:这是启动模拟器时的起点。

  • 上传文件adb push 命令):此事件表示应用程序被打包并存储在设备中。

  • 安装adb shell pm install 命令):此事件表示应用程序正在设备中安装。安装后,应打印出成功消息。

  • 启动应用程序adb shell am start 命令):此事件发生在应用程序开始执行时。

  • 等待进程:此事件发生在应用程序正在运行且调试系统试图连接到设备中的应用程序进程时。

在前一步骤成功后,应用程序将在模拟器中可见。通过在文本输入中键入任何名称并点击接受按钮来测试它。问候消息应该会改变。

调试器

调试器管理断点、控制代码执行并显示变量的信息。要在您的代码中添加断点,只需单击代码行的左侧边缘。一个红色点将出现在代码行旁边以指示断点。要删除断点,请单击它。如果您右键单击一个断点,一个小对话框中将出现更多选项,您可以在其中点击更多以打开显示在下图中所示的断点窗口:

调试器

您也可以通过导航到 运行 | 查看断点... 来打开 断点 窗口。在 断点 窗口的左侧面板中,列出了您应用程序的所有断点。您可以添加新的断点、删除它们或启用和禁用它们。您可以启用 异常断点,当您的应用程序运行时抛出异常时,它将被触发。如果您从左侧面板中选择一个断点,您可以使用右侧面板对其进行配置。例如,您可以为断点设置条件、将消息记录到控制台,或者一旦触发就将其删除。

在我们主活动的 onAcceptClick 方法中的条件语句中添加一个断点,然后再次调试应用程序,如下所示:

调试器

在应用中输入你的名字并点击接受按钮。当执行到达断点时,它会暂停,并打开调试器标签页。由于我们在分配文本之前在条件语句中添加了断点,所以我们的问候信息没有改变。

从调试器标签页,我们可以检查方法调用层次和执行点处的变量状态。可用的变量包括v方法的参数、通过findViewById方法获得的TextViewEditText对象,以及当前活动的引用(this)。展开名为etNameEditText对象,如图所示,并搜索mText属性。这个属性应该包含你之前输入的名字:

调试器

右键点击EditText对象以打开一个包含更多选项的菜单,并选择评估表达式...评估表达式对话框允许你在所选对象的环境中查询方法。例如,输入etName.getText()并按Enter键来评估表达式。表达式的结果将显示如下截图:

调试器

当你的应用执行在断点处停止时,你可以执行以下操作:

  • 要执行下一行代码而不进入方法调用,你可以导航到运行 | 步过,点击调试面板顶部工具栏中的按钮,或者按此选项指示的键盘快捷键,通常是F8键。

  • 要进入方法调用,你可以导航到运行 | 进入,点击调试面板顶部工具栏中的按钮,或者按F7键。

  • 要选择你想要进入的方法,你可以导航到运行 | 智能进入或按Shift + F7

  • 要将光标位置移动到你的代码中,你可以导航到运行 | 运行到光标,点击调试面板顶部工具栏中的按钮,或者按Alt + F9

  • 要恢复执行直到下一个断点,你可以导航到运行 | 恢复程序,点击调试面板左侧工具栏中的按钮,或者按F9键。

  • 要停止执行,你可以导航到运行 | 停止,点击调试面板左侧工具栏中的按钮,或者按Ctrl + F2(在 OS X 上为Cmd + F2)。

这些选项以及其他选项也可以从调试器标签页作为图标快捷方式使用。

展开名为tvGreeting的对象以检查其mText属性的值。现在,跳过条件语句和setText方法的调用。注意mText属性的值是如何变化的,这将在下一个截图中显示。最后,恢复执行以便设备屏幕上的问候信息发生变化。

调试器

if子句内创建一个新的断点。我们可以添加一个条件到断点端点,这样只有当用户输入的名称是"no name"时,执行才会暂停,否则执行将像往常一样继续。以下断点窗口的截图显示了断点详情:

调试器

在断点的条件字段中,添加以下条件,该条件比较用户在名称字段(etName)中输入的文本:

etName.getText().toString().equals("no name")

现在,如果你在应用程序中输入你的名字,没有断点会暂停执行。如果你输入"no name",执行将在最近创建的断点处暂停。

LogCat

LogCat是 Android 日志系统,它显示运行设备上 Android 系统生成的所有日志消息。日志消息有多个重要性级别。从LogCat标签页,我们可以通过这些级别过滤日志消息。例如,如果我们选择信息级别作为过滤器,那么来自信息警告错误级别的消息将会显示。级别在以下图表中显示:

LogCat

要从我们的代码中打印日志消息,我们需要导入Log类。这个类为每个级别都有一个方法:v方法用于详细输出,d方法用于调试,i方法用于信息,w方法用于警告,e方法用于错误级别。这些方法接收两个字符串参数。第一个字符串参数通常用于标识消息的源类,第二个字符串参数用于标识消息本身。为了标识源类,我们建议使用一个常量、静态字符串标签。然而,在下一个示例中,我们直接使用字符串以简化代码。将以下日志消息添加到主活动的onAcceptClick方法中:

if(etName.getText().length() > 0) {
  Log.i("MainActivity", "Name read: " + etName.getText());
  tvGreeting.setText("Hello " + etName.getText());
} 
else {
  Log.w("MainActivity", "No name typed, greeting didn't change");
}

我们有一个日志消息用于通知我们用户输入获取的名称,还有一个日志消息用于在用户没有输入名称时打印警告。移除我们之前创建的所有断点,然后调试应用程序。

Android Monitor中的LogCat标签页默认打印了当前应用程序生成的日志消息。阅读应用程序的消息有时可能很复杂,你需要过滤这些消息。在LogCat标签页中,有一个可展开的列表,你可以通过其重要性级别过滤日志消息。你还可以使用搜索字段查找特定的日志消息。还有一个可展开的列表来配置一些额外的过滤器:无过滤器选项显示设备生成的所有日志;仅显示所选应用程序选项显示仅由你的应用程序生成的日志;编辑过滤器配置选项允许你创建更复杂的过滤器。选择编辑过滤器配置来检查此选项。将打开一个创建过滤器的对话框,如图所示:

LogCat

日志消息可以通过它们的日志标签日志消息或打印它们的包名进行过滤。日志还可以通过进程 IDPID)或它们的级别进行过滤。

创建一个名为MyApplication的新过滤器,通过包名写入com.example.myapplication(我们的应用程序包名),然后点击确定。现在,日志猫日志已经被过滤,更容易阅读我们的消息。现在,执行以下步骤:

  1. 将焦点放在模拟器窗口上,在应用程序中输入一个名称,然后点击接受。观察我们的日志消息是如何在日志猫视图中打印出来的。

  2. 从应用程序中删除您的名称,然后点击接受。这次,会打印出一个警告消息。注意每种消息所使用的不同颜色。

监控器

监控器面板位于 Android Studio 的右下角。选择运行您应用程序的设备或模拟器,并从两个顶部可展开的列表中选择与您的应用程序相对应的进程。有四个监控器可用:

  • 内存:这显示了所选应用程序随时间变化的可用和已分配内存,如下面的截图所示:监控器

  • CPU:这显示了应用程序的实时 CPU 使用情况,如下面的截图所示:监控器

  • 网络:这显示了应用程序的网络使用情况,如下面的截图所示:监控器

  • GPU:这显示了应用程序的 GPU 使用情况,表示执行、处理、准备和绘制帧的时间,如下面的截图所示:监控器

即时运行

即时运行是 Android Studio 2.0 中引入的新功能,允许您在应用程序在设备上运行时更新它,而无需构建新的 APK。此功能减少了部署时间。

即时运行需要 SDK 15 或更高版本,尽管建议使用 SDK 21 或更高版本。您还需要将 Android Plugin for Gradle 更新到 2.0 或更高版本。即时运行适用于模拟器和真实设备。

在您的应用程序首次部署后,您会注意到运行/调试图标已更改,并有一个额外的闪电图标,如下面的截图所示:

即时运行

下次您点击调试按钮时,Android Studio 将分析代码中的更改,以使应用程序的部署更快,而不是创建一个新的 APK 并进行完整部署。根据需要推送到应用程序的代码,有三种类型的更新:

  • 热交换:这是最快的交换方式。如果您更改现有方法的代码,则会执行此类型的交换。Android Studio 将创建一个具有新代码的存根方法并重新启动当前活动。

    如果你不想在热插拔后 Android Studio 重启当前活动,你可以在设置屏幕中禁用此行为。即时运行设置位于主设置中的构建、执行、部署部分。以下截图显示了即时运行设置屏幕:

    即时运行

    你可以通过禁用代码更改时重启活动选项来禁用活动的重启。

  • 热交换:如果你更改或删除了现有资源,则会执行此类型的交换。Android Studio 将始终重启当前活动,并且你不能禁用此行为。

  • 冷交换:这是最慢的交换,需要 API 21 或更高版本。如果设备运行的 API 低于 21,Android Studio 将创建一个新的 APK 并执行完整部署。如果代码更改是结构性的,例如更改父类、实现的接口、字段或方法签名,则会执行此类型的交换。Android Studio 将在冷交换中重启你的应用。

如果你更改了应用清单或影响应用清单的任何内容,例如清单中引用的资源,Android Studio 将部署一个新的构建。

在你的应用中更改一些代码,例如,将Hello文本消息更改为Goodbye消息:

tvGreeting.setText("Goodbye " + etName.getText());

点击带有闪电的调试按钮。由于你更改了方法中的代码,Android Studio 将执行热插拔。你会在当前活动重启时注意到闪烁。

当热插拔完成后,Android Studio 底部部分会显示一条消息,如下一张截图所示:

即时运行

如消息中所示,代码更改已应用,当前活动已重启。输入一个名称并点击接受。文本消息现在是Goodbye

即时运行

从设置中禁用代码更改时重启活动选项以观察差异。将代码改回Hello文本消息并调试应用。现在没有闪烁,当热插拔完成后,Android Studio 中显示的消息现在不同:

即时运行

当热插拔完成后,模拟器中也会显示一条消息,如下一张截图所示。在这种情况下,显示的消息是:应用代码更改,未重启活动

即时运行

现在更改一个资源,例如,将EditText的提示更改为以下内容:

android:hint="Please, enter your name"

点击带有闪电的调试按钮。由于你更改了一个资源,这次 Android Studio 将执行热交换。你会注意到当前活动再次重启。底部部分显示相同的消息:

即时运行

如果你想完全禁用即时运行,你可以从设置屏幕中通过取消勾选启用即时运行以在部署时热交换代码/资源更改(默认启用)选项来实现。

Android 设备监控器

DDMS 是 SDK 中提供的更高级的调试工具。DDMS 可以通过 Android Studio 中的Android 设备监控器工具访问。该工具能够监控真实设备和模拟器。

要打开 DDMS 视角,导航到工具 | Android | Android 设备监控器。您也可以从工具栏中点击 Android 设备监控器图标。将打开一个新窗口,其中包含 DDMS 视角。

在窗口的左侧部分,显示了连接设备的列表。目前,只列出了我们的虚拟设备。在设备部分,也展示了每个设备上运行的进程列表。我们应该能够定位到我们在之前启动的设备上的应用程序。从设备部分的工具栏中,我们可以使用停止标志图标停止一个进程。我们还可以通过点击相机图标来对虚拟设备进行屏幕截图。其他一些选项将在稍后解释。

在窗口的右侧部分,提供了有关设备的详细信息。这些信息分为七个标签页:线程分配跟踪器网络统计文件资源管理器模拟器控制系统信息。DDMS 视角中已集成的日志输出位于窗口的底部部分。

线程

线程标签显示属于所选进程的线程列表。从设备部分选择我们的应用程序进程。进程通过包名标识,在本例中为com.example.myapplication,然后从设备部分的工具栏中点击更新线程图标按钮,线程将被加载到标签页的内容中:

线程

第一列是线程的 ID。状态列表示线程的状态,utime表示线程执行用户代码所花费的总时间,stime表示线程执行系统代码所花费的总时间,而名称表示线程的名称。我们感兴趣的线程是那些花费时间执行我们用户代码的线程。

如果我们在应用程序中创建除主线程之外的线程,这个线程工具很有用。我们可以检查它们是否在应用程序的某个点上执行,以及它们的执行时间是否适中。

方法分析

方法分析是一种测量所选进程中方法执行性能的工具。测量的参数是调用次数和执行过程中所花费的 CPU 时间。有以下两种类型的时间消耗:

  • 独占时间:这是方法执行所花费的时间。

  • 包含时间:这是方法执行所花费的总时间。这个度量包括方法内部任何被调用的方法所花费的时间。这些被调用的函数被称为其子方法

要收集方法分析数据,从设备部分选择我们的应用程序进程,并点击设备部分的工具栏中的开始方法分析图标,紧邻更新线程图标。将显示一个对话框,让您选择您喜欢的分析选项。基于样本的分析使用采样频率进行分析,这种分析对运行时性能的影响较小,可以进行配置。基于样本的分析在 Android 4.4 及更高版本中可用。基于跟踪的分析分析所有方法的进入和退出。

在应用程序中执行一些操作;例如,在我们的示例应用程序中,输入一个名称并点击接受按钮以执行主活动的onAcceptClick方法。通过点击停止方法分析图标按钮来停止方法分析。

当方法分析停止时,在 DDMS 视图中打开一个新的标签,显示结果跟踪。在新标签的顶部,方法调用以时间图的形式表示;每一行属于一个线程。在跟踪的底部,方法花费的时间总结以表格形式表示。

按名称排序方法以搜索我们的onAcceptClick方法(com.example.myapplication.MainActivity.onAcceptClick)。点击它以展开其执行的详细信息。现在,注意以下事实:

  • onAcceptClick方法内部调用的子方法列出来。我们可以看到EditText.getText方法、Activity.findViewById方法和TextView.setText方法,我们确实在方法内部直接调用了这些方法,如下一张截图所示。

  • 调用/总数列详细说明了调用次数。例如,我们可以看到Activity.findViewById方法被调用了两次(2/2值)——一次用于找到TextView对象,另一次用于找到EditText对象。

  • 独占时间列对于父或子方法没有值,因为它们自己定义了这种测量时间的类型:方法分析

方法分析非常有用,可以检测执行时间过长的方法,并随后对其进行优化。我们可以识别最昂贵的操作,以避免对它们进行不必要的调用。

标签显示堆内存使用信息和所选进程的统计信息。选择应用程序进程,并从设备部分的工具栏中点击更新堆图标按钮来启用它。垃圾收集器(GC)执行后,将显示堆信息。要强制执行,请点击触发 GC按钮或从设备部分的工具栏中的垃圾图标。

第一张表格显示了堆使用的摘要:总大小、已分配空间、空闲空间和已分配对象的数量。统计表格提供了堆中按类型分配的对象的以下详细信息:对象数量(计数列)、这些对象的总大小(总大小列)、最小对象的大小(最小列)和最大对象的大小(最大列)、中值大小(中值列)和平均大小(平均列)。选择一种类型以加载底部的条形图。

图表显示了按大小(以字节为单位)计数的对象数量。如果我们右键单击图表,我们可以更改其属性(标题、颜色、字体、标签等)并将其保存为 PNG 格式的图像:

堆

分配跟踪器

分配跟踪器选项卡显示了所选进程的内存分配。选择应用程序进程并点击开始跟踪按钮以开始跟踪内存信息。然后,点击获取分配按钮以获取已分配对象的列表。

我们可以使用选项卡顶部的过滤器来过滤我们自己的类中分配的对象。在过滤器中输入我们的包名com.example.myapplication。对于每个对象,表格显示了其分配大小(分配大小)、线程(线程)、对象或类(分配类)以及对象被分配的方法(分配在)。点击任何对象以查看更多信息,例如,分配它的行号。

如您在下一张截图中所见,在主活动的onAcceptClick中分配了一个java.lang.StringBuilder对象。在底部部分,您可以检查其分配的详细信息:

分配跟踪器

最后,点击停止跟踪按钮。

分配跟踪器对于检查我们在应用程序中进行某些交互时分配的对象非常有用,以便改进内存使用。

网络统计

网络统计选项卡显示了我们的应用程序如何使用网络资源。要获取任何使用网络的网络统计信息,请点击开始按钮。数据传输将开始在图表中显示。

网络统计信息对于优化我们代码中的网络请求和控制执行过程中的数据传输非常有用。

文件资源管理器

文件资源管理器选项卡展示了设备的整个文件系统。我们可以检查每个元素的大小、日期或权限。导航到/data/app/以搜索我们的com.example.myapplication.apk应用程序包文件。

模拟器控制

模拟控制选项卡允许我们在虚拟设备中模拟一些特殊状态或活动。我们可以在不同的环境和情况下测试我们的应用程序,以检查其是否按预期运行。如果我们的应用程序具有依赖于设备物理位置的功能,我们可以使用模拟位置。以下是一些这些特殊状态:

  • 电话状态:此功能允许您选择语音和数据状态及其速度和延迟

  • 电话操作:此功能用于模拟来电或短信

  • 位置控制:此功能用于设置设备的地理位置

系统信息

系统信息选项卡以图表形式显示了设备的帧渲染时间、总 CPU 负载和总内存使用情况。我们可以搜索我们的应用程序,并轻松地将其与设备上运行的其余进程进行比较。

我们可以更改图表的属性,如颜色、字体和标题,并将它们保存为 PNG 格式的图像。要打开这些选项,请右键单击图表元素。

在我们的应用程序在前台运行时,打开 CPU 负载并保存图表。然后,关闭应用程序,通过单击从设备更新按钮来更新 CPU 负载。注意两个图表之间的差异以及空闲百分比的增长,如下面的截图所示:

系统信息

层次视图

Android 设备监视器除了 DDMS 之外还包含第二个视角——层次视图。在 Android 设备顶部栏中,您可以从一个视角切换到另一个视角。顶部栏中的两个选项在下一张截图中显示:

层次视图

打开层次视图视角,并从左侧列表中选择您的应用程序。在左侧面板中,单击以下图标(将视图层次结构加载到树视图中操作):

层次视图

视图层次结构按如下截图所示加载:

层次视图

有三个不同的面板:

  • 树形概览:此面板显示了完整视图层次结构的概览。

  • 树形视图:此面板详细显示了视图层次结构的一个特定区域。在层次结构的底部,我们可以找到 ID 为textView_greetingTextView,ID 为editText_nameEditText,以及 ID 为button_acceptButton。它们的父视图是RelativeLayout

  • 布局视图:此面板显示布局视图。

如果您选择其中一个视图元素,您可以看到其详细信息。以下截图显示了button_accept按钮的详细信息:

层次视图

从左侧面板打开视图属性选项卡。您可以检查按钮的属性,例如mText属性,其值为Accept

树视图面板的顶部,有一些操作,比如将树视图保存为 PNG 图像或捕获窗口层为 Photoshop 文件。

摘要

现在你已经了解了你应用程序的不同启动选项,以及如何使用控制台和LogCat进行调试。我们还看到了如何调试应用程序以及如何解释 DDMS 在每个可用标签页提供的数据。

在下一章中,我们将使用 Android Studio 为我们的应用程序发布做准备。首先,你将学习在发布模式下构建应用程序之前需要准备应用程序的必要步骤。你还将了解应用程序是如何在APK文件中压缩的,以及如何生成你自己的APK文件。最后,你将学习如何作为开发者获取你的证书以及如何生成一个已签名的APK文件,使其准备好发布。

第九章。准备发布

在上一章中,你已经学到了足够多的知识来测试和调试你的应用程序。为了准备你的应用程序发布,你需要做什么?你如何使用 Android Studio 来做到这一点?

本章描述了使用 Android Studio 准备应用程序发布所需的必要步骤。首先,你将了解应用程序包APK)文件——这是安卓应用程序打包的 JAR 文件的一种变体。然后,你将学习在完全测试应用程序后需要如何更改你的应用程序。最后,我们将对 APK 文件进行签名,使其准备好上传到 Google Play。

本章我们将讨论以下主题:

  • APK 文件

  • 构建类型

  • 准备发布

  • 生成已签名的 APK

  • 在发布模式下签名

理解 APK 文件

安卓应用程序打包在一个以 .apk 扩展名的文件中。这些文件仅仅是压缩的 ZIP 文件,因此其内容可以轻松地被探索。APK 文件通常包含以下内容:

  • assets/:这是一个包含应用程序资产文件的文件夹。这是与我们的项目相同的 assets 文件夹。

  • META-INF/:这是一个包含我们的证书的文件夹。

  • lib/:这是一个包含编译代码的文件夹,以防需要为处理器使用。

  • res/:这是一个包含应用程序资源,如图片、字符串等的文件夹。

  • AndroidManifest.xml:这是应用程序的清单文件。

  • classes.dex:这是一个包含应用程序编译代码的文件。

  • resources.arsc:这是一个包含一些预编译资源的文件,例如二进制 XML 文件。

拥有 APK 文件可以让应用程序在安卓操作系统中进行分发和安装。安卓应用程序可以按照你的喜好进行分发:通过应用市场,如 Google Play、Amazon App store 或 Opera Mobile Store;通过你的个人网站;甚至通过电子邮件发送给你的用户。如果你选择后两种选项之一,请考虑安卓默认情况下会阻止从 Google Play 以外的位置安装应用程序。你应该通知你的用户,他们需要在他们的设备中禁用此限制才能安装你的应用程序。他们必须通过在安卓设备中导航到设置 | 安全来检查未知来源选项。

构建类型

应用程序在构建时必须使用私钥进行签名。如果一个应用程序没有签名,它就不能在设备上安装,甚至不能在模拟器中安装。为了构建我们的应用程序,有两种类型:调试发布。两个 APK 版本包含相同的文件夹和编译文件;区别在于用于签名的密钥。两种模式如下解释:

  • 调试:在我们之前章节中运行和测试我们的应用程序时,我们处于调试模式,但我们没有密钥,也没有对应用程序进行签名。Android SDK 工具会自动创建一个调试密钥、别名及其密码来签名 APK。这个过程在我们使用 Android Studio 运行或调试应用程序时发生,而我们并没有意识到。我们不能发布由 SDK 工具创建的调试密钥签名的 APK。

  • 发布:当我们分发我们的应用程序时,我们必须构建一个发布版本。Google Play 要求 APK 文件必须使用证书签名,开发者保留私钥。在这种情况下,我们需要我们自己的私钥、别名和密码,并将它们提供给构建工具。证书标识应用程序的开发者,可以是自签名证书。不需要证书颁发机构签名证书。

将包含你的证书的密钥库保存在安全的地方。为了升级你的应用程序,你必须使用相同的密钥来上传新版本。如果你丢失了密钥库,你将无法更新你的应用程序。你将不得不创建一个新的应用程序,并使用不同的包名。

发布应用程序之前的步骤

在生成 APK 文件之前,你需要准备你的应用程序以在发布模式下构建。执行以下步骤:

  1. 首先,确保你已经完全测试了你的应用程序。我们建议以下几种方式来测试你的应用程序:

    • 在使用最低要求平台的设备上

    • 在使用目标平台的设备上

    • 在使用最新可用平台的设备上

    • 在真实设备上,而不仅仅是模拟器上

    • 在各种屏幕分辨率和尺寸的设备上

    • 如果你的应用程序支持,在平板电脑上

    • 如果你允许,在移动设备和平板电脑上切换到横幅模式

    • 在不同的网络条件下,例如没有互联网连接或覆盖范围低的情况下

    • 当你的设备上的 GPS 或其他位置服务未激活时(如果你的应用程序使用 GPS 或任何位置服务)

    • 当按下返回按钮时

  2. 其次,我们必须检查从我们的应用程序打印出的日志消息。打印某些日志消息可能被视为安全漏洞。Android 系统生成的日志可以被捕获和分析,因此我们应该避免显示关于应用程序内部工作的重要信息。你还应该从应用程序清单文件中移除android:debuggable属性。你也可以将此属性设置为false

  3. 第三,如果你的应用程序与服务器通信,请检查配置的 URL 是否为生产 URL。在调试阶段,你可能会引用一个预发布环境中的服务器 URL。

  4. 最后,从应用程序清单文件中设置android:versionCodeandroid:versionName属性的正确值。版本代码是一个表示应用程序版本的数字(整数)。新版本应该有更大的版本代码。此代码用于确定设备上安装的应用程序是否为最新版本,或者是否有更新的版本。

版本名称是一个表示应用程序版本的字符串。与版本代码不同,版本名称对用户可见,并出现在应用程序的公共信息中。它只是对用户的信息性版本名称,不用于任何内部目的。

为版本代码指定1的值,为版本名称指定1.0的值。manifest标签应如下所示:

<manifest 
    package="com.example.myapplication"
    android:versionCode="1"
    android:versionName="1.0" >

我们应用程序的新版本将版本代码的值为2,版本名称可能为1.1

<manifest 
    package="com.example.myapplication"
    android:versionCode="2"
    android:versionName="1.1" >

生成签名 APK

要生成签名 APK,导航到构建 | 生成签名 APK。选择app模块并点击下一步按钮。在生成签名 APK 的对话框中,我们被要求提供证书。APK 由此证书签名,表示它属于我们。

如果这是我们第一个应用程序,我们可能没有任何证书。点击创建新...按钮打开新密钥库对话框。现在,填写以下信息:

  • 密钥库路径:这是您系统中创建密钥库的路径。密钥库是一个具有.jks扩展名的文件,例如,release_keystore.jks

  • 密码:这是密钥库密码。您必须确认它。

  • 别名:这是您的证书别名,是一对公钥和私钥。让我们命名为releasekey

  • 密码:这是证书密码。您必须确认它。

  • 有效期(年):这是将在有效期到期时有效的证书。建议使用 25 年或更长的值。

  • 证书:这是证书中包含的个人信息的。输入您的名字和姓氏、组织单位、组织、城市或地区、州或省和国家代码;例如,将组织单位设置为AS,将组织设置为packtpub,将国家代码设置为ES

您可以在下一张截图中看到新密钥库对话框:

生成签名 APK

点击确定。创建签名 APK 的对话框现在已加载密钥库数据。下次我们创建签名 APK 时,我们已经有证书,所以我们将选择选择现有按钮。点击下一步按钮。在下一步中,选择 APK 文件的保存路径,选择发布构建类型,然后点击完成。当 APK 完全生成时,您将通过 Android Studio 底部栏的消息和 Android Studio 顶部部分的以下通知得到通知:

生成签名 APK

我们应该在所选路径中创建 APK 文件。现在您有了准备发布的 APK 文件,建议在分发之前在设备上再次测试它。

在发布模式下自动签名

在调试模式下运行时,应用会自动签名,因为调试密钥是自动生成的。如果我们尝试在发布模式下运行我们的应用,将显示以下错误,因为 Android Studio 不知道如何为我们签名:错误:您当前选择的变体(app-release-unsigned.apk)未签名。请为此变体指定签名配置(发布)

如果我们想在发布模式下运行我们的应用,我们需要配置我们的构建设置。

通过导航到文件 | 项目结构...打开项目结构设置。在模块部分选择您的应用,并打开签名选项卡。点击加号创建一个新的签名配置。重命名配置并输入您的密钥库数据,如图所示:

在发布模式下自动签名

切换到构建类型选项卡,其中列出了默认的两个构建类型:调试和发布。选择发布,并在签名配置选择器中选择最近创建的配置(releaseConfig):

在发布模式下自动签名

点击确定完成配置。现在,您的应用将自动使用您的发布密钥在发布模式下进行签名。

实际上,这个签名配置已经修改了您的应用模块的build.gradle文件。打开此文件以观察更改:

  • 使用以下代码添加了新的签名配置:

    signingConfigs {
       releaseConfig {
          keyAlias 'releaseKey'
          keyPassword 'password'
          storeFile
             file('/Users/belen/release_keystore.jks')
          storePassword 'password'
       }
    }
    
  • 发布构建类型现在指向之前的签名配置:

    buildTypes {
       release {
          minifyEnabled false
          proguardFiles 
             getDefaultProguardFile('proguard-android.txt'),
             'proguard-rules.pro'
          signingConfig signingConfigs.releaseConfig
       }
    }
    

如果您不想在build.gradle文件中暴露您的密码,有一些替代方案,例如,将您的密码保存在一个properties文件中,您可以从build.gradle文件中读取它。

在发布模式下运行您的应用

现在由于我们的应用将自动进行发布签名,我们可以使用发布模式运行和测试我们的应用程序。要在发布模式下运行应用程序,打开位于 Android Studio 左侧栏中的构建变体面板,如图所示:

在发布模式下运行您的应用

您的应用模块显示在构建变体面板中,包括当前构建变体,默认为调试。将构建变体值更改为发布后,您的应用即可在发布模式下运行。

APK 分析器

Android Studio 2.2 引入了一个新功能——APK 分析器。此工具分析所选 APK 文件的内容。您可以查看组件的大小、最终的AndroidManifest.xml文件和编译的资源。

导航到构建 | APK 分析器并选择您的 APK 文件。将打开一个新标签页,显示 APK 文件详情,如图所示:

APK Analyzer

APK 中的所有文件及其文件大小都会列出:原始文件大小下载大小。下载大小是用户下载 APK 时文件大小的估计。

当您选择一个文件时,您可以在底部部分看到其详细信息。选择classes.dex文件以查看 APK 文件中所有类的列表,如下面的截图所示:

APK Analyzer

对于每个类,都会显示其方法数量并提供一个摘要。这些信息有助于避免 64k 引用方法限制问题。在Dalvik 可执行文件dex)字节码文件中可以引用的方法总数有限制:65536。使用 APK 分析器,您可以跟踪您的 APK 中方法的数量。

如果您的应用程序超过了限制,重构或代码清理不够,您可以为您的应用程序启用多 dex 配置。多 dex 配置将创建不同的dex文件。在您的build.gradle文件的defaultConfig中添加以下行以启用多 dex:

multiDexEnabled true

您还需要在清单文件中添加MultiDexApplication类:

android:name="android.support.multidex.MultiDexApplication"

摘要

您学习了如何制作 APK 文件以及如何修改您的应用程序以便发布。您还学习了如何使用开发者证书对应用程序进行签名。到本章结束时,您应该已经生成了一个准备发布的已签名 APK。

在附录中,您将学习如何使用 Android Studio 获取帮助。我们将访问 Android Studio 的在线文档并浏览帮助主题。最后,您将了解如何使用内置的更新功能保持您的 Android Studio 实例更新。

附录 A. 获取帮助

在使用新的 IDE 开发应用程序时,总会对如何执行某些操作产生疑问。一个成功的 IDE 通常包括帮助向导和文档,帮助用户解决不同的问题。您想知道如何使用 Android Studio 获取帮助吗?

在最后一章中,我们将学习关于 Android Studio 文档和帮助主题的内容。我们将学习官方文档中可在线访问的官方 Android 网站上的主题。最后,我们将学习如何使用更新功能保持我们的 Android Studio 实例更新。

以下主题包括:

  • Android Studio 帮助

  • 在线文档

  • Android Studio 更新

从 Android Studio 获取帮助

Android Studio 文档可在 Android 开发者网站上找到,网址为 developer.android.com/studio。Android Studio 文档也包含在 IntelliJ IDEA 网络帮助中。您可以通过 Android Studio 的菜单 帮助 | 在线文档 访问此文档,或访问 tools.android.com/welcome-to-android-studio

您可以导航到 帮助 | 帮助主题 直接打开文档内容树,或访问 www.jetbrains.com/idea/webhelp/intellij-idea.html。还有一些在线视频教程可供参考,网址为 tv.jetbrains.net/

要快速查找 Android Studio 的操作,我们可以使用 帮助 | 查找操作 选项。输入您要查找的操作,将显示匹配的操作列表。您可以直接从列表对话框中更改一些首选项值,或者点击导航到它们。以下截图显示了 查找操作 功能。

从 Android Studio 获取帮助

Android Studio 提供了每日提示功能。每日提示通过对话框解释 Android Studio 的一些技巧。每次打开 Android Studio 时,都会显示此对话框。我们可以使用 上一个提示下一个提示 按钮浏览更多提示。通过取消选择 启动时显示提示 复选框,我们可以禁用此功能。可以通过导航到 帮助 | 每日提示 打开提示对话框。下一屏显示的是每日提示屏幕的示例。

从 Android Studio 获取帮助

Android 在线文档

由 Google 提供的官方 Android 文档可在 developer.android.com/ 获取。此文档包含所有必要的指南,不仅教授如何编程 Android 应用程序,还教授如何为 Android 设计以及如何分发和推广我们的应用程序。由于该网站内容丰富,以下列出了一些对本书各章节中知识扩展有用的具体指南:

  1. 第一章,安装和配置 Android Studio

  2. 第二章,开始项目

  3. 第三章,导航项目

  4. 第四章,使用代码编辑器

  5. 第五章,创建用户界面

  6. 第六章,工具

  7. 第七章,Google Play 服务

  8. 第八章,调试

  9. 第九章,准备发布

更新

帮助 菜单中,我们可以检查 Android Studio 的更新。导航到 帮助 | 检查更新 (在 Mac 上为 Android Studio | 检查更新)。当检查完成后,如果存在尚未安装的 Android Studio 更新,更新信息将在对话框中显示。此对话框在以下屏幕截图中显示:

更新

我们可以查看当前版本和新版本代码。我们可以选择是否忽略更新(点击忽略此更新按钮),稍后更新(点击稍后提醒我按钮),查看关于更新的在线发布说明(点击发布说明按钮),或者安装更新(点击下载按钮)。点击最后一个选项以更新 Android Studio。更新首先开始下载,然后 Android Studio 将重新启动,并安装更新。

如果我们已安装了 Android Studio 的最新版本,将显示以下消息:

您已安装了 Android Studio 的最新版本。

要配置自动更新设置,请参阅您的 IDE 设置中的更新对话框

点击更新链接以打开更新配置对话框,如图所示。此对话框提供了当前版本详细信息、Android SDK Tools 版本、Android 平台版本或上次检查更新的时间。我们可以选择是否让 Android Studio 自动检查更新以及要检查哪种类型的更新:Canary ChannelDev ChannelBeta ChannelStable Channel

更新

我们可以通过导航到菜单帮助 | Android Studio 的新功能来检查最近 Android Studio 更新的信息。这些信息可在tools.android.com/recent在线获取。要获取我们当前拥有的 Android Studio 版本或甚至系统中的 Java 版本,请导航到帮助 | 关于(在 Mac 上为Android Studio | 关于 Android Studio)。

摘要

我们已经学习了如何在需要帮助时使用 Android Studio 文档。我们还了解了更新功能,以确保始终安装 Android Studio 的最新版本。到本章结束时,用户应该能够使用在线文档和帮助主题搜索帮助,并保持其 Android Studio 更新,以便使用最新的功能。

posted @ 2025-09-28 09:13  绝不原创的飞龙  阅读(1)  评论(0)    收藏  举报