👋第一章:Android开发技能入门指南
Android操作系统(OS)是最受欢迎的移动设备平台之一,在全球拥有众多用户。该操作系统用于汽车和智能手表、电视、手机等可穿戴设备,这使得Android开发者的市场非常广阔。
因此,新开发人员需要学习如何利用新的现代Android开发(MAD)技能构建Android应用程序。
自2008年发布以来,Android已经走过了漫长的道路,并在第一个集成开发环境(IDES)、Eclipse和NetBeans中使用。
今天,Android Studio是Android开发的推荐IDE,与以前Java是首选语言不同的是,Kotlin现在是首选语言。
Android Studio包括对Kotlin、Java、c++和其他编程语言的支持,使得这个IDE适合不同技能的开发人员。
因此,在本章结束时,按照指南,你将安装Android Studio,使用Jetpack Compose构建你的第一个Android应用程序,并学习一些Kotlin语法,利用Android开发的首选语言。
此外,本介绍将为您了解对MAD至关重要的高级材料做好基础准备。
在本章中,我们将介绍以下内容:
- 使用变量和习惯用法在Kotlin中编写第一个程序
- 使用Android Studio创建一个Hello, Android Community应用程序
- 在Android Studio中设置模拟器
- 在Jetpack Compose中创建一个按钮
- 使用gradlew命令在Android Studio中清理和运行您的项目
- 了解Android项目结构
- 在Android Studio中调试和登录
⚽️1. 技术要求
成功运行Android IDE和模拟器可能会让您的计算机望而生畏。
你可能听过一个笑话,说运行Android Studio的机器在冬天可以用作加热器。
好吧,这是有一定道理的,所以你的计算机应该有以下规格,以确保你的系统可以应付IDE的要求:
- 64位微软Windows,macOS,或Linux安装与稳定的互联网连接。本专栏中的指南是在macOS中开发的。您也可以使用Windows或Linux笔记本电脑,因为两者都没有区别。
- 对于Windows和Linux用户,您可以按照以下链接安装Android Studio:https://developer.android.com/studio/install。
- 至少8GB或更多的RAM。
- Android Studio、Android软件开发工具包(SDK)和Android模拟器的可用磁盘空间至少为8GB。
- 最低屏幕分辨率为1280 × 800。
- 你可以在这里下载Android Studio:https://developer.android.com/studio.
⚽️2. 使用变量和习惯用法在Kotlin中编写第一个程序
Kotlin是Android开发的推荐语言;您仍然可以选择Java作为语言,因为许多遗留应用程序仍然严重依赖Java。
然而,在本专栏中,我们将使用Kotlin,如果这是你第一次使用Kotlin语言构建Android应用程序,Kotlin组织有很好的资源来帮助你开始免费练习和自定进度的评估,称为Kotlin Koans (https://play.kotlinlang.org/koans/overview).
此外,您可以使用Kotlin语言进行多平台开发,使用Kotlin multiat form Mobile (KMM),在其中您可以在iOS和Android应用程序之间共享标准代码,并仅在必要时编写特定于平台的代码。
KMM目前处于Alpha阶段。
⚾️2.1 准备
在这个指南中,您可以使用在线Kotlin playground (https://play.kotlinlang.org/)来运行代码,也可以在Android Studio IDE中运行代码。
或者,如果你打算用Koans做更多的Kotlin练习题,你可以下载并使用IntelliJ IDEA IDE。
⚾️2.2 如何实现
在这个指南中,我们将探索和修改一个简单的程序,我们将在Kotlin中编写;你可以把程序想象成我们给计算机或移动设备的指令,让它们执行我们给它们的动作。
例如,我们将在程序中创建一个问候语,然后编写另一个程序。
对于这个指南,你可以选择Android Studio或免费的在线IDE,因为我们将接触到一些Kotlin功能:
- 如果您第一次选择使用Kotlin在线游乐场,您将看到类似以下截图的内容,其中包含一个println语句,表示Hello, world,但对于我们的示例,我们将将该问问语更改为Hello, Android Community,并运行代码。
fun main() { println("Hello, Android Community") } // Hello, Android Community
- 让我们看另一个例子;面试中常用的一个算法问题–反转字符串。例如,您有一个字符串Community,我们希望反转该字符串,以便输出为ytinummoC。有几种方法可以解决这个问题,但是我们将使用Kotlin惯用的方法来解决它。
- 在IDE的playground或Kotlin playground中输入以下代码:
fun main() { val stringToBeReversed = "Community" println(reverseString(stringToBeReversed)) } fun reverseString(stringToReverse: String): String { return stringToReverse.reversed() } // ytinummoC
⚾️2.3 如何工作
有必要在Kotlin中提到,通过利用默认参数值并只设置需要更改的参数,有一些独特的方法可以保持代码更干净、更精确和更简单。
fun在Kotlin编程语言中代表函数,而Kotlin中的函数是执行特定任务的程序的一部分。
第一个示例中的函数名称是main(),而在main()函数中,我们没有任何输入。
一般来说,函数都有名称,以便在代码库比较复杂时能够区分它们。
此外,在Java中,函数类似于方法。
函数名有两个括号和大括号,还有println,它告诉系统打印一行文本。
如果您使用过Java,您可能会注意到Kotlin编程语言与Java非常相似。
然而,开发人员现在谈论Kotlin语言对开发人员来说有多棒,因为它提供了更具表现力的语法和复杂的类型系统,并处理了Java多年来一直存在的空指针问题。
为了充分利用Kotlin语言的强大功能并编写更简洁的代码,了解Kotlin习惯用法可能是有益的。
Kotlin习语是经常使用的集合,有助于操作数据,使Android开发人员的体验更加轻松。
在第二个示例中,我们有两个函数main()和reverseString()。
main()不接受任何输入,但reverseString()接受String输入。
您还会注意到我们使用了val,这是Kotlin使用的一个唯一的词,它指的是一个只能设置为一个值的不可变值,而var是一个可变变量,这意味着它可以被替换。
我们创建一个val stringToBeReversed,它是一个字符串,并将其命名为“Community”,然后在main()函数中调用println,并在reverseString()函数中传递我们想要打印的文本。
此外,在本例中,reverseString函数从string对象中接受一个string参数,然后返回一个字符串类型。
还有更多的东西要学习,并且公平地承认,我们在这个指南中所涵盖的只是您可以使用Kotlin习语的一小部分。
这个指南的目的是介绍一些概念,我们可能会在后面的章节中接触或使用,但不是深入的,因为我们将在后面的章节中探索更多的Kotlin。
因此,了解Kotlin习语是什么以及为什么它们现在很重要是很有必要的。
⚾️2.4 参考
更好地理解Kotlin语法和流行的用例对您的日常工作至关重要,因此请查看以下资源:
- JetBrains Academy有一个很棒的免费Kotlin基础课程: https://hyperskill.org/tracks/18.
- Kotlin文档也是一个很好的手边资源: https://kotlinlang.org/docs/home.html.
⚽️3. 使用Android Studio创建一个Hello, Android Community应用程序
现在我们已经安装了Android Studio,我们将创建第一个Android应用程序。
此外,我们将使用Compose–只是提前提一下,在这个指南中,我们不会深入讨论Compose,因为我们有专门的章节来讨论Compose,即第二章,使用声明式UI创建屏幕和探索Compose原理。
⚾️3.1 准备
在开始之前,了解你的Android项目的一致性是很有帮助的。
默认情况下,AndroidStudio会在你的主目录下创建一个包,包名为AndroidStudioProjects;在这里,您将找到您创建的所有项目。
如果要更改文件夹,还可以决定文件夹的位置。
此外,确保你使用的是最新版本的Android Studio,以利用所有伟大的功能。
要了解最新的Android版本,您可以使用以下链接: https://developer.android.com/studio/releases 。
⚾️3.2 如何实现
在Android Studio IDE中,项目模板是一个Android应用程序,它拥有创建应用程序所需的所有必要部分,并帮助您开始和设置。
因此,一步一步地,我们将制作我们的第一个Android应用程序并在模拟器上启动它:
- 启动Android Studio通过点击Android Studio图标在您的dock或任何地方存储Android Studio。
- 你会看到一个欢迎Android Studio窗口打开,你可以点击New Project。或者,您可以转到File并单击New Project。
- 选择Empty Compose Activity并单击Next。
- 加载空的Compose活动屏幕后,您将看到包含Name、Package Name、Save Location、Language和Minimum SDK的字段。
在本章中,您可以将项目命名为Android Community,其他设置保持不变。
您还会注意到,默认情况下该语言是Kotlin。
至于最小SDK,我们的目标是API 21: Android 5.0 (Lollipop),这表明你的应用程序可以运行的最小Android版本,在我们的情况下,大约是98.8%的设备。
您还可以单击下拉菜单,了解有关最小SDK的更多信息。单击Finish并等待Gradle同步。
- 继续摆弄这些包,你会注意到一个MainActivity类扩展了一个ComponentActivity(),而ComponentActivity()又扩展了Activity();在内部,我们有一个有趣的onCreate,它是来自ComponentActivity的重写。
您还将看到setContent{},这是一个用于设置可组合函数内容的函数。
setContent{}函数接受一个lambda表达式,该表达式包含应该显示的UI元素,在本例中,它包含应用程序的主题。
在Greeting()函数中,我们将改变所提供的并添加我们自己的问候语,即“Hello, Android Community”并运行,我们将创建我们的第一个问候语:
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AndroidCommunityTheme { // A surface container using the 'background' color from the theme Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { Greeting("Android") } } } } }
- 让我们继续修改Greeting()函数,并将name参数赋值给文本:
@Composable fun Greeting(name: String, modifier: Modifier = Modifier) { Text( text = "Hello $name!", modifier = modifier ) }
此外,你也可以将“Hello, Android Community”传递到默认实现中,这将产生相同的UI。
- 就像在XML视图中一样,您可以轻松地查看正在构建的UI,而无需使用@Preview(showBackground = true)在模拟器中运行应用程序,所以让我们继续并将其添加到我们的代码中,如果它不可用的话。
默认情况下,项目附带一个具有Preview()的模板:
@Preview(showBackground = true) @Composable fun GreetingPreview() { AndroidCommunityTheme { Greeting("Android") } }
- 最后,当您运行应用程序时,您应该看到下图所示的屏幕。
在下面的配方中,我们将看看如何一步一步地设置模拟器,所以不要担心。
⚾️3.3 如何工作
使用Jetpack Compose创建视图的主要好处是,它加快了开发时间,因为你使用相同的语言来编写整个代码库(Kotlin),并且更容易测试。
您还可以创建可重用的组件,并根据需要对其进行定制。
因此,要确保出错的几率更低,并且必须使用XML编写视图,因为这很繁琐。
onCreate()函数被认为是Android应用程序的入口点。
此外,我们还使用修饰函数来添加行为和修饰可组合对象。
我们将在下一章中更多地讨论修饰符和表面函数的作用。
⚽️4. 在Android Studio中设置模拟器
Android Studio是一个可靠且成熟的IDE。
因此,自2014年以来,Android Studio一直是开发Android应用程序的首选IDE。
当然,您仍然可以使用其他ide,但Android Studio的优势在于您不需要单独安装Android SDK。
⚾️4.1 准备
您需要完成前面的配方才能遵循此配方,因为我们将设置模拟器以运行我们刚刚创建的项目。
⚾️4.2 如何实现
本章旨在对初学者友好,并在您完成指南的过程中使您顺利地向更高级的Android学习。
让我们按照以下步骤来看看如何设置模拟器并在使用Android Studio recipe创建一个Hello, Android Community App中运行您的项目:
- 导航到工具|设备管理器。一旦设备管理器准备好了,你有两个选择:
虚拟或物理。虚拟意味着你将使用模拟器,而物理意味着你将启用Android手机来调试Android应用程序。
出于我们的目的,我们将选择Virtual。 - 单击Create device,将弹出Virtual device Configuration界面。
- 选择手机。你会注意到Android Studio还有其他类别,如电视、Wear OS、平板电脑和汽车。
让我们现在使用Phone,在未来的章节中,我们将尝试使用Wear OS。单击Next。
- 您将看到推荐系统映像的列表。
您可以选择任何选项或使用默认选项,在Android 12的情况下为S,尽管您可能希望使用最新的API 33,然后单击Next。
- 现在您将到达Android虚拟设备(AVD)屏幕,在这里您可以命名您的虚拟设备。
你可以输入一个名称,也可以保留默认值Pixel 2 API 31,然后点击Finish。
- 通过运行虚拟设备来测试它,并确保它按预期工作。你应该看到一些东西在模拟器上运行应用程序后,类似于下图。
⚾️4.3 如何工作
测试和确保应用程序显示预期的结果非常重要。
这就是为什么Android Studio使用模拟器来帮助开发人员确保他们的应用程序可以在标准设备上运行。
此外,Android手机还提供了可供开发者使用的开发者选项,这使得Android支持的不同设备数量变得更加容易,也有助于重现模拟器中难以发现的漏洞。
⚽️5. 在Jetpack Compose中创建一个按钮
我们必须注意,我们不能在一个指南中涵盖所有的观点;我们有一章专门介绍更多关于Jetpack Compose的知识,所以在我们创建的项目中,我们将尝试为我们的项目创建两个额外的视图。
⚾️5.1 准备
打开Android Community项目,因为这是我们将在此配方中构建的项目。
⚾️5.2 如何实现
让我们从在Compose中实现一个简单的按钮开始:
- 让我们继续组织代码,并通过添加Column()来组织视图,将文本对齐到中心。这应该添加到setContent{}函数中:
Column( modifier = Modifier .fillMaxSize() .wrapContentSize(Alignment.Center), horizontalAlignment = Alignment.CenterHorizontally ) { Greeting("Android") }
- 现在,创建一个函数并将其命名为SampleButton;在本例中我们将不传递任何信息。
然而,我们将有一个RowScope{},它定义了在本例中适用于我们的按钮的修饰符函数,并且我们将给我们的按钮一个名称:click me。 - 在Compose中,当您创建一个按钮时,您可以设置它的形状、图标和标高,检查它是否启用,检查它的内容,等等。
你可以通过命令单击button()组件来检查如何自定义按钮:
@Composable fun SampleButton() { Button( onClick = { /*Do nothing*/ }, modifier = Modifier .fillMaxWidth() .padding(24.dp), shape = RoundedCornerShape(20.dp), border = BorderStroke(2.dp, Color.Blue), colors = ButtonDefaults.buttonColors( contentColor = Color.Gray, containerColor = Color.White ) ) { Text( text = stringResource(id = R.string.click_me), fontSize = 14.sp, modifier = Modifier.padding(horizontal = 30.dp, vertical = 6.dp) ) } }
在我们的SampleButton中,onClick不做任何事情;我们的按钮有一个最大填充宽度的修改器,填充为24个与密度无关的像素(dp),圆角半径为20 dp。
我们还设置了按钮的颜色,并添加了点击我作为文本。
我们将字体大小设置为14个与比例无关的像素(sp),因为这有助于确保文本能够很好地根据屏幕和用户的偏好进行调整。
- 此外,单击右上方的Split以预览屏幕元素,或者单击Design部分以查看不含代码的整个屏幕。
- 最后,让我们调用SampleButton函数,也就是Greeting函数所在的地方,然后运行应用程序:
Column( modifier = Modifier .fillMaxSize() .wrapContentSize(Alignment.Center), horizontalAlignment = Alignment.CenterHorizontally ) { Greeting("Android") SampleButton() }
- 编译并运行程序,您的应用程序应该如下图所示。
⚾️5.3 如何工作
一个可组合的应用包含几个可组合的函数,只是普通的带@Composable注解的函数。
正如Google文档所解释的那样,注释告诉Compose向过程添加特殊支持,以便随着时间的推移更新和维护UI。
Compose还允许您将代码结构成可维护的小块,以便随时调整和重用。
⚾️5.4 参考
由于很难在一个指南中涵盖所有视图,我们将在第2章中讨论更多视图,探索最佳实践,并测试我们的可组合视图。
⚽️6. 使用gradlew命令在Android Studio中清理和运行您的项目
gradlew命令是一个健壮的Gradle包装器,有很好的用途。然而,在Android Studio中,您不需要安装它,因为它是一个打包在项目中的脚本。
⚾️6.1 准备
但是现在,我们不会研究所有的Gradle命令,而是使用最流行的命令来清理、构建、提供信息、调试和扫描我们的项目,以便在运行应用程序时发现任何问题。
你可以在笔记本电脑的终端上运行这些命令,只要你在正确的目录下,或者使用Android Studio提供的终端。
⚾️6.2 如何实现
按照以下步骤检查并确认Gradle是否按预期工作:
- 你可以通过运行./gradlew来检查版本。
- 要构建和清理项目,可以运行/gradlew clean和/gradlew build命令。
如果您的项目有任何错误,构建将失败,您可以调查错误。
此外,在Android中,你总是可以不使用Gradle命令运行你的项目,只使用IDE运行和清理选项。 - 下面是一些更有用的gradlew命令;例如,当你的构建失败时,你想知道是什么出了问题,使用命令来调查或点击错误消息(参见下图):
- 使用–stacktrace选项运行以获取堆栈跟踪信息
- 使用–info或–debug选项运行可以获得更多的日志输出
- 运行–scan以获得完整的见解
⚾️6.3 如何工作
Gradle是一个通用的构建工具,在Android开发中非常强大。
此外,您还可以创建和发布自定义插件来封装约定和构建功能。
Gradle的优点包括用于测试执行、编译和在构建系统中发生的任何其他任务的增量构建工作。
⚽️7. 了解Android项目结构
如果这是您第一次查看Android项目文件夹,您可能想知道在哪里添加代码以及这些包的含义。
本指南将介绍每个文件夹中包含的内容以及代码的位置。
⚾️7.1 准备
如果您打开您的项目,您将注意到许多文件夹。你的Android项目的主要文件夹列在这里:
- 清单文件夹
- java文件夹 (test/androidTest)
- 资源文件夹
- Gradle脚本
⚾️7.2 如何实现
让我们浏览每个文件夹,了解存储的内容、位置和原因:
- 在下图中,您可以看到Packages下拉框;点击它,就会弹出一个包含项目、包、项目文件等内容的窗口。
- 您可以选择使用Android徽标,通过project或下拉菜单旁边的project高亮部分查看您的项目。
当应用程序中有许多模块并希望添加特定代码时,Project视图是最佳选择。
请随意点击各个部分,看看它们都有什么。
- manifest文件夹是Android应用程序的真实来源;它包含AndroidManifest.xml。
点击文件内部,你会注意到你有一个意图启动器,在你的模拟器上启动Android应用程序。 - 此外,版本号通常是在Gradle中设置的,然后合并到manifest中,我们在manifest中添加所有需要的权限。
您还会注意到包的名称、元数据、数据提取规则、主题和图标;如果你有一个独特的图标,你可以在这里添加一个。
- java文件夹包含我们在构建Android应用程序时创建的所有Kotlin (.kt)和java (.java)文件。
例如,在下图中,我们有一个包含(androidTest)和(test)的包,这是我们添加测试的地方。
点击所有文件夹,看看里面都有什么。
- 在androidTest文件夹中,我们编写UI测试来测试UI功能,在test文件夹中,我们编写单元测试。
单元测试测试代码的一小部分,以确保所需的行为符合预期。
测试驱动开发(TDD)在应用程序开发过程中非常出色且有价值。
有些公司遵守这一规定,但有些公司不执行这一规定。
然而,这是一项很好的技能,因为始终测试代码是一种很好的实践。
res文件夹包含XML布局、UI字符串、可绘制图像和Mipmap图标。
另一方面,values文件夹包含许多有用的XML文件,如尺寸、颜色和主题。
继续,点击res文件夹来熟悉那里有什么,因为我们将在下一章中使用它。
- 最后,在Gradle Scripts中,您将看到定义我们可以在模块中应用的构建配置的文件。
例如,在构建中。gradle(Project: AndroidCommunity),你会看到一个顶层文件,你可以在其中添加所有子项目模块通用的配置选项。
⚾️7.3 如何工作
在Android Studio中,对于第一次使用的用户来说,不知道文件放在哪里以及什么是必需的可能会让他们不知所措。
因此,有一个循序渐进的指南,在哪里添加测试或代码,并了解Android项目结构是至关重要的。
此外,在复杂的项目中,您可能会发现不同的模块;因此,了解项目结构是有帮助的。
Android Studio中的模块是源文件和构建设置的集合,允许您将项目划分为具有特定目的的不同实体。
⚽️8. 在Android Studio中调试和登录
调试和日志记录在Android开发中是至关重要的,您可以编写出现在Logcat中的日志消息,以帮助您发现代码中的问题,或者在应该执行的时候验证一段代码。
我们将在这里介绍这个话题,但说我们将在一个指南中涵盖所有内容是不公平的
⚾️8.1 准备
让我们用一个例子来理解日志。以下日志方法按优先级从高到低排列。
当记录网络错误、成功调用和其他错误时,它们是正确的:
- Log.e(): 错误
- Log.w(): 警告
- Log.i(): 信息
- Log.d(): 调试向开发人员显示关键消息,这是最常用的日志
- Log.v(): 冗长的
一个好的做法是将每个日志与一个TAG关联起来,以便在Logcat中快速识别错误消息。
"TAG"指的是一个文本标签,可以分配给Android应用程序中的视图或其他UI元素。
在Android中使用标签的主要目的是提供一种将附加信息或元数据与UI元素相关联的方法。
⚾️8.2 如何实现
让我们继续在我们的小项目中添加一个日志消息:
- 我们将继续创建一个调试日志,然后运行应用程序:
Log.d(TAG, "asdf Testing call")
在Logcat部分的搜索框中,输入asdf,看看是否可以找到该消息。
您将注意到日志有一个类名、我们的TAG (MainActivity)和显示的日志消息;如下图中的右箭头所示。
- 左箭头显示了提到的日志类型,使用下拉菜单,您可以根据规范快速查看您的消息。
⚾️8.3 如何工作
调试是指在类中设置断点,降低模拟器的速度,并尝试在代码中找到问题。
例如,如果您在代码中遇到竞争条件,或者您的代码在某些设备上工作而在其他设备上不起作用,则调试功能非常强大。
此外,为了利用调试,您需要首先将调试器附加到模拟器,然后在Debug模式下运行。
另一方面,日志记录可以帮助您记录在遇到问题时可能对您有帮助的信息。
有时,调试可能很有挑战性,但是在代码中需要的地方放置日志可能非常有帮助。
一个实际的例子是当你从API加载数据时;当出现网络错误时,您可能希望将其记录下来,以便通知您如果网络调用失败会发生什么。
因此,使用断点进行调试可能有助于在评估值时减慢过程,并且由于我们在本章中没有构建很多内容,我们可以在后面的章节中以不同的方法重新讨论这个主题。
⚾️8.4 参考
Timber是一个日志记录器,带有一个小的、可扩展的API,它在Android的标准Log类之上提供实用程序,许多开发人员使用它进行日志记录。
有关Timber的更多信息,请参见:https://github.com/JakeWharton/timber.