# Android **Repository Path**: zhousir03/android ## Basic Information - **Project Name**: Android - **Description**: Android Studio创建并编译App工程的过程和步骤,首先叙述了如何通过Android Studio 创建新的App项目,接着描述了如何导入已有的App工程(包括导入项目和导入模块两种方式),然后阐述了如何手工编译App工程。 包含了所有Android 开发案例demo,从入门到实战 - **Primary Language**: Android - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-14 - **Last Updated**: 2024-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 第1章 Android开发环境搭建 本章介绍了如何在个人电脑上搭建Android开发环境,主要包括:Android开发的发展历史是怎样的、 Android Studio的开发环境是如何搭建的、如何创建并编译App工程、如何运行和调试App。 ## 1.1 Android开发简介 本节介绍Android开发的历史沿革,包括Android的发展历程和Android Studio的发展历程两个方面。 ### 1.1.1 Android的发展历程 安卓(Android)是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android操作系统 初由Andy Rubin开发,主要支持手机。 > 2005年8月由Google收购注资。 > > 2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统,并发布了Android的源代码。 > > 第一部Android智能手机发布于2008年10月,由 HTC 公司制造。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表、车载大屏、智能家居等,并逐渐成为了人们日常生活中不可或缺的系统软件。 > > 2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 > > 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。 > > 2019年,谷歌官方宣布全世界有25亿活跃的Android设备,还不包含大多数中国设备。 Android几乎每年都要发布一个大版本,技术的更新迭代非常之快,表1-1展示了Android几个主要版本的发布时间。 表1-1 Android主要版本的发布时间 [TABLE] ### 1.1.2 Android Studio的发展历程 虽然Android基于Linux内核,但是Android手机的应用App主要采用Java语言开发。为了吸引众多的Java 程序员,早期的App开发工具使用Eclipse,通过给Eclipse安装ADT插件,使之支持开发和调试App。然 而Eclipse毕竟不是专门的App开发环境,运行速度也偏慢,因此谷歌公司在2013年5月推出了全新的 Android开发环境—Android Studio。Android Studio基于IntelliJ IDEA演变而来,既保持了IDEA方便快捷的特点,又增加了Android开发的环境支持。自2015年之后,谷歌公司便停止了ADT的版本更新,转而重点打造自家的Android Studio,数年升级换代下来,Android Studio的功能愈加丰富,性能也愈高效,使得它逐步成为主流的App开发环境。表1-2展示了、几个主要版本的发布时间。 表1-2 Android Studio主要版本的发布时间 ![](media/image1.jpeg) ## 1.2 搭建Android Studio开发环境 本节介绍在电脑上搭建Android Studio开发环境的过程和步骤,首先说明用作开发机的电脑应当具备哪些基本配置,接着描述了Android Studio的安装和配置详细过程,然后叙述了如何下载Android开发需要的SDK组件及相关工具。 ### 1.2.1 开发机配置要求 工欲善其事,必先利其器。要想保证Android Studio的运行速度,开发用的电脑配置就要跟上。现在一般用笔记本电脑开发App,下面是对电脑硬件的基本要求: 1. 内存要求至少8GB,越大越好。 2. CPU要求1.5GHz以上,越快越好。 3. 硬盘要求系统盘剩余空间10GB以上,越大越好。 4. 要求带无线网卡与USB插槽。 下面是对操作系统的基本要求(以Windows为例)。 1. 必须是64位系统,不能是32位系统。 2. Windows系统至少为Windows 7,推荐Windows 10,不支持Windows XP。 下面是对网络的基本要求: 1. 好连接公众网,因为校园网可能无法访问国外的网站。 2. 下载速度至少每秒1MB,越快越好。因为Android Studio安装包大小为1GB左右,还需要另外下载几百MB的SDK,所以网络带宽一定要够大,否则下载文件都要等很久。 ### 1.2.2 安装Android Studio Android Studio的官方下载页面是[*https://developer.android.*g*oo*g*le.cn/studio/index.html*,](https://developer.android.google.cn/studio/index.html)单击网页中央的DOWNLOAD按钮即可下载Android Studio的安装包。或者下拉网页找到“Android Studio downloads”区域,选择指定操作系统对应的Android Studio安装包。 双击下载完成的Android Studio安装程序,弹出安装向导对话框,如图1-1所示。直接单击Next按钮,进入下一页的组件选择对话框,如图1-2所示。 > ![](media/image2.jpeg) 图1-1 Android Studio的安装向导 > ![](media/image3.jpeg) 图1-2 勾选Android Studio的安装组件 勾选Android Studio和Android Virtual Device两个选项,然后单击Next按钮,进入下一页的安装路径对话框,如图1-3所示。建议将Android Studio安装在除系统盘外的其他磁盘(比如E盘),然后单击Next 按钮,进入下一页的开始菜单设置对话框,如图1-4所示。 > ![](media/image4.jpeg) 图1-3 选择Android Studio的安装目录 > ![](media/image5.jpeg) 图1-4 设置Android Studio的开始菜单 单击右下角的Install按钮,跳到下一页的安装过程对话框,耐心等待安装操作,安装过程的界面如图1-5 所示。单击Next按钮进入完成对话框,如图1-6所示。 > ![](media/image6.jpeg) 图1-5 Android Studio的安装过程对话框 > ![](media/image7.jpeg) 图1-6 Android Studio的完成安装对话框 勾选完成对话框的“Start Android Studio”选项,再单击右下角的Finish按钮,结束安装操作的同时启动 Android Studio。稍等片刻Android Studio启动之后会打开如图1-7所示的配置向导对话框。单击Next 按钮进入下一页的安装类型对话框,如图1-8所示。 > ![](media/image8.jpeg) 图1-7 Android Studio的配置向导对话框 > ![](media/image9.jpeg) 图1-8 Android Studio的安装类型对话框 这里保持Standard选项,单击Next按钮,跳到下一页的界面,如图1-9所示。选中右边的Light主题,表示开发界面采取白底黑字,然后单击Next按钮,跳到下一页的设置确认对话框,如图1-10所示。 > ![](media/image10.jpeg) 图1-9 Android Studio的对话框 > ![](media/image11.jpeg) 图1-10 Android Studio的设置确认对话框 设置确认对话框列出了需要下载哪些工具及其大小,确认完毕后继续单击Next按钮,跳到下一页的组件下载对话框,如图1-11所示。耐心等待组件下载操作,全部下载完成后,该对话框提示成功更新,如图 1-12所示。 > ![](media/image12.jpeg) 图1-11 Android Studio的组件下载对话框 > ![](media/image13.jpeg) 图1-12 Android Studio的更新完成对话框 单击对话框右下角的Finish按钮,完成安装配置工作,同时打开Android Studio欢迎界面,如图1-13所示。单击第一项的“Start a new Android Studio project”即可开始你的Android开发之旅。 另外注意,配置过程可能发生如下错误提示: 1. 第一次打开Android Studio可能会报Unable to access Android SDK add-on list错误信息,这个界面不用理会,单击Cancel按钮即可。进入Android Studio主界面后,依次选择菜单File→Project Structure→SDK Location,在弹出的对话框中设置SDK的路径。设置完毕后再打开Android Studio就不会报错了。 ![](media/image14.jpeg) 图1-13 Android Studio的欢迎界面 2. 已经按照安装步骤正确安装,运行Android Studio时却总是打不开。这时请检查电脑上是否开启了防火墙,建议关闭系统防火墙及所有杀毒软件的防火墙。关闭了防火墙后再重新打开Android Studio重试。 ### 1.2.3 下载Android的SDK Android Studio只提供了App的开发环境界面,编译App源码还需另外下载Android官方的SDK,上一小节中的图1-10便展示了初始下载安装的SDK工具包。SDK全称为Software Development Kit,意即软件开发工具包,它可将App源码编译为可执行的App应用。随着Android版本的更新换代,SDK也需时常在线升级,接下来介绍如何下载 新的SDK。 在Android Studio主界面,依次选择菜单Tools→SDK Manager,或者在Android Studio右上角中单击图标,如图1-14所示。 > ![](media/image15.jpeg) 图1-14 打开SDK Manager的图标栏 此时弹出SDK Manager的管理界面,窗口右边是SDK安装配置区域,初始画面如图1-15所示。注意 Android SDK Location一栏,可单击右侧的Edit链接,进而选择SDK下载后的保存路径。其下的三个选项卡默认显示SDK Platforms,也就是各个SDK平台的版本列表,勾选每个列表项左边的复选框,表示需要下载该版本的SDK平台,然后单击OK按钮即可自动下载并安装SDK。也可单击中间SDK Tools选项卡,此时会切换到SDK工具的管理列表,如图1-16所示。在这个工具管理界面,能够在线升级编译工具 Build Tools、平台工具Platform Tools,以及开发者需要的其他工具。 ![](media/image16.jpeg) 图1-15 SDK平台的管理列表 ![](media/image17.jpeg) 图1-16 SDK工具的管理列表 SDK下载完成,可以到“我的电脑”中打开Android SDK Location指定的SDK保存路径,发现下面还有十几个目录,其中比较重要的几个目录说明如下: > build-tools目录,存放各版本Android的编译工具。 > > emulator目录,存放模拟器的管理工具。 > > platforms目录,存放各版本Android的资源文件与内核JAR包android.jar。 > > platform-tools目录,存放常用的开发辅助工具,包括客户端驱动程序adb.exe、数据库管理工具 sqlite3.exe,等等。 > > sources目录,存放各版本Android的SDK源码。 ### 1.3 创建并编译App工程 本节介绍使用Android Studio创建并编译App工程的过程和步骤,首先叙述了如何通过Android Studio 创建新的App项目,接着描述了如何导入已有的App工程(包括导入项目和导入模块两种方式),然后阐述了如何手工编译App工程。 #### 1.3.1 创建新项目 在“1.2.2 安装Android Studio”小节 后一步出来的图1-13中,单击第一项的Start a new Android Studio project会创建初始的新项目。如果要创建另外的新项目,也可在打开Android Studio之后,依次选择菜单File→New→New Project。以上两种创建方式都会弹出如图1-17所示的项目创建对话框,在该对话框中选择第一行第四列的“Empty Activity”,单击Next按钮跳到下一个配置对话框如图1-18所示。 ![](media/image18.jpeg) 图1-17 创建新项目 ![](media/image19.jpeg) 图1-18 指定目标设备 在配置对话框的Name栏输入应用名称,在Package Name栏输入应用的包名,在Save Location栏输入或者选择项目工程的保存目录,在Language下拉框中选择编码语言为Java,在Minimun SDK下拉框中选择 低支持到“API19:Android 4.4(KitKat)”,Minimun SDK下方的文字提示当前版本支持设备的市场 份额为98.1%。下面有个复选框“User legacy android.support libraries”,如果勾选表示采用旧的 support支持库,如果不勾选表示采用新的androidx库,因为Android官方不再更新旧的support库,所以此处无须勾选,默认采用新的androidx库就可以了。 然后单击Finish按钮完成配置操作,Android Studio便自动创建规定配置的新项目了。稍等片刻, Android Studio将呈现刚创建好的项目页面,如图1-19所示。 ![](media/image20.jpeg) 图1-19 刚刚创建的新项目页面 工程创建完毕后,Android Studio自动打开activity_main.xml与MainActivity.java,并默认展示 MainActivity.java的源码。MainActivity.java上方的标签表示该文件的路径结构,注意源码左侧有一列标 签,从上到下依次是Project、Resource Manager、Structure、Build Variants、Favorites。单击 Project标签,左侧会展开小窗口表示该项目工程的目录结构,如图1-20所示。单击Structure标签,左侧会展开小窗口表示该代码的内部方法结构,如图1-21所示。 > ![](media/image21.jpeg) 图1-20 新项目的工程结构 > ![](media/image22.jpeg) 图1-21 MainActivity的方法结构 #### 1.3.2 导入已有的工程 本书提供了所有章节的示例源码,为方便学习,读者可将本书源码直接导入Android Studio。根据App 工程的组织形式,有两种源码导入方式,分别是导入整个项目,以及导入某个模块,简要说明如下。 **1.导入整个项目** 以本书源码MyApp为例,依次选择菜单File→Open,或者依次选择菜单File→New→Import Project,均会弹出如图1-22所示的文件对话框。 > ![](media/image23.jpeg) 图1-22 打开App项目的文件对话框 在文件对话框中选中待导入的项目路径,再单击对话框下方的OK按钮。此时文件对话框关闭,弹出另一个如图1-23所示的确认对话框。 ![](media/image24.jpeg) 图1-23 是否开启新窗口的确认对话框 确认对话框右下角有3个按钮,分别是This Window、New Window和Cancel,其中This Window按钮表 示在当前窗口打开该项目,New Window按钮表示在新窗口打开该项目,Cancel按钮表示取消打开操作。此处建议单击New Window按钮,即可在新窗口打开App项目。 **2.导入某个模块** 如果读者已经创建了自己的项目,想在当前项目导入某章的源码,应当通过Module方式导入模块源码。 依次选择菜单File→New→Import Module,弹出如图1-24所示的导入对话框。 单击Source Directory输入框右侧的文件夹图标,弹出如图1-25所示的文件对话框。 ![](media/image25.jpeg) 图1-24 导入模块的对话框 > ![](media/image26.jpeg) 图1-25 选择模块的文件对话框 在文件对话框中选择待导入的模块路径,再单击对话框下方的OK按钮,回到如图1-26所示的导入对话框。 可见导入对话框已经自动填上了待导入模块的完整路径,单击对话框右下角的Finish按钮完成导入操 作。然后Android Studio自动开始模块的导入和编译动作,等待导入结束即可在Android Studio左上角的项目结构图中看到导入的chapter02模块,如图1-27所示。 ![](media/image27.jpeg) 图1-26 填写模块路径的对话框 > ![](media/image28.jpeg) 图1-27 成功导入模块之后的项目结构图 #### 1.3.3 编译App工程 Android Studio跟IDEA一样,被改动的文件会自动保存,无须开发者手工保存。它还会自动编译 新的 代码,如果代码有误,编辑界面会标红提示出错了。但是有时候可能因为异常关闭的缘故,造成 Android Studio的编译文件发生损坏,此时需要开发者手动重新编译,手动编译有以下3种途径: 1. 依次选择菜单Build→Make Project,该方式会编译整个项目下的所有模块。 2. 依次选择菜单Build→Make Module \*\*\*,该方式会编译指定名称的模块。 3. 先选择菜单Build→Clean Project,再选择菜单Build→Rebuild Project,表示先清理当前项目,再对整个项目重新编译。 不管是编译项目还是编译模块,编译结果都展示在Android Studio主界面下方的Build窗口中,如图1-28 所示。 ![](media/image29.jpeg) 图1-28 App工程的编译结果窗口由编译结果可知,当前项目编译耗时2分29秒,共发现了1个警告,未发现错误。 ### 1.4 运行和调试App 本节介绍使用Android Studio运行和调试App的过程,首先叙述了如何创建Android Studio内置的模拟器,接着描述了如何在刚创建的模拟器上运行测试App,然后阐述了如何在Android Studio中查看App 的运行日志。 #### 1.4.1 创建内置模拟器 所谓模拟器,指的是在电脑上构造一个演示窗口,模拟手机屏幕的App运行效果。App通过编译之后,只说明代码没有语法错误,若想验证App能否正确运行,还得让它在Android设备上跑起来。这个设备可以是真实手机,也可以是电脑里的模拟器。依次选择菜单Run→Run (也可按快捷键Shift+F10),或者选择菜单Run→Run…,在弹出的小窗中选择待运行的模块名称,Android Studio会判断当前是否存在已经连接的设备,如果已有连接上的设备就在该设备上安装测试App。 因为一开始没有任何已连上的设备,所以运行App会报错“Error running :No target device found.”,意思是未找到任何目标设备。此时要先创建一个模拟器,依次选择菜单Tools→AVD Manager,或者在 Android Studio右上角的按钮中单击图标,如图1-29所示。 > ![](media/image30.jpeg) 图1-29 打开AVD Manager的图标栏 此时Android Studio打开模拟器的创建窗口,如图1-30所示。 单击创建窗口中的Create Virtual Device按钮,弹出如图1-31所示的硬件选择对话框。 ![](media/image31.jpeg) 图1-30 模拟器的创建窗口 ![](media/image32.jpeg) 图1-31 硬件选择对话框 在对话框的左边列表单击Phone表示选择手机,在中间列表选择某个手机型号如Pixel 2,然后单击对话框右下角的Next按钮,跳到下一页的系统镜像选择对话框如图1-32所示。 ![](media/image33.jpeg) 图1-32 系统镜像选择对话框 看到镜像列表顶端的发布名称叫R,对应的API级别为30,它正是Android 11的系统镜像。单击R右边的 Download链接,弹出如图1-33所示的许可授权对话框。 ![](media/image34.jpeg) 图1-33 许可授权对话框 单击许可授权对话框的Accept选项,表示接受上述条款,再单击Next按钮跳到下一页的镜像下载对话框,如图1-34所示。 ![](media/image35.jpeg) 图1-34 镜像下载对话框 等待镜像下载完成,单击右下角的Finish按钮,返回到如图1-35所示的系统镜像选择对话框。 此时R右边的Download链接消失,说明电脑中已经存在该版本的Android镜像。于是选中R这行,再单击Next按钮,跳到模拟器的配置对话框如图1-36所示。 ![](media/image36.jpeg) 图1-35 系统镜像选择对话框 ![](media/image37.jpeg) 图1-36 模拟器的配置对话框 配置对话框左上方的AVD Name用于填写模拟器的名称,这里保持默认名称不动,单击对话框右下角的 Finish按钮完成创建操作。一会儿对话框关闭,回到如图1-37所示的模拟器列表对话框,可见多了个名为Pixel 2 API 30的模拟器,且该模拟器基于Android 11(API 30)。 ![](media/image38.jpeg) 图1-37 模拟器的列表对话框 #### 1.4.2 在模拟器上运行App 模拟器创建完成后,回到Android Studio的主界面,即可在顶部工具栏的下拉框中发现多了个“Pixel 2 API 30”,它正是上一小节创建好的模拟器,如图1-38所示。 ![](media/image39.jpeg) 图1-38 顶部工具栏出现刚创建的模拟器 重新选择菜单Run→Run 'app',也可直接单击“Pixel 2 API 30”右侧的三角运行按钮,Android Studio便开始启动名为“Pixel 2 API 30”的模拟器,如图1-39所示。等待模拟器启动完毕,出现模拟器的开机画面如图1-40所示。再过一会儿,模拟器自动打开如图1-41所示的App界面。 > ![](media/image40.jpeg) 图1-39 模拟器正在启动 > ![](media/image41.jpeg) > > 图1-40 模拟器的开机画面 > > ![](media/image42.jpeg) 图1-41 模拟器运行App 可见模拟器屏幕左上角的应用名称为MyApp,页面内容为Hello World!它正是刚才想要运行的测试 App,说明已经在模拟器上成功运行App了。 #### 1.4.3 观察App的运行日志 虽然在模拟器上能够看到App的运行,却无法看到App的调试信息。以前写Java代码的时候,通过 System.out.println可以很方便地向IDEA的控制台输出日志,当然Android Studio也允许查看App的运行日志,只是Android不使用System.out.println,而是采用Log工具打印日志。 有别于System.out.println,Log工具将各类日志划分为5个等级,每个等级的重要性是不一样的,这些日志等级按照从高到低的顺序依次说明如下: > Log.e:表示错误信息,比如可能导致程序崩溃的异常。 > > Log.w:表示警告信息。 > > Log.i:表示一般消息。 > > Log.d:表示调试信息,可把程序运行时的变量值打印出来,方便跟踪调试。 > > Log.v:表示冗余信息。 一般而言,日常开发使用Log.d即可,下面是给App添加日志信息的代码例子: (完整代码见app\src\main\java\com\example\app\MainActivity.java) 重新运行测试App,等模拟器刷新App界面后,单击Android Studio底部的“Logcat”标签,此时主界面下方弹出一排日志窗口,如图1-42所示。 ![](media/image43.jpeg) 图1-42 Android Studio的日志查看窗口 日志窗口的顶部是一排条件筛选框,从左到右依次为:测试设备的名称(如“Pixel_2_API_30”)、测试 App的包名(例如只显示com.example.myapp的日志)、查看日志的级别(例如只显示级别不低于 Debug即Log.d的日志)、日志包含的字符串(例如只显示包含MainActivity的日志),还有 后一个是筛选控制选项(其中“Show only selected application”表示只显示选中的应用日志,而“No Filters”则表示不过滤任何条件)。一排条件筛选之后,logcat窗口只显示一行“D/MainActivity:我看到你了”,说明成功捕获前面代码调用Log.d的日志信息。 ### 1.5 小结 本章主要介绍了Android开发环境的搭建过程,包括:Android开发简介(Android的发展历程、 Android Studio的发展历程)、搭建Android Studio开发环境(开发机配置要求、安装Android Studio、下载Android的SDK)、创建并编译App工程(创建新项目、导入已有的工程、编译App工 程)、运行和调试App(创建内置模拟器、在模拟器上运行App、观察App的运行日志)。 通过本章的学习,读者应该掌握Android Studio的基本操作技能,能够使用自己搭建的Android Studio 环境创建简单的App工程,并在模拟器上成功运行测试App。 ### 1.6 课后练习题 1. **填空题** 1.Android是基于\_\_ 的移动端开源操作系统。 2.Android系统是由**\_\_**公司推出的。 3.Android 11对应的API编号是**\_\_**。 4.App除了在手机上运行,还能在电脑的**\_\_**上运行。 5.Android Studio创建模拟器的管理工具名为**\_\_**\_\_。 2. **判断题(正确打√,错误打×)** 1.第一部Android手机由诺基亚制造。(  ) 2.Android Studio由Eclipse演变而来。(  ) 3.Android Studio只能在64位操作系统上运行。(  ) 4.运行App指的是运行某个模块,而非运行某个项目。(  ) 5.App可以在电脑上直接运行。(  )**三、选择题** 1.智能手机的两大操作系统是(  )。 A.Android B.iOS C.Symbian D.Windows 2.下列哪些设备可以运行Android系统(  )。 A.智能手机 B.平板电脑 C.智能电视 D.车载大屏 3.Android提供的App专用开发工具包名为(  )。 A.JDK B.NDK C.SDK D.SSH 4.Android App开发主要使用的编程语言是(  )。 A.C/C++ B.Java C.Python D.Swift 5.打印调试级别的日志方法名为(  )。 A.Log.e B.Log.w C.Log.i D.Log.d 4. **简答题** 请列出导入App工程的几种方式。 5. **动手练习** 请上机实验搭建App的开发环境,主要步骤说明如下: 1. 下载并安装Android Studio的 新版本。 2. 创建一个新的App项目“Hello World”。 3. 使用Android Studio创建一个模拟器。 4. 在模拟器上安装并运行第二步创建的App,观察能否看到“Hello World”字样。 # 第2章 Android App开发基础 本章介绍基于Android系统的App开发常识,包括以下几个方面:App开发与其他软件开发有什么不一样,App工程是怎样的组织结构又是怎样配置的,App开发的前后端分离设计是如何运作实现的,App的活动页面是如何创建又是如何跳转的。 ## 2.1 App的开发特点 本节介绍了App开发与其他软件开发不一样的特点,例如:App能在哪些操作系统上运行、App开发用到了哪些编程语言、App能操作哪些数据库等,搞清楚了App的开发运行环境,才能有的放矢不走弯路。 ### 2.1.1 App的运行环境 App是在手机上运行的一类应用软件,而应用软件依附于操作系统,无论电脑还是手机,刚开机都会显示桌面,这个桌面便是操作系统的工作台。个人电脑的操作系统主要有微软的Windows和苹果的Mac OS,智能手机流行的操作系统也有两种,分别是安卓手机的Android和苹果手机的iOS。本书讲述的App 开发为Android上的应用开发,Android系统基于Linux内核,但不等于Linux系统,故App应用无法在 Linux系统上运行。 Android Studio是谷歌官方推出的App开发环境,它提供了三种操作系统的安装包,分别是Windows、 Mac和Linux。这就产生一个问题:开发者可以在电脑上安装Android Studio,并使用Android Studio开发App项目,但是编译出来的App在电脑上跑不起来。这种情况真是令人匪夷所思的,通常学习C语言、 Java或者Python,都能在电脑的开发环境直接观看程序运行过程,就算是J2EE开发,也能在浏览器通过网页观察程序的运行结果。可是安卓的App应用竟然没法在电脑上直接运行,那该怎样验证App的界面展示及其业务逻辑是否正确呢? 为了提供App开发的功能测试环境,一种办法是利用Android Studio创建内置的模拟器,然后启动内置模拟器,再在模拟器上运行App应用,详细步骤参见第一章的“1.4.2 在模拟器上运行App”。 另一种办法是使用真实手机测试App,该办法在实际开发中更为常见。由于模拟器本身跑在电脑上面,占用电脑的CPU和内存,会拖累电脑的运行速度;况且模拟器仅仅是模拟而已,无法完全验证App的所有功能,因此 终都得通过真机测试才行。 利用真机调试要求具备以下5个条件: **1.使用数据线把手机连到电脑上** 手机的电源线拔掉插头就是数据线。数据线长方形的一端接到电脑的USB接口,即可完成手机与电脑的连接。 **2.在电脑上安装手机的驱动程序** 一般电脑会把手机当作USB存储设备一样安装驱动,大多数情况会自动安装成功。如果遇到少数情况安装失败,需要先安装手机助手,由助手软件下载并安装对应的手机驱动。 **3.打开手机的开发者选项并启用USB调试** 手机出厂后默认关闭开发者选项,需要开启开发者选项才能调试App。打开手机的设置菜单,进入“系统” →“关于手机”→“版本信息”页面,这里有好几个版本项,每个版本项都使劲点击七、八下,总会有某个版本点击后出现“你将开启开发者模式”的提示。继续点击该版本开启开发者模式,然后退出并重新进入设置页面,此时就能在“系统”菜单下找到“开发者选项”或“开发人员选项”了。进入“开发者选项”页面,启用 “开发者选项”和“USB调试”两处开关,允许手机通过USB接口安装调试应用。 **4.将连接的手机设为文件传输模式,并允许计算机进行USB调试** 手机通过USB数据线连接电脑后,屏幕弹出如图2-1所示的选择列表,请求选择某种USB连接方式。这里记得选中“传输文件”,因为充电模式不支持调试App。 选完之后手机桌面弹出如图2-2所示的确认窗口,提示开发者是否允许当前计算机进行USB调试。这里勾选“始终允许使用这台计算机进行调试”选项,再点击右下角的确定按钮,允许计算机在手机上调试App。 > ![](media/image44.jpeg) 图2-1 USB连接方式选择列表 > ![](media/image45.jpeg) 图2-2 USB调试的确认对话框 **5.手机要能正常使用** 锁屏状态下,Android Studio向手机安装App的行为可能会被拦截,所以要保证手机处于解锁状态,才能顺利通过电脑安装App到手机上。 有的手机还要求插入SIM卡才能调试App,还有的手机要求登录会员才能调试App,总之如果遇到无法安装的问题,各种情况都尝试一遍才好。 经过以上步骤,总算具备通过电脑在手机上安装App的条件了。马上启动Android Studio,在顶部中央的执行区域看到已连接的手机信息,如图2-3所示。此时的设备信息提示这是一台华为手机,单击手机名称右边的三角运行按钮,接下来就是等待Android Studio往手机上安装App了。 > ![](media/image46.jpeg) 图2-3 找到已连接的真机设备 ### 2.1.2 App的开发语言 基于安卓系统的App开发主要有两大技术路线,分别是原生开发和混合开发。原生开发指的是在移动平台上利用官方提供的编程语言(例如Java、Kotlin等)、开发工具包(SDK)、开发环境(Android Studio)进行App开发;混合开发指的是结合原生与H5技术开发混合应用,也就是将部分App页面改成内嵌的网页,这样无须升级App、只要覆盖服务器上的网页,即可动态更新App页面。 不管是原生开发还是混合开发,都要求掌握Android Studio的开发技能,因为混合开发本质上依赖于原 生开发,如果没有原生开发的皮,哪里还有混合开发的毛呢?单就原生开发而言,又涉及多种编程语言,包括Java、Kotlin、C/C++、XML等,详细说明如下。 #### 1.Java Java是Android开发的主要编程语言,在创建新项目时,弹出如图2-4所示的项目配置对话框,看见 Language栏默认选择了Java,表示该项目采用Java编码。 > ![](media/image47.jpeg) 图2-4 创建新项目时候的项目配置页面(Java) 虽然Android开发需要Java环境,但没要求电脑上必须事先安装JDK,因为Android Studio已经自带了 JRE。依次选择菜单File→Project Structure,弹出如图2-5所示的项目结构对话框。 ![](media/image48.jpeg) 图2-5 项目结构的配置窗口 单击项目结构对话框左侧的SDK Location,对话框右边从上到下依次排列着“Android SDK location”、 “Android NDK location”、“JDK location”,其中下方的JDK location提示位于Android Studio安装路径的 JRE目录下,它正是Android Studio自带的Java运行环境。 可是Android Studio自带的JRE看不出来基于Java哪个版本,它支不支持 新的Java版本呢?其实 Android Studio自带的JRE默认采用Java 7编译,如果在代码里直接书写Java 8语句就会报错,比如Java 8 引入了Lambda表达式,下面代码通过Lambda表达式给整型数组排序: 倘若由Android Studio编译上面代码,结果提示出错“Lambda expressions are not supported at language level '7'”,意思是Java 7不支持Lambda表达式,错误信息如图2-6所示。 ![](media/image49.jpeg) 图2-6 不支持Lambda表达式的出错提示 原来Android Studio果真默认支持Java 7而非Java 8,但Java 8增添了诸多新特性,其拥趸与日俱增,有的用户习惯了Java 8,能否想办法让Android Studio也支持Java 8呢?当然可以,只要略施小计便可,依次选择菜单File→Project Structure,在弹出的项目结构对话框左侧单击Modules,此时对话框如图2-7 所示。 ![](media/image50.jpeg) 图2-7 模块的属性设置对话框 对话框右侧的Properties选项卡,从上到下依次排列着“Compile Sdk Version”、“Build Tool Version”、 “NDK Version”、“Source Compatibility”、“Target Compatibility”,这5项分别代表:编译的SDK版本、 构建工具的版本、编译C/C++代码的NDK版本、源代码兼容性、目标兼容性,其中后面两项用来设置 Java代码的兼容版本。单击“Source Compatibility”右边的下拉箭头按钮,弹出如图2-8所示的下拉列表。 ![](media/image51.jpeg) 图2-8 源码兼容性的Java版本选择列表 从下拉列表中看到,Android Studio自带的JRE支持Java 6、Java 7、Java 8三种版本。单击选中列表项的 “1.8(Java 8)”,并在“Target Compatibility”栏也选择“1.8(Java 8)”,然后单击窗口下方的OK按钮,就能将编译模块的Java版本改成Java 8了。 #### 2.Kotlin Kotlin是谷歌官方力推的又一种编程语言,它与Java同样基于JVM(Java Virtual Machine,即Java虚拟机),且完全兼容Java语言。创建新项目时,在Language栏下拉可选择Kotlin,此时项目结构对话框如图2-9所示。 一旦在创建新项目时选定Kotlin,该项目就会自动加载Kotlin插件,并将Kotlin作为默认的编程语言。不过本书讲述的App开发采用Java编程,未涉及Kotlin编程。 ![](media/image52.jpeg) 图2-9 创建新项目时的项目配置对话框(Kotlin) #### 3.C/C++ 不管是Java还是Kotlin,它们都属于解释型语言,这类语言在运行之时才将程序翻译成机器语言,故而执行效率偏低。虽然现在手机配置越来越高,大多数场景的App运行都很流畅,但是涉及图像与音视频处理等复杂运算的场合,解释型语言的性能瓶颈便暴露出来。 编译型语言在首次编译时就将代码编译为机器语言,后续运行无须重新编译,直接使用之前的编译文件即可,因此执行效率比解释型语言高。C/C++正是编译型语言的代表,它能够有效弥补解释型语言的性 能缺憾,借助于JNI技术(Java Native Interface,即Java原生接口),Java代码允许调用C/C++编写的程序。事实上,Android的SDK开发包内部定义了许多JNI接口,包括图像读写在内的底层代码均由 C/C++编写,再由外部通过封装好的Java方法调用。 不过Android系统的JNI编程属于高级开发内容,初学者无须关注JNI开发,也不要求掌握C/C++。 #### 4.XML XML全称为Extensible Markup Language,即可扩展标记语言,严格地说,XML并非编程语言,只是一种标记语言。它类似于HTML,利用各种标签表达页面元素,以及各元素之间的层级关系及其排列组合。每个XML标签都是独立的控件对象,标签内部的属性以“android:”打头,表示这是标准的安卓属性,各属性分别代表控件的某种规格。比如下面是以XML书写的文本控件: 上面的标签名称为TextView,翻译过来叫文本视图,该标签携带4个属性,说明如下: id:控件的编号。 > layout_width:控件的布局宽度,wrap_content表示刚好包住该控件的内容。 layout_height:控件的布局高度,wrap_content表示刚好包住该控件的内容。 > > text:控件的文本,也就是文本视图要显示什么文字。 综合起来,以上XML代码所表达的意思为:这是一个名为tv_hello的文本视图,显示的文字内容是“Hello World!”,它的宽度和高度都要刚好包住这些文字。 以上就是Android开发常见的几种编程语言,本书选择了Java路线而非Kotlin路线,并且定位安卓初学者教程,因此读者需要具备Java和XML基础。 ### 2.1.3 App连接的数据库 在学习Java编程的时候,基本会学到数据库操作,通过JDBC连接数据库进行记录的增删改查,这个数据库可能是MySQL,也可能是Oracle,还可能是SQL Server。然而手机应用不能直接操作上述几种数据库,因为数据库软件也得像应用软件那样安装到操作系统上,比如MySQL提供了Windows系统的安装包,也提供了Linux系统的安装包,可是它没有提供Android系统的安装包呢,所以MySQL没法在 Android系统上安装,手机里面的App也就不能直连MySQL。 既然MySQL、Oracle这些企业数据库无法在手机安装,那么App怎样管理业务方面的数据记录呢?其实 Android早已内置了专门的数据库名为SQLite,它遵循关系数据库的设计理念,SQL语法类似于 MySQL。不同之处在于,SQLite无须单独安装,因为它内嵌到应用进程当中,所以App无须配置连接信息,即可直接对其增删改查。由于SQLite嵌入到应用程序,省去了配置数据库服务器的开销,因此它又被归类为嵌入式数据库。 可是SQLite的数据库文件保存在手机上,开发者拿不到用户的手机,又该如何获取App存储的业务数据?比如用户的注册信息、用户的购物记录,等等。如果像Java Web那样,业务数据统一保存在后端的数据库服务器,开发者只要登录数据库服务器,就能方便地查询导出需要的记录信息。 手机端的App,连同程序代码及其内置的嵌入式数据库,其实是个又独立又完整的程序实体,它只负责手机上的用户交互与信息处理,该实体被称作客户端。而后端的Java Web服务,包括Web代码和数据库服务器,同样构成另一个单独运行的程序实体,它只负责后台的业务逻辑与数据库操作,该实体被称作服务端。客户端与服务端之前通过HTTP接口通信,每当客户端觉得需要把信息发给服务端,或者需要从服务端获取信息时,客户端便向服务端发起HTTP请求,服务端收到客户端的请求之后,根据规则完成数据处理,并将处理结果返回给客户端。这样客户端经由HTTP接口并借服务端之手,方能间接读写后端的数据库服务器(如MySQL),具体的信息交互过程如图2-10所示。 > ![](media/image53.jpeg) 图2-10 客户端与服务端分别操作的数据库由此看来,一个具备用户管理功能的App系统,实际上并不单单只是手机上的一个应用,还包括与其对应的Java Web服务。手机里的客户端App,面向的是手机用户,App与用户之间通过手机屏幕交互;而后端的服务程序,面向的是手机App,客户端与服务端之间通过HTTP接口交互。客户端和服务端这种多对一的架构关系如图2-11所示。 ![](media/image54.jpeg) 图2-11 客户端与服务端的多对一架构关系图 总结一下,手机App能够直接操作内置的SQLite数据库,但不能直接操作MySQL这种企业数据库。必须事先搭建好服务端程序(如Java Web),然后客户端与服务端通过HTTP接口通信,再由服务端操作以 MySQL为代表的数据库服务器。 ## 2.2 App的工程结构 本节介绍App工程的基本结构及其常用配置,首先描述项目和模块的区别,以及工程内部各目录与配置 文件的用途说明;其次阐述两种级别的编译配置文件build.gradle,以及它们内部的配置信息说明;再次讲述运行配置文件AndroidManifest.xml的节点信息及其属性说明。 ### 2.2.1 App工程目录结构 App工程分为两个层次,第一个层次是项目,依次选择菜单File→New→New Project即可创建新项目。 另一个层次是模块,模块依附于项目,每个项目至少有一个模块,也能拥有多个模块,依次选择菜单 File→New→New Module即可在当前项目创建新模块。一般所言的“编译运行App”,指的是运行某个模块,而非运行某个项目,因为模块才对应实际的App。单击Android Studio左上角竖排的Project标签,可见App工程的项目结构如图2-12所示。 > ![](media/image55.jpeg) 图2-12 App工程的项目结构图 从图2-12中看到,该项目下面有两个分类:一个是app(代表app模块);另一个是Gradle Scripts。其中,app下面又有3个子目录,其功能说明如下: 1. manifests子目录,下面只有一个XML文件,即AndroidManifest.xml,它是App的运行配置文件。 2. java子目录,下面有3个com.example.myapp包,其中第一个包存放当前模块的Java源代码,后面两个包存放测试用的Java代码。 3. res子目录,存放当前模块的资源文件。res下面又有4个子目录: > drawable目录存放图形描述文件与图片文件。 > > layout目录存放App页面的布局文件。 > > mipmap目录存放App的启动图标。 > > values目录存放一些常量定义文件,例如字符串常量strings.xml、像素常量dimens.xml、颜色常量colors.xml、样式风格定义styles.xml等。 Gradle Scripts下面主要是工程的编译配置文件,主要有: 1. build.gradle,该文件分为项目级与模块级两种,用于描述App工程的编译规则。 2. proguard-rules.pro,该文件用于描述Java代码的混淆规则。 3. gradle.properties,该文件用于配置编译工程的命令行参数,一般无须改动。 4. settings.gradle,该文件配置了需要编译哪些模块。初始内容为include ':app',表示只编译app模块。 5. local.properties,项目的本地配置文件,它在工程编译时自动生成,用于描述开发者电脑的环境配置,包括SDK的本地路径、NDK的本地路径等。 ### 2.2.2 编译配置文件build.gradle 新创建的App项目默认有两个build.gradle,一个是Project项目级别的build.gradle;另一个是Module 模块级别的build.gradle。 项目级别的build.gradle指定了当前项目的总体编译规则,打开该文件在buildscript下面找到 repositories和dependencies两个节点,其中repositories节点用于设置Android Studio插件的网络仓 库地址,而dependencies节点用于设置gradle插件的版本号。由于官方的谷歌仓库位于国外,下载速度相对较慢,因此可在repositories节点添加阿里云的仓库地址,方便国内开发者下载相关插件。修改之后的buildscript节点内容如下所示: 模块级别的build.gradle对应于具体模块,每个模块都有自己的build.gradle,它指定了当前模块的详细编译规则。下面给chapter02模块的build.gradle补充文字注释,方便读者更好地理解每个参数的用途。 (完整代码见chapter02\build.gradle) 为啥这两种编译配置文件的扩展名都是Gradle呢?这是因为它们采用了Gradle工具完成编译构建操作。 Gradle工具的版本配置在gradle\wrapper\gradle-wrapper.properties,也可以依次选择菜单 File→Project Structure→Project,在弹出的设置页面中修改Gradle Version。注意每个版本的Android Studio都有对应的Gradle版本,只有二者的版本正确对应,App工程才能成功编译。比如Android [Studio 4.1对应的Gradle版本为6.5,更多的版本对应关系见*https://developer.android.*g*oo*g*le.cn/studi o/releases/*g*radle-plu*g*in#updatin*g*-plu*g*in*。](https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin) ### 2.2.3 运行配置文件AndroidManifest.xml AndroidManifest.xml指定了App的运行配置信息,它是一个XML描述文件,初始内容如下所示: (完整代码见chapter02\src\main\AndroidManifest.xml) 可见AndroidManifest.xml的根节点为manifest,它的package属性指定了该App的包名。manifest下面有个application节点,它的各属性说明如下: > android:allowBackup,是否允许应用备份。允许用户备份系统应用和第三方应用的apk安装包和应用数据,以便在刷机或者数据丢失后恢复应用,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复。为true表示允许,为false则表示不允许。 > > android:icon,指定App在手机屏幕上显示的图标。 android:label,指定App在手机屏幕上显示的名称。 > > android:roundIcon,指定App的圆角图标。 > > android:supportsRtl,是否支持阿拉伯语/波斯语这种从右往左的文字排列顺序。为true表示支持,为false则表示不支持。 > > android:theme,指定App的显示风格。 注意到application下面还有个activity节点,它是活动页面的注册声明,只有在AndroidManifest.xml中正确配置了activity节点,才能在运行时访问对应的活动页面。初始配置的MainActivity正是App的默认主页,之所以说该页面是App主页,是因为它的activity节点内部还配置了以下的过滤信息: 其中action节点设置的android.intent.action.MAIN表示该页面是App的入口页面,启动App时会 先打开该页面。而category节点设置的android.intent.category.LAUNCHER决定了是否在手机屏幕上显示 App图标,如果同时有两个activity节点内部都设置了android.intent.category.LAUNCHER,那么桌面就会显示两个App图标。以上的两种节点规则可能一开始不太好理解,读者只需记住默认主页必须同时配置这两种过滤规则即可。 ## 2.3 App的设计规范 本节介绍了App工程的源码设计规范,首先App将看得见的界面设计与看不见的代码逻辑区分开,然后利用XML标记描绘应用界面,同时使用Java代码书写程序逻辑,从而形成App前后端分离的设计规约,有利于提高App集成的灵活性。 ### 2.3.1 界面设计与代码逻辑 手机的功能越来越强大,某种意义上相当于微型电脑,比如打开一个电商App,仿佛是在电脑上浏览网站。网站分为用户看得到的网页,以及用户看不到的Web后台;App也分为用户看得到的界面,以及用户看不到的App后台。虽然Android允许使用Java代码描绘界面,但不提倡这么做,推荐的做法是将界面设计从Java代码剥离出来,通过单独的XML文件定义界面布局,就像网站使用HTML文件定义网页那样。 直观地看,网站的前后端分离设计如图2-13所示,App的前后端分离设计如图2-14所示。 > ![](media/image56.jpeg) 图2-13 网站的前后端分离设计 > ![](media/image57.jpeg) 图2-14 App的前后端分离设计 把界面设计与代码逻辑分开,不仅参考了网站的Web前后端分离,还有下列几点好处。 1. 使用XML文件描述App界面,可以很方便地在Android Studio上预览界面效果。比如新创建的App 项目,默认首页布局为activity_main.xml,单击界面右上角的Design按钮,即可看到如图2-15所示的预览界面。 如果XML文件修改了Hello World的文字内容,立刻就能在预览区域观看 新界面。倘若使用Java代码描绘界面,那么必须运行App才能看到App界面,无疑费时许多。 2. 一个界面布局可以被多处代码复用,比如看图界面,既能通过商城购物代码浏览商品图片,也能通过商品评价代码浏览买家晒单。 3. 反过来,一段Java代码也可能适配多个界面布局,比如手机有竖屏与横屏两种模式,默认情况App 采用同一套布局,然而在竖屏时很紧凑的界面布局(见图2-16),切换到横屏往往变得松垮乃至变形 (见图2-17)。 ![](media/image58.jpeg) 图2-15 XML文件的预览界面 > ![](media/image59.jpeg) 图2-16 竖屏时候的界面布局 > ![](media/image60.jpeg) 图2-17 横屏时候的界面布局 鉴于竖屏与横屏遵照一样的业务逻辑,仅仅是屏幕方向不同,若要调整的话,只需分别给出竖屏时候的界面布局,以及横屏时候的界面布局。因为用户多数习惯竖屏浏览,所以res/layout目录下放置的XML 文件默认为竖屏规格,另外在res下面新建名为layout-land的目录,用来存放横屏规格的XML文件。 land是landscape的缩写,意思是横向,Android把layout-land作为横屏XML的专用布局目录。然后在 layout-land目录创建与原XML同名的XML文件,并重新编排界面控件的展示方位,调整后的横屏界面如图2-18所示,从而有效适配了屏幕的水平方向。 > ![](media/image61.jpeg) 图2-18 采用另一个XML文件的横屏布局 总的来说,界面设计与代码逻辑分离的好处多多,后续的例程都由XML布局与Java代码两部分组成。 ### 2.3.2 利用XML标记描绘应用界面 在前面“2.1.2 App的开发语言”末尾,给出了安卓控件的XML定义例子,如下所示: 注意到TextView标签以“\<”开头,以“/\>”结尾,为何尾巴多了个斜杆呢?要是没有斜杆,以左右尖括号包裹标签名称,岂不更好?其实这是XML的标记规范,凡是XML标签都由标签头与标签尾组成,标签头以左右尖括号包裹标签名称,形如“”;标签尾在左尖括号后面插入斜杆,以此同标签头区分开,形如“”。标签头允许在标签名称后面添加各种属性取值,而标签尾不允许添加任何属性,因此上述TextView标签的完整XML定义是下面这样的: 考虑到TextView仅仅是个文本视图,其标签头和标签尾之间不会插入其他标记,所以合并它的标签头和标签尾,也就是让TextView标签以“/\>”结尾,表示该标签到此为止。 然而不是所有情况都能采取简化写法,简写只适用于TextView控件这种末梢节点。好比一棵大树,大树先有树干,树干分岔出树枝,一些大树枝又分出小树枝,树枝再长出末端的树叶。一个界面也是先有根节点(相当于树干),根节点下面挂着若干布局节点(相当于树枝),布局节点下面再挂着控件节点 (相当于树叶)。因为树叶已经是末梢了,不会再包含其他节点,所以末梢节点允许采用“/\>”这种简写方式。 譬如下面是个XML文件的布局内容,里面包含了根节点、布局节点,以及控件节点: (完整代码见chapter02\src\main\res\layout\activity_main.xml) 上面的XML内容, 外层的LinearLayout标签为该界面的根节点,中间的LinearLayout标签为布局节点, 内层的TextView为控件节点。由于根节点和布局节点都存在下级节点,因此它们要有配对的标签头与标签尾,才能将下级节点包裹起来。根节点其实是特殊的布局节点,它的标签名称可以跟布局节点一样,区别之处在于下列两点: 1. 每个界面只有一个根节点,却可能有多个布局节点,也可能没有中间的布局节点,此时所有控件节点都挂在根节点下面。 2. 根节点必须配备“xmlns:android="[*http://schemas.android.com/apk/res/android*"](http://schemas.android.com/apk/res/android)”,表示指定 XML内部的命名空间,有了这个命名空间,Android Studio会自动检查各节点的属性名称是否合法,如果不合法就提示报错。至于布局节点就不能再指定命名空间了。 有了根节点、布局节点、控件节点之后,XML内容即可表达丰富多彩的界面布局,因为每个界面都能划分为若干豆腐块,每个豆腐块再细分为若干控件罢了。三种节点之外,尚有“”这类注释标记,它的作用是包裹注释性质的说明文字,方便其他开发者理解此处的XML含义。 ### 2.3.3 使用Java代码书写程序逻辑 在XML文件中定义界面布局,已经明确是可行的了,然而这只是静态界面,倘若要求在App运行时修改文字内容,该当如何是好?倘若是动态变更网页内容,还能在HTML文件中嵌入JavaScript代码,由js片段操作Web控件。但Android的XML文件仅仅是布局标记,不能再嵌入其他语言的代码了,也就是说,只靠XML文件自身无法动态刷新某个控件。 XML固然表达不了复杂的业务逻辑,这副重担就得交给App后台的Java代码了。Android Studio每次创 建新项目,除了生成默认的首页布局activity_main.xml之外,还会生成与其对应的代码文件 MainActivity.java。赶紧打开MainActivity.java,看看里面有什么内容,该Java文件中MainActivity类的内容如下所示: 可见MainActivity.java的代码内容很简单,只有一个MainActivity类,该类下面只有一个onCreate方 法。注意onCreate内部的setContentView方法直接引用了布局文件的名字activity_main,该方法的意思是往当前活动界面填充activity_main.xml的布局内容。现在准备在这里改动,把文字内容改成中文。 首先打开activity_main.xml,在TextView节点下方补充一行android:id="@+id/tv_hello",表示给它起个名字编号;然后回到MainActivity.java,在setContentView方法下面补充几行代码,具体如下: (完整代码见chapter02\src\main\java\com\example\chapter02\MainActivity.java) 新增的两行代码主要做了这些事情:先调用findViewById方法,从布局文件中取出名为tv_hello的 TextView控件;再调用控件对象的setText方法,为其设置新的文字内容。 代码补充完毕,重新运行测试App,发现应用界面变成了如图2-19所示的样子。 > ![](media/image62.jpeg) 图2-19 修改控件文本后的界面效果可见使用Java代码成功修改了界面控件的文字内容。 ## 2.4 App的活动页面 本节介绍了App活动页面的基本操作,首先手把手地分三步创建新的App页面,接着通过活动创建菜单快速生成页面源码,然后说明了如何在代码中跳到新的活动页面。 ### 2.4.1 创建新的App页面 每次创建新的项目,都会生成默认的activity_main.xml和MainActivity.java,它们正是App首页对应的 XML文件和Java代码。若要增加新的页面,就得由开发者自行操作了,完整的页面创建过程包括3个步骤:创建XML文件、创建Java代码、注册页面配置,分别介绍如下: **1.创建XML文件** 在Android Studio左上方找到项目结构图,右击res目录下面的layout,弹出如图2-20所示的右键菜单。 ![](media/image63.jpeg) 图2-20 通过右键菜单创建XML文件在右键菜单中依次选择New→XML→Layout XML File,弹出如图2-21所示的XML创建对话框。 > ![](media/image64.jpeg) 图2-21 XML文件的创建窗口 在XML创建对话框的Layout File Name输入框中填写XML文件名,例如activity_main2,然后单击窗口右下角的Finish按钮。之后便会在layout目录下面看到新创建的XML文件activity_main2.xml,双击它即可打开该XML的编辑窗口,再往其中填写详细的布局内容。 **2.创建Java代码** 同样在Android Studio左上方找到项目结构图,右击java目录下面的包名,弹出如图2-22所示的右键菜单。 ![](media/image65.jpeg) 图2-22 通过右键菜单创建Java代码在右键菜单中依次选择New→Java Class,弹出如图2-23所示的代码创建窗口。 > ![](media/image66.jpeg) 图2-23 Java代码的创建窗口 在代码创建窗口的Name输入框中填写Java类名,例如Main2Activity,然后单击窗口下方的OK按钮。之后便会在Java包下面看到新创建的代码文件Main2Activity,双击它即可打开代码编辑窗口,再往其中填写如下代码,表示加载来自activity_main2的页面布局。 (完整代码见chapter02\src\main\java\com\example\chapter02\Main2Activity.java) **3.注册页面配置**创建好了页面的XML文件及其Java代码,还得在项目中注册该页面,打开AndroidManifest.xml,在 application节点内部补充如下一行配置: 添加了上面这行配置,表示给该页面注册身份,否则App运行时打开页面会提示错误“activity not found”。如果activity的标记头与标记尾中间没有其他内容,则节点配置也可省略为下面这样: 完成以上3个步骤后,才算创建了一个合法的新页面。 #### 2.4.2 快速生成页面源码 上一小节经过创建XML文件、创建Java代码、注册页面配置3个步骤,就算创建好了一个新页面,没想到区区一个页面也这么费事,怎样才能提高开发效率呢?其实Android Studio早已集成了快速创建页面的功能,只要一个对话框就能完成所有操作。 仍旧在项目结构图中,右击java目录下面的包名,弹出如图2-24所示的右键菜单。 ![](media/image67.jpeg) 图2-24 通过右键菜单创建活动页面 右键菜单中依次选择New→Activity→Empty Activity,弹出如图2-25所示的页面创建对话框。 ![](media/image68.jpeg) 图2-25 活动页面的创建窗口 在页面创建对话框的Activity Name输入框中填写页面的Java类名(例如Main2Activity),此时下方的 Layout Name输入框会自动填写对应的XML文件名(例如activity_main2),单击对话框右下角的Finish 按钮,完成新页面的创建动作。 回到Android Studio左上方的项目结构图,发现res的layout目录下多了个activity_main2.xml,同时 java目录下多了个Main2Activity,并且Main2Activity代码已经设定了加载activity_main2布局。接着打开AndroidManifest.xml,找到application节点发现多了下面这行配置: 检查结果说明,只要填写一个创建页面对话框,即可实现页面创建的3个步骤。 #### 2.4.3 跳到另一个页面 一旦创建好新页面,就得在合适的时候跳到该页面,假设出发页面为A,到达页面为B,那么跳转动作是从A跳到B。由于启动App会自动打开默认主页MainActivity,因此跳跃的起点理所当然在MainActivity,跳跃的终点则为目标页面的Activity。这种跳转动作翻译为Android代码,格式形如“startActivity(new Intent(源页面.this, 目标页面.class));”。如果目标页面名为Main2Activity,跳转代码便是下面这样的: > // 活动页面跳转,从MainActivity跳到Main2Activity > > startActivity(new Intent(MainActivity.this, Main2Activity.class)); 因为跳转动作通常发生在当前页面,也就是从当前页面跳到其他页面,所以不产生歧义的话,可以使用 this指代当前页面。简化后的跳转代码如下所示: 接下来做个实验,准备让App启动后在首页停留3秒,3秒之后跳到新页面Main2Activity。此处的延迟处理功能,用到了Handler工具的postDelayed方法,该方法的第一个参数为待处理的Runnable任务对象,第二个参数为延迟间隔(单位为毫秒)。为此在MainActivity.java中补充以下的跳转处理代码: (完整代码见chapter02\src\main\java\com\example\chapter02\MainActivity.java) 运行测试App,刚打开的App界面如图2-26所示,过了3秒发生跳转事件的App界面如图2-27所示,可见成功跳到了新页面。 > ![](media/image69.jpeg) 图2-26 跳转之前的App界面 > ![](media/image70.jpeg) 图2-27 跳转之后的App界面 当然,以上的跳转代码有些复杂,比如:Intent究竟是什么东西?为何在onResume方法中执行跳转动 作?Handler工具的处理机制是怎样的?带着这些疑问,后续章节将会逐渐展开,一层一层拨开Android 开发的迷雾。 ### 2.5 小结 本章主要介绍了App开发必须事先掌握的基础知识,包括App的开发特点(App的运行环境、App的开发语言、App访问的数据库)、App的工程结构(App工程的目录结构、编译配置文件build.gradle、运行配置文件AndroidManifest.xml)、App的设计规范(界面设计与代码逻辑、利用XML标记描绘应用界面、使用Java代码书写程序逻辑)、App的活动页面(创建新的App页面、快速生成页面源码、跳转到另一个页面)。 通过本章的学习,读者应该了解App开发的基本概念,并且熟悉App工程的组织形式,同时掌握使用 Android Studio完成一些简单操作。 ### 2.6 课后练习题 1. **填空题** 1.除了开启开发者选项之外,还需打开手机上的 \_ 开关,然后才能在手机上调试App。 2.App开发的两大技术路线包括 \_和混合开发。 3.App工程的编译配置文件名为 \_。 4.Android Studio使用 \_ 工具完成App工程的构建操作。 5.在Java代码中调用 \_ 方法能够跳到新的App页面。 2. **判断题(正确打√,错误打×)** 1.Android Studio默认支持到Java 8。(  ) 2.Kotlin语言也能用于App开发。(  ) 3.App属于服务端程序。(  ) 4.一个App项目可以包含多个App模块。(  ) 5.App工程的图片资源放在layout目录下。(  )**三、选择题** 1.通过(  )可以连接手机和电脑。 A.HDM接口 B.光驱 C.USB接口 D.音频接口 2.如果手机无法安装调试App,可能是哪个原因造成的(  )。 A.处于锁屏状态 B.未插SIM卡 C.未登录会员 D.选择了充电模式 3.App可以直接连接的数据库是(  )。 A.MySQL B.Oracle C.SQLite D.SQL Server 4.App界面布局采用的文件格式是(  )。 A.CSS B.FXML C.HTML D.XML 5.下面的(  )属性表示TextView标签的控件编号。 A.id B.layout_width C.layout_height D.text 4. **简答题** 请简要描述App开发过程中分离界面设计与代码逻辑的好处。 5. **动手练习** 请上机实验修改App工程的XML文件和Java代码,并使用真机调试App,主要步骤说明如下: 1. 创建一个新的App项目。 2. 修改项目级别的build.gradle,添加阿里云的仓库地址。 3. 创建一个名为Main2Activity的新页面(含XML文件与Java代码)。 4. 在该页面的XML文件中添加一个TextView标签,文本内容为“你好,世界!”。 5. 在MainActivity的Java代码中添加页面跳转代码,从当前页跳到Main2Activity。 6. 把App安装到手机上并运行,观察能否看到“你好,世界!”字样。