# 2021Android从零入门到实战 **Repository Path**: Yenn-2017_admin/start-android ## Basic Information - **Project Name**: 2021Android从零入门到实战 - **Description**: 2021Android从零入门到实战(Kotlin版) https://www.imooc.com/learn/1307 - **Primary Language**: Kotlin - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-08 - **Last Updated**: 2025-02-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 2021Android从零入门到实战 #### 介绍 2021Android从零入门到实战(Kotlin版) https://www.imooc.com/learn/1307 课件地址:http://8.136.122.222/book/primary/kotlin/kotlin-data-collection.html 简介:课程从零完整的讲解了google力推且备受千万开发者喜爱的的Kotlin语言。并以此为基础,以通俗易懂,难易循序渐进的方式、小白的视角讲解了AndroidUI、Android网络编程、Android四大组件等必知必会的技能,每章标配一节案例实战,融会贯通本章所学。 ## 第1章 课程介绍与学习指南--初入门庭 介绍本课程整体内容大纲、课程学习目标、学习收获。接着会带领同学们从零手把手搭建开发环境,并构建出第一个APP。 ### 1-1 Android从零入门到实战--导学 (08:48 89) ### 1-2 构建第一个Android App (15:05 45) #### 安装 https://developer.android.google.cn/about?hl=zh-cn ## 第2章 开发语言Kotlin--略有小成 从零完整的讲解了Google力推且备受千万开发者喜爱的的kotlin语言。万丈高楼平地起、Kotlin开发语言是Android开发基础中的基础。 ### 2-1 kotlin必知必会 (09:44 46) - 为什么要优先使用 Kotlin 进行 Android 开发? - Google宣布 Kotlin-First意味着什么? - 有哪些人都在使用kotlin? - Kotin十问 - Kotlin必知必会的7大模块--本章课程体系介绍 #### Kotlin 是什么? Kotlin 是一门用于现代多平台应用的静态编程语言,其中被广泛用于 Android 平台的开发,被称之为Android 世界的 Swift。它由大名鼎鼎的 JetBrains 公司设计开发并开源,著名的 IDE 工具 IntelliJ IDEA 就是他们的产品,所以无疑他们是对编程语言设计领域最为熟悉的专家。 Kotlin从 2016年发布 1.0的 release 版本开始至今,使用的开发者数量快速增长, 此外 Kotlin 已经拥有强大的生态和社区开发者的支持: - Kotlin 是著名的 IDE 厂商 JetBrains 公司开发的编程语言; - 在 Google I/O 2017中,Google 宣布在 Android 上为 Kotlin 提供最佳支持; - Kotlin 在 Spring5.0 后端开发框架中的支持;。 - Kotin DSL1.0 将在 Gradle5.0 得以应用,Kotlin 成为继 Groovy 语言开发 Gradle 另一门编程语言;。Kotlin 成为 - 2018 年 Github 中增长速度最快的语言; - 2018年10月,Google和JetBrains在KotlinConf18上公开宣布了Kotlin基金会; - 2019年5月,谷歌宣布 Kotlin作为 Android的首选语言。; - 2019年7月,Kotlin在O'Reilly 开源软件大会(OSCON)2019上赢得了享有声望的年度突破项目奖; #### 为什么要优先使用 Kotlin 进行 Android 开发? 在 2019 年 Google I/O 大会上,google宣布今后将优先采用 Kotlin 进行 Android 开发。 Kotin 是一种新型的静态类型编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。 下面介绍了开发者喜欢用 Kotlin 编写代码的原因: - **富有表现力且简洁**:可以使用更少的代码实现更多的功能。少编写样板代码。在使用Kotlin 的专业开发者中,有 67% 的人反映其工作效率有所提高。 - **更安全的代码**:Kotlin 有许多语言功能,可帮助避免 nu 指针异常等常见编程错误。包含 Kotlin 代码的Android 应用发生崩溃的可能性降低了 20%。 - **可互操作**:可以在 Kotlin 代码中调用 Java 代码,或者在 Java 代码中调用 Kotin 代码。Kotlin 可完全与 Java 编程语言互操作,因此可以根据需要在项目中添加任意数量的 Kotlin 代码。 - **结构化并发**:Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。 #### Kotlin 优先意味着什么? 在构建新的 Android 开发工具和内容(例如 Jetpack 库、示例、文档和培训内容)时,google会在设计层面考虑到 Kotlin 用户 #### 如何将 Kotlin 代码添加到我的现有项目中? 在 Project 窗口中选择相应模块,然后依次选择 File>New,选择任意 Android 模板,然后将 Kotlin 选作Source language. #### 如何将 Java 语言代码转换成 Kotlin 代码? 打开 Java 文件,然后依次选择 Code>Convert Java File to Kotlin File。也可以新建一个 Kotlin 文件(File>New>Kotlin File/Class),然后将Java 代码粘贴到该文件中。界面上出现提示时,点击 Yes 即可将 Java 代码转换成 Kotlin 代码。 使用 Kotlin 会影响性能吗? 使用 Kotin 不会对性能产生直接影响,但就像使用 Java 语言一样,应该仔细考虑如何使用这种语言。例如,在新的集合实例间重复复制会影响 GC 性能,调用允许非 null类型的方法会导致调用 null 值检查方法(当然,可以在编译器中使用-Xno-paramassentions 停用运行时null 值检查)。 #### Kotlin必会必知 - Kotlin的基本语法和代码规范 - Kotlin的面向对象; - Kotlin的函数式编程; - 扩展函数; - 空指针类型安全; - 类型系统; - 泛型和型变; - 注解和反射; - Kotlin 在 Android中的实际应用开发, ![image-20250110102927739](E:\A_workspace\start-android\images\image-20250110102927739.png) ### 2-2 Kotlin基本数据类型 (12:27 47) 参考官网:[基本类型:数字、字符串、数组 - Kotlin 语言中文站](https://legacy.kotlincn.net/docs/reference/basic-types.html) 从这篇文章开始,我们将深入学习 Kotin 常见的几大基本数据类型,比如整数类型、浮点数类型、字符类型、布尔类型等。因为这些是我们入手一门新的语言时的第一步,也是基础中的基础。 > Tips > 为了让大家快速掌握本节课的内容,我会将Kotlin和Java类比着进行讲解,这也是作为一个老开发快速学习其它语言的一个屡试不爽的经验所在。 就像习武一样,习武的人往往会借助已有的内功,可以很快速的掌握一门新的武功,那么对于从事Android的小伙伴们来说,这么多年对Java的使用就是我们的内功所以在这里我会带着大家借助已有的内功来快速上手Kotlin。 目录 - 基本数值类型 - 浮点类型 - 字符类型 - 字符串类型 - 类型强制转换 - 数字运算 ![image-20250110103643777](E:\A_workspace\start-android\images\image-20250110103643777.png) 在 Kotlin 中,所有东西都是对象,在这个意义上讲我们可以在任何变量上调用成员函数与属性。 一些类型可以有特殊的内部表示——例如,数字、字符以及布尔值可以在运行时表示为原生类型值,但是对于用户来说,它们看起来就像普通的类。 在本节中,我们会描述 Kotlin 中使用的基本类型:数字、字符、布尔值、数组与字符串。 ## 数字 Kotlin 提供了一组表示数字的内置类型。 对于整数,有四种不同大小的类型,因此值的范围也不同。 | 类型 | 大小(比特数) | 最小值 | 最大值 | | :---- | :------------- | :--------------------------------- | :----------------------------------- | | Byte | 8 | -128 | 127 | | Short | 16 | -32768 | 32767 | | Int | 32 | -2,147,483,648 (-2^31) | 2,147,483,647 (2^31 - 1) | | Long | 64 | -9,223,372,036,854,775,808 (-2^63) | 9,223,372,036,854,775,807 (2^63 - 1) | 所有以未超出 `Int` 最大值的整型值初始化的变量都会推断为 `Int` 类型。如果初始值超过了其最大值,那么推断为 `Long` 类型。 如需显式指定 `Long` 型值,请在该值后追加 `L` 后缀。 ``` val one = 1 // Int val threeBillion = 3000000000 // Long val oneLong = 1L // Long val oneByte: Byte = 1 ``` 对于浮点数,Kotlin 提供了 `Float` 与 `Double` 类型。 根据 [IEEE 754 标准](https://zh.wikipedia.org/wiki/IEEE_754), 两种浮点类型的*十进制位数*(即可以存储多少位十进制数)不同。 `Float` 反映了 IEEE 754 *单精度*,而 `Double` 提供了*双精度*。 | 类型 | 大小(比特数) | 有效数字比特数 | 指数比特数 | 十进制位数 | | :----- | :------------- | :------------- | :--------- | :--------- | | Float | 32 | 24 | 8 | 6-7 | | Double | 64 | 53 | 11 | 15-16 | 对于以小数初始化的变量,编译器会推断为 `Double` 类型。 如需将一个值显式指定为 `Float` 类型,请添加 `f` 或 `F` 后缀。 如果这样的值包含多于 6~7 位十进制数,那么会将其舍入。 ``` val pi = 3.14 // Double val e = 2.7182818284 // Double val eFloat = 2.7182818284f // Float,实际值为 2.7182817 ``` 请注意,与一些其他语言不同,Kotlin 中的数字没有隐式拓宽转换。 例如,具有 `Double` 参数的函数只能对 `Double` 值调用,而不能对 `Float`、 `Int` 或者其他数字值调用。 ``` fun main() { fun printDouble(d: Double) { print(d) } val i = 1 val d = 1.1 val f = 1.1f printDouble(d) // printDouble(i) // 错误:类型不匹配 // printDouble(f) // 错误:类型不匹配 } ``` Target platform: JVMRunning on kotlin v. 2.1.0 如需将数值转换为不同的类型,请使用[显示转换](https://legacy.kotlincn.net/docs/reference/basic-types.html#显式转换)。 ### 字面常量 数值常量字面值有以下几种: - 十进制: ``` 123 ``` - Long 类型用大写 `L` 标记: `123L` - 十六进制: `0x0F` - 二进制: `0b00001011` 注意: 不支持八进制 Kotlin 同样支持浮点数的常规表示方法: - 默认 double:`123.5`、`123.5e10` - Float 用 `f` 或者 `F` 标记: `123.5f` ### 数字字面值中的下划线(自 1.1 起) 你可以使用下划线使数字常量更易读: ```kotlin val oneMillion = 1_000_000 val creditCardNumber = 1234_5678_9012_3456L val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010 ``` ### 表示方式 在 Java 平台数字是物理存储为 JVM 的原生类型,除非我们需要一个可空的引用(如 `Int?`)或泛型。 后者情况下会把数字装箱。 注意数字装箱不一定保留同一性: ```kotlin val a: Int = 100 val boxedA: Int? = a val anotherBoxedA: Int? = a val b: Int = 10000 val boxedB: Int? = b val anotherBoxedB: Int? = b println(boxedA === anotherBoxedA) // true println(boxedB === anotherBoxedB) // false ``` Target platform: JVMRunning on kotlin v. 2.1.0 另一方面,它保留了相等性: ```kotlin val a: Int = 10000 println(a == a) // 输出“true” val boxedA: Int? = a val anotherBoxedA: Int? = a println(boxedA == anotherBoxedA) // 输出“true” ``` Target platform: JVMRunning on kotlin v. 2.1.0 ### 显式转换 由于不同的表示方式,较小类型并不是较大类型的子类型。 如果它们是的话,就会出现下述问题: ```kotlin // 假想的代码,实际上并不能编译: val a: Int? = 1 // 一个装箱的 Int (java.lang.Integer) val b: Long? = a // 隐式转换产生一个装箱的 Long (java.lang.Long) print(b == a) // 惊!这将输出“false”鉴于 Long 的 equals() 会检测另一个是否也为 Long ``` 所以相等性会在所有地方悄无声息地失去,更别说同一性了。 因此较小的类型**不能**隐式转换为较大的类型。 这意味着在不进行显式转换的情况下我们不能把 `Byte` 型值赋给一个 `Int` 变量。 ```kotlin val b: Byte = 1 // OK, 字面值是静态检测的 val i: Int = b // 错误 ``` Target platform: JVMRunning on kotlin v. 2.1.0 我们可以显式转换来拓宽数字 ```kotlin val i: Int = b.toInt() // OK:显式拓宽 print(i) ``` Target platform: JVMRunning on kotlin v. 2.1.0 每个数字类型支持如下的转换: - `toByte(): Byte` - `toShort(): Short` - `toInt(): Int` - `toLong(): Long` - `toFloat(): Float` - `toDouble(): Double` - `toChar(): Char` 缺乏隐式类型转换很少会引起注意,因为类型会从上下文推断出来,而算术运算会有重载做适当转换,例如: ```kotlin val l = 1L + 3 // Long + Int => Long ``` ### 2-3 kotlin数据运算(一) (11:38 48) ### 2-4 kotlin数据运算(二) (08:23 50) ### 2-5 kotlin数据容器--数组(一) (11:19 51) ### 2-6 kotlin数据容器--数组(二) (08:40 52) ### 2-7 kotlin数据容器--集合(一) (10:16 53) ### 2-8 kotlin数据容器--集合(二) (11:03 54) ### 2-9 kotlin数据容器--集合(三) (09:54 55) ### 2-10 kotlin 方法(一) (11:45 56) ### 2-11 kotlin 方法(二) (11:54 57) ### 2-12 kotlin Lambda表达式 (13:35 58) ### 2-13 kotlin条件控制 (12:38 59) ### 2-14 Kotlin循环控制 (19:16 60) ### 2-15 深入Kotlin泛型(一) (12:08 61) ### 2-16 深入Kotlin泛型(二) (15:09 62) ### 2-17 Kotlin扩展函数(一) (14:13 63) ### 2-18 Kotlin扩展函数(二) (13:19 64) ### 2-19 Kotlin综合运用案例:四则运算计算器 (11:55 90) ## 第3章 Android UI控件--融会贯通 本章主要是学习Android开发中必须要掌握的几种UI控件、并依次为基础,带领同学们搭建慕课APP的学习页面 ### 3-1 Android UI 必知必会 (03:43 82) ### 3-2 LinearLayout线性布局(一) (16:12 83) ### 3-3 LinearLayout线性布局(二) (11:05 84) ### 3-4 RelativeLayout相对布局(一) (10:30 85) ### 3-5 RelativeLayout相对布局(二) (10:32 86) ### 3-6 FrameLayout帧布局 (05:30 87) ### 3-7 MaterialButton控件(一) (16:09 88) ### 3-8 MaterialButton控件(二) (15:38 73) ### 3-9 TextView文本控件 (09:11 74) ### 3-10 ImageView控件(一) (13:12 76) ### 3-11 ImageView控件(二) (09:04 77) ### 3-12 RecyclerView高级UI控件 (10:48 78) ### 3-13 列表布局(一) (14:09 79) ### 3-14 列表布局(二) (09:05 80) ### 3-15 网格布局&瀑布流布局 (06:09 81) ### 3-16 慕课App学习Tab页面结构搭建(一) (14:18 20) ### 3-17 慕课App学习Tab页面结构搭建(二) (12:26 21) ### 3-18 慕课App学习Tab效果展示 (13:06 22) ## 第4章 Android 网络编程--登堂入室 本章主要是学习如何发起网络请求、我们会学习并时下最为开发者喜爱OKHTTP和Retrofit两种网络请求框架,并以此为基础实战慕课App 学习页面数据请求与绑定。 ### 4-1 Android网络编程 (07:23 91) ### 4-2 高性能网络请求框架OKHTTP介绍 (09:08 92) ### 4-3 高性能网络请求框架OKHTTP GET请求 (20:28 93) ### 4-4 高性能网络请求框架OKHTTP 多种POST请求 (24:04 94) ### 4-5 高性能网络请求框架OKHTTP 拦截器实战 (14:31 95) ### 4-6 Gson数据解析 (23:57 96) ### 4-7 RESTFUL网络请求框架Retrofit(一) (14:14 97) ### 4-8 RESTFUL网络请求框架Retrofit(二) (14:17 98) ### 4-9 实战:慕课App 学习Tab页数据请求与绑定(一) (11:03 99) ### 4-10 实战:慕课App 学习Tab页数据请求与绑定(二) (14:19 00) ## 第5章 Android 四大组件--出类拔萃 本章主要介绍ANDROID 四大组件的功能作用、使用场景。四大组件是Android的灵魂、核心,所以每小节会配以案例实践。 ### 5-1 Android四大组件介绍 (02:25 01) ### 5-2 Activity生命周期【必知必会】 (21:55 02) ### 5-3 Activity启动方式与数据传递 (22:00 03) ### 5-4 Fragment生命周期图解 (10:53 04) ### 5-5 Fragment 动态添加 (11:39 05) ### 5-6 Fragment 参数传递与解析 (07:08 08) ### 5-7 实践:自定义实现多Tab底部导航栏页面就结构(一) (12:44 07) ### 5-8 实践:自定义实现多Tab底部导航栏页面就结构(二) (08:52 09) ### 5-9 startService启动服务 (16:49 10) ### 5-10 bindService绑定服务(一) (13:10 11) ### 5-11 bindService绑定服务(二) (10:28 12) ### 5-12 BroadcastReceiver广播接收者(一) (14:50 13) ### 5-13 BroadcastReceiver广播接收者(二) (13:15 14) ### 5-14 运行时权限申请人 (12:44 15) ### 5-15 查询联系人 (08:58 16) ### 5-16 新增联系人 (11:34 17) ### 5-17 更新联系人 (06:26 18) ### 5-18 删除联系人 (05:30 19)