6 B4 v, T) c0 \# o: K+ W1 T: N% O K( z8 f《Android进阶指北》是一本Android进阶图书,结合《Android进阶之光》和《Android进阶解密》两本书介绍的知识,一同建立起Android应用开发进阶知识体系。全书共分13章,主要从3个方面来组织内容:(1)Android应用开发所需要掌握的系统源码知识,包括系统源码的下载、编译、调试,包管理机制,输入系统,Native Binder,Java Binder;(2)应用开发必需的知识点,包括Groovy基础、Gradle核心思想、Gradle的Android插件、Android Jetpack架构组件;(3)与跨平台开发相关的知识点,包括跨平台技术演进、Dart基础、Flutter基础。 ; s* q9 P6 t" o2 l. _
本书适合有一定基础的Android应用开发工程师和对Android系统源码感兴趣的读者阅读。
4 F1 t( i" g% j4 ~ G& j6 h目录 7 _0 u# i9 R S
5 T! [6 i+ }. b, X; N/ J( C/ c
- 第1章 系统源码的下载、编译、调试 5
t" C, X& f3 V6 J - 1.1 使用VirtualBox安装Ubuntu 5
: W$ h* N1 P$ W0 u, T - 1.1.1 安装Ubuntu的步骤 62 N x" O2 P" T) L8 C0 R: T, U
- 1.1.2 安装增强工具 123 ^; v& b, m$ E5 |! c
- 1.2 AOSP源码下载 14, G& ^# B* g ~3 b
- 1.2.1 AOSP简介 14- j6 I4 V+ J U5 ^5 P
- 1.2.2 下载repo 15
# N& m# p8 [: J! z( ?( |' w" z - 1.2.3 下载源码 15
/ x3 }2 z3 [5 z! J- D0 C, R - 1.3 内核源码下载 16. z! l0 D0 L) m. O) s+ E# |; }/ R
- 1.4 系统源码的整编和单编 18
, {% A& z, H/ L+ F5 N: I6 S& V m7 p - 1.4.1 编译系统概述 18
v; T7 K9 H: n7 Z- G9 d - 1.4.2 编译源码的方式 20- O' @8 X: h" D+ z
- 1.4.3 准备编译环境 202 A; ]. @4 I* a4 q0 F1 J( }
- 1.4.4 源码整编 21
8 @" `( j6 ?9 U - 1.4.5 源码单编 240 y2 f9 s; T! d: j" ^! \+ c
- 1.5 Source Insight导入系统源码 25
* q' ~4 |8 B; G; k( P - 1.5.1 新建源码项目 25
% M# V2 @6 k3 B5 B" M& _3 m - 1.5.2 定位文件 272 B/ D; E6 Y$ C5 M
- 1.5.3 全局搜索 28
5 V6 Z8 h2 v0 y" W9 U6 A - 1.6 Android Studio导入系统源码 29( m3 S1 S& a5 r
- 1.7 Android Studio调试系统源码 33
& M) Y1 @4 `; X! _% t0 [& x - 1.7.1 AOSP源码项目调试 343 D. F3 J- N* {& f( @
- 1.7.2 导入部分源码调试 38
, x5 H% s. E; W f6 s' ~2 H; p$ L - 1.7.3 新建Android项目调试 39
( i1 ^% F+ i+ {' n' R - 1.8 本章小结 40
( J @# V* |' z) A- f0 ` - 第2章 理解包管理机制和PMS 41 d) k4 R, M- I: Z t, ^5 `' z
- 2.1 PackageInstaller的初始化 411 o: o( N$ T' @7 W( Y0 k0 T
- 2.1.1 PackageManager简介 42. g5 z7 z; |4 R+ y/ g- a) K
- 2.1.2 APK的文件结构和安装方式 422 J$ L9 Z+ X( q" |! K1 i
- 2.1.3 寻找PackageInstaller入口 43
# u% K( R% }7 [1 ?# h0 Q - 2.1.4 PackageInstallerActivity解析 47
3 K3 q* [# w9 C, h - 2.1.5 PackageInstaller初始化的过程 512 ~! H1 i/ Y% B; U/ I. w4 e5 g( d
- 2.2 PackageInstaller安装APK过程 524 c$ d# b4 v- u3 [7 R, O
- 2.2.1 PackageInstaller中的处理 52) z8 m; O2 y: k" v9 T( }5 [
- 2.2.2 Java框架层的处理 57
* c- P( R" k) p! [ - 2.2.3 PackageInstaller安装APK的过程 59, r( ?( F$ T" a/ ?) F' r
- 2.3 PMS处理APK的安装过程 59/ c/ ?/ ~6 ]) p
- 2.3.1 PackageHandler处理安装消息 60. u8 ]# i; U2 @- p5 r/ F' R
- 2.3.2 复制APK的处理 66; v$ T0 S0 f/ E
- 2.3.3 PMS处理APK安装 70# ^8 j/ c+ N0 R
- 2.3.4 PMS处理APK安装的步骤 76& s7 @) [ Y! `, t! S2 e
- 2.4 PMS的创建过程 778 ^7 `0 k/ o4 K
- 2.4.1 SystemServer处理部分 77
( {& r/ c- U2 e/ {& j" e# a3 t4 ~ - 2.4.2 PMS构造方法 80% t, ~+ z4 i& J) h( c Y0 ^
- 2.5 APK解析过程 91. R' L0 ] O: x* i3 D, ?$ P+ M
- 2.5.1 引入PackageParser 91( i; p. W% y& v+ f. z
- 2.5.2 PackageParser解析APK 92
8 k2 @3 `1 H/ K' O3 m! v - 2.5.3 Package的数据结构 99# N- Y' {1 z1 j, t, a
- 2.6 本章小结 100
' l3 k: x+ {* ~& X8 z. V8 ^ - 第3章 理解输入系统和IMS 102
2 y3 W8 R& y3 a0 L4 K - 3.1 输入事件传递流程的组成部分 103
7 w, d1 {1 _" s6 H+ r1 o J - 3.2 IMS的诞生 1058 C% C% q+ u1 Y9 I7 U
- 3.2.1 SystemServer处理部分 1056 X$ ~- l. R0 r/ X0 k" }
- 3.2.2 InputManagerService构造方法 107
; t8 O; H3 ^7 e) b- k - 3.3 IMS的启动过程 110
* a0 H# C7 Z' S7 a% f5 ` - 3.4 InputDispatcher的启动过程 112
* Q/ P* b; C' _8 n - 3.5 InputReader处理事件的过程 113$ I! j- c- g$ i5 {
- 3.6 输入事件的处理总结 119
! o5 }7 H, D$ b/ Z+ j( X' G! x - 3.7 InputReader的加工类型 120
. W% a0 ~* Z$ f% U1 O- W8 x: ` - 3.8 InputDispatcher的分发过程 123) H: {) f" d/ J n: M% I( [
- 3.8.1 唤醒InputDispatcherThread 123" D' f5 n w) y" [/ q
- 3.8.2 InputDispatcher进行分发 124, T& k, ]1 P- g/ W1 d
- 3.9 事件分发到目标窗口的过程 128
r8 v, C4 w+ ^ - 3.9.1 为事件寻找合适的分发目标 128
- `; O z& `) M0 w9 R$ m - 3.9.2 处理点击形式的事件 132* x) G2 O( R) u% y$ D
- 3.9.3 向目标窗口发送事件 135
- j1 b7 }* E: C1 n - 3.9.4 Motion事件分发过程总结 136$ k- k. V) t, l$ W8 F
- 3.10 本章小结 138+ n' M% |! M- D3 G$ m
- 第4章 IPC机制 139, m& H: }4 q. K) _" W
- 4.1 Linux和Android的IPC机制 139
! }) e. H2 q; W( | - 4.1.1 Linux中的IPC机制 139
! |9 S) H% p1 R" S) N2 f - 4.1.2 Android中的IPC机制 141
! ?0 E) g. F5 Z2 b - 4.2 开启多进程 142
3 a$ E- d) e) f1 J* C# D/ ^ - 4.2.1 开启多进程举例 1422 W8 b( x$ J; u/ F
- 4.2.2 开启多进程引出的问题 1448 n0 L3 }4 A$ P) @* a- B
- 4.3 用Messenger进行进程间通信 146
8 g: V: p' u+ N( M - 4.4 使用AIDL实现跨进程方法调用 1504 R6 M3 t+ R" u0 q: E
- 4.4.1 创建AIDL文件 150
! C/ Y$ a( P3 s& V - 4.4.2 创建服务端 152
9 ]3 A3 J4 q! l7 R. Z b - 4.4.3 客户端调用 153
' Q" g0 q) i; Q; x; e - 4.5 用ContentProvider进行进程间通信 155; R0 f. K: f; F2 l( H, A+ l: u; f3 f
- 4.5.1 建立数据库,方便ContentProvider使用 155, x% K2 c u, [4 O
- 4.5.2 使用ContentProvider对数据库进行操作 1560 s' f* B+ l8 y* k+ \! l
- 4.5.3 在Activity中调用另一个进程的GameProvider方法 158: ^- g- k0 w' O4 k0 V) C
- 4.6 用Socket实现跨进程聊天程序 160
4 ^$ Y% H! g8 a: ^( F8 ?- n - 4.7 本章小结 1674 Z) a/ ]: v' Y% L* B% L8 z" W
- 第5章 Native Binder原理 168
2 y% O2 ^% L/ G3 L% j9 B - 5.1 学习Binder的前置知识点 168# A* d: g& n J4 c
- 5.1.1 Linux和Binder的IPC通信原理 1693 `! F% Y, A0 r7 t8 b1 c# S- {" \" M2 Q
- 5.1.2 使用Binder的原因 173
" z% y: q0 X0 T2 ? - 5.1.3 学习Binder的原因 174+ }- t3 F2 V- G& }% F6 l
- 5.2 ServiceManager中的Binder机制 175
1 P( a% J. E9 w& i6 l( m" p - 5.2.1 基于Binder通信的C/S架构 175
9 `6 G6 d- O. l0 o - 5.2.2 MediaServer的main函数 176
3 W W* T; ?& L1 K7 u$ _5 N0 j3 u - 5.2.3 每个进程唯一的ProcessState实例 177
6 }/ @+ O; X( m) c% l Y& F - 5.2.4 解析ServiceManager中的Binder机制 180# F( j5 ?( q- R4 i* s6 p
- 5.2.5 小结 187+ Z2 Z0 s7 P& T# X4 W" Y
- 5.3 系统服务的注册过程 187
. o) A0 j4 g/ A, Z - 5.3.1 从调用链角度说明MediaPlayerService的注册过程 1877 H) N4 C* v" ^* R2 A' @" E; T
- 5.3.2 从进程角度说明MediaPlayerService的注册过程 195
/ K9 a* O9 s+ @' t$ ~ - 5.3.3 小结 1966 `+ g6 z1 {5 Y& c; F& f! c
- 5.4 ServiceManager的启动过程 196
* D5 ^1 g- o7 B) n1 S - 5.4.1 打开binder设备 1980 ^7 P4 S) O. l1 ^6 q* f c
- 5.4.2 注册成为Binder机制的上下文管理者 201
5 v$ {$ ?$ v+ n0 r5 z8 T - 5.4.3 循环等待和处理客户端发来的请求 203# p. k: G7 c& v6 Z2 P
- 5.5 系统服务的获取过程 206% u$ c- V4 w/ `: z: [
- 5.5.1 客户端MediaPlayerService请求获取服务 206
* m; W" r2 r7 q2 Z& ^0 x - 5.5.2 服务端ServiceManager处理请求 212
3 {# V, M. s1 c/ x% x2 h8 S) f - 5.6 本章小结 218
; W# x/ A/ R1 J$ W - 第6章 Java Binder原理 219
2 T6 N3 f* b& ]& ? - 6.1 Java Binder的JNI注册 219
# x- X9 m. Q) z: r: {7 [( I: f - 6.1.1 Binder类的注册 223$ y$ Y, y- o8 e- T [
- 6.1.2 BinderInternal类的注册 224
/ x4 L9 s6 y0 J' G+ [$ d- ]6 N6 m8 D - 6.2 Java Binder中系统服务的注册过程 225
1 ]! |! O, u- e& Y - 6.2.1 将AMS注册到ServiceManager 226
0 O7 Z9 a) f# Q# m: D5 [ - 6.2.2 引出JavaBBinder 230
. F Z$ F% b# {: z - 6.2.3 解析JavaBBinder 232
0 N$ B- g4 X! S3 ~ - 6.2.4 Java Binder架构 234
/ }# A( e. S6 ^( i - 6.3 本章小结 235
, u: I5 ^; `5 P5 o7 t& q, X k - 第7章 Groovy基础 236
5 {1 J K) b7 }+ M d# [ - 7.1 Groovy概述 2361 O' \6 E. [8 ^* L- F: r# z
- 7.2 Groovy编写和调试 2370 K/ Q/ s( [( ~8 a0 _
- 7.3 变量 237/ Z/ {3 l2 W4 h6 C$ {
- 7.4 方法 237
0 Y* M: Z& i3 G) X0 \ - 7.5 类 2383 \$ [5 Q5 E5 i) M
- 7.6 语句 2392 P, m5 W" Z+ ]6 w' I- U5 N
- 7.6.1 断言 2398 _0 W. A7 O( q, F5 U- ~, d, _1 s
- 7.6.2 for循环 239
2 b5 U, p; `2 J5 I( R( ^ - 7.6.3 switch语句 240
5 d2 W1 s N& ? - 7.7 数据类型 241
7 N a+ i1 k' p - 7.7.1 字符串 241: E) x! d7 f$ O. _
- 7.7.2 List 242
$ t6 _- G. r; S5 i - 7.7.3 Map 242+ M1 g, f3 e0 N9 j! ]6 I _) h/ `
- 7.7.4 闭包(Closure) 243
6 K% R6 G3 v# F5 q' [, R2 G" k9 @ - 7.8 I/O操作 2445 N' G5 W+ z% _* |* p
- 7.8.1 文件读取 2441 g8 l4 E+ k" |9 N* r
- 7.8.2 文件写入 244
. l" _% U+ a6 k/ Y# D& S) r - 7.9 其他 245
: f) p8 h8 b; v& W, h, c - 7.9.1 asType 2452 n' X& ~& L5 G: [# M* R5 J) [
- 7.9.2 判断是否为真 245
( }7 ~7 C) r; m: p4 C0 d) Q - 7.9.3 安全取值 245
' t0 o7 s2 `7 D9 K! h' N - 7.9.4 with操作符 2460 }3 K4 e5 e1 U
- 7.10 本章小结 2469 [' U& B% f3 a% i0 y I
- 第8章 Gradle核心思想 2476 ~8 Y: k! A8 G' f" ~
- 8.1 Gradle概述 247
4 p2 C1 y& n5 q0 z7 _" H6 ] - 8.1.1 项目自动化 248
, z+ g- j" Z8 x - 8.1.2 构建工具 248- i* ]: ?* j: e& Q4 I7 X" ^
- 8.1.3 Gradle的特性 2538 g% v! G: t) f l1 k2 o; w
- 8.2 Gradle基础知识 255# W; M& z- d' @$ j; D0 y' M
- 8.2.1 配置Gradle环境 255
2 c% b$ _# f, E5 u" \- w - 8.2.2 实现Hello World 2573 F! Z& z0 X2 Q
- 8.2.3 Gradle的任务 258
) b( Q2 N# @$ }5 N# ^ - 8.2.4 Gradle日志级别 260
9 H$ H* k: j; Y0 {& x5 y) w - 8.2.5 Gradle 命令行 261$ J7 H r: M& R, ?# [
- 8.3 被忽视的Gradle Wrapper 2630 b4 k% }( S. z8 ?
- 8.3.1 为什么需要Gradle Wrapper 263
5 f2 o0 d, l- i% a" c6 S. T - 8.3.2 构建Gradle Wrapper 264
$ U+ Y. d1 v& u - 8.3.3 配置Gradle Wrapper 265. @1 U: Q% h: }
- 8.3.4 使用Gradle Wrapper 2669 r9 U4 L7 z% Z' }) Z3 G! z; o0 _
- 8.3.5 升级Gradle Wrapper 267
5 f8 w% L1 u Z- o5 d - 8.3.6 自定义Gradle Wrapper 268
: S, }) ]4 T. [ - 8.4 Gradle插件基础 268
/ i4 g1 x! h8 r2 } - 8.4.1 Gradle插件概述 268 Z1 q2 w9 h" B/ a; [1 s
- 8.4.2 应用Gradle插件 2702 G7 [- _$ r! f
- 8.4.3 插件DSL 272
/ o3 m- Z8 s: {% N& |% x) m - 8.4.4 自定义对象插件 273
2 W) ~6 L; ~) _: c - 8.4.5 Gradle插件的作用和优点 274' E& A, k' @! |8 i' p; a9 v
- 8.5 自定义Gradle插件 274
- `/ S5 a# N# ? - 8.5.1 在build.gradle中编写 275" S/ _6 ^8 c% o3 B( _
- 8.5.2 在buildSrc工程项目中编写 277. Z0 Y0 t4 {) }3 B
- 8.5.3 在独立项目中编写 278
/ v; U5 U2 d; T3 N" U2 m5 _$ | - 8.6 本章小结 281+ Y9 \: x1 o3 o' ?
- 第9章 Gradle的Android插件 282! L/ H q; P6 P& s+ z5 P
- 9.1 什么是Gradle的Android插件 282
/ ^& Q1 R7 P$ v& Y, P# ? - 9.2 Android Studio的模块类型和项目视图 283
: s4 m" x2 S( U0 ^( ? - 9.3 项目build.gradle 284( x# t; U' o4 l/ U' l/ I; ?
- 9.4 模块build.gradle 285
) a6 w3 l# ~+ u6 \8 l - 9.4.1 Gradle的Android插件类型 286% [* B; z0 s- p7 N" b
- 9.4.2 Android块 286, b+ x& F; ^( e$ [
- 9.4.3 dependencies块 291& j/ Q! J: U! s0 ~* o& n# r
- 9.5 Android签名文件配置 2921 |- L' X' q5 C6 ]4 {
- 9.5.1 自定义签名信息文件 292
( Y8 J3 U/ k& J7 C9 C0 c - 9.5.2 本地添加签名信息文件 293) J/ [3 {3 f' b( I4 E( Y4 A' _* N5 p
- 9.6 Gradle的库依赖 294
( h+ k) r/ e+ k1 C& @$ K* X - 9.7 Gradle的库依赖管理 295
( M, }0 k8 i& f" i3 i% G - 9.7.1 Gradle的依赖传递 296
1 I% G C$ }" y* i - 9.7.2 Gradle的依赖检查 296
( y2 U1 \7 u" G! D# ~3 X - 9.7.3 Gradle的依赖冲突 299
2 }" n" b7 r* u! s) ~7 J0 H - 9.8 本章小结 301% Q/ [, W1 n9 U1 h4 X7 D
- 第10章 Android Jetpack架构组件 3021 `: ^ o( o* N8 H+ M- f
- 10.1 Android Jetpack简介 3035 }/ Q1 D6 g! k2 _) o. ` o
- 10.2 Android Jetpack分类 3038 N, C* p$ {( L( K/ p5 M
- 10.2.1 Architecture 3046 E- o, Y( o: G& o! S( J
- 10.2.2 Foundationy 305& m5 J) M' b$ g4 M% g
- 10.2.3 Behavior 306
0 ]% h1 r B6 i6 y/ R' t9 E - 10.2.4 UI 307+ o/ ?) Y# R, y1 V+ @
- 10.3 在应用中引入Jetpack相关组件 307
$ Q( ~5 n0 c3 e - 10.4 使用Lifecycle 3071 l8 ]6 ?2 Y5 u4 g# p' c& D3 @
- 10.4.1 为什么需要Lifecycle 307
. B( Q, R% b- z- b3 y0 k - 10.4.2 如何使用Lifecycle 309/ Q8 a: I. K a5 |# A* ?# w
- 10.4.3 Lifecycle应用举例 312
6 I0 L7 k# k# i5 x8 N - 10.4.4 自定义LifecycleOwner 315
# A! Y9 Z! c& r! O! G5 c1 c - 10.5 Lifecycle的原理 316
+ h; l" w# O5 M V r - 10.5.1 Lifecycle的生命周期状态事件和状态 316) z6 r6 N6 k/ j" Q7 K R5 i; s- @
- 10.5.2 Lifecycle如何观察Activity和Fragment的生命周期 317
; `% y1 ?. x, A( v$ A4 h% L - 10.5.3 Lifecycle关联类 327
4 S6 _4 K8 A& ?0 t+ @ - 10.6 使用LiveData 328
8 \" a0 t9 I/ K) j2 a: M/ o3 W - 10.6.1 什么是LiveData 328
! Q0 q& A6 ~" ^ U4 ^- |/ Y" b/ x! X - 10.6.2 LiveData的基本用法 329
+ G7 U$ H4 [- I; J' r - 10.6.3 更改LiveData中的数据 330! |8 {9 C- {! O3 }6 \
- 10.6.4 合并多个LiveData数据源 332
" f$ i0 n k6 C2 u - 10.6.5 拓展LiveData对象 3333 C3 e7 ^; P9 N5 o6 j; q
- 10.7 LiveData的原理 335
$ H2 G. X) H. Q) q9 v, p - 10.7.1 LiveData如何观察组件生命周期变化 3358 N" V h) p6 W {/ H) x
- 10.7.2 LiveData的observe方法回调 336' C8 k j- `( x: a$ k& {
- 10.7.3 postValue/setValue方法分析 339" s0 r6 o) _% E* a2 H2 H o
- 10.7.4 Transformations.map方法分析 341& k% b9 c- O% p8 S; N
- 10.7.5 LiveData关联类 343
% z% @, [$ }, U' Y# }- x) R - 10.8 使用ViewModel 344
/ p: P# d+ l% O! p) t% G* w - 10.8.1 什么是ViewModel 345$ N+ f# J& h, S7 u
- 10.8.2 ViewModel的基本使用方法 345* H% p5 E! I7 x C7 C! M
- 10.8.3 ViewModel的生命周期 347. r- l3 P& w H5 Z7 j o; u( j
- 10.9 ViewModel的原理 348
! Z/ O) s1 t1 Y0 J8 u4 u/ o, x7 e0 w - 10.10 本章小结 351
0 k" c/ A$ G* j# B# H4 K - 第11章 跨平台技术演进 352! G& a; d. q0 T
- 11.1 Web App 353( N& b7 N4 \" V. n+ s0 X( W* C
- 11.2 Hybrid App 353, H5 w8 t; B9 G& A' h+ n
- 11.2.1 Cordova 354% _) n7 v$ A# x* @$ |* G
- 11.2.2 Ionic 355
2 ?4 N$ J. _& U8 t. L# e, k - 11.2.3 VasSonic 355
" ?. {4 x" ^* M6 Q) u. u - 11.2.4 微信小程序 3562 {. f1 J; @- @- o+ B/ r' T4 B
- 11.3 语言编译转换 357
' U! Q) L" \! D2 G$ M( m' `3 t, U - 11.4 原生渲染 3583 a: u* k. o$ g' C8 T" A
- 11.4.1 React Native 358
6 K7 M: L3 k. o( ` - 11.4.2 Weex 3581 C: T, ?1 I2 W/ I/ o3 a6 |
- 11.4.3 快应用 359# @- T$ Q/ g, x
- 11.5 自绘UI 360. }- t; Q+ L" Y, }5 h
- 11.5.1 Qt 360
/ [* x) ^0 ~+ O$ C4 X0 d: M1 ~ - 11.5.2 Flutter 3611 O# f7 G3 u! P
- 11.6 本章小结 362
1 ]7 b" E* o: U5 C+ I - 第12章 Dart基础 363* k2 L" m8 f. g! H! |
- 12.1 Dart开发环境搭建 363
* S- N& P: L2 P+ l8 J S4 h% ]+ ~ - 12.2 Dart概述 364; L! v6 t+ e7 c( Y3 f. V
- 12.3 Dart的特性和重要概念 365
% l7 ]2 [5 y, |/ R - 12.4 Dart关键字 366; V) B/ n; [0 H) b% }( N A1 A
- 12.5 变量 3670 _. {$ W# i2 t# K* [: ]" |) h
- 12.6 基本数据类型 3673 F3 N4 M1 n# i5 J6 i
- 12.6.1 Number 367; k- K4 j, [* E" t
- 12.6.2 String 368
+ @. j5 x2 X0 f) ~1 @1 Q5 S# ` - 12.6.3 Boolean 368
7 P+ O# t/ }4 A# i8 e y6 h - 12.6.4 List 368
) x$ }8 U/ H- N - 12.6.5 Set 369) J& u! R7 N1 b* K1 M# E' _
- 12.6.6 Map 369
! [- r5 A8 B, B1 r% r" h. n - 12.7 函数 369) M" W9 Y- `( H
- 12.7.1 可选参数 370
# t' s& y( k- H& M# G O - 12.7.2 默认参数值 370* N0 ^% W d5 C2 S' X
- 12.7.3 main函数 3717 `% q: t1 a( G
- 12.7.4 匿名函数 371
' S+ ?% t+ E" q+ s+ o6 w - 12.8 流程控制语句 371- W- Y# l! Y3 J l8 |& G
- 12.8.1 for循环 3720 V: \8 q, K4 R( T" g# q' N0 k( F
- 12.8.2 switch和case 372. \9 y& N' ?5 X& ]
- 12.9 捕获异常 373* t# f4 C7 z# d, I# L9 f
- 12.10 为类添加新的功能 373- L0 G0 Q+ q$ ~
- 12.11 库的使用方法 374
9 s% G( O7 R6 Z; }$ b+ |7 n - 12.12 异步支持 375
3 x: c+ O, ~9 e5 `& K: e; k - 12.13 使类可调用 376 U/ |5 A: [7 }6 X, O
- 12.14 创建实例 376
* r- }: _7 d% K, a5 D# s+ t - 12.15 本章小结 376) S# s r7 D3 G3 W5 Y/ }. }
- 第13章 Flutter基础 377* X/ `7 w' A- M
- 13.1 Flutter开发环境搭建和Hello World 377
2 I( g# ]( \2 @3 f - 13.1.1 Flutter概述 378
, h9 M( r; D$ k8 Z; | - 13.1.2 Flutter开发环境搭建 378
0 \' c1 z' S1 H# z - 13.1.3 运行一个Flutter Demo 383
' G2 q/ q9 {2 F4 }& L0 W7 r - 13.1.4 Hello World 385- b t# |: m2 H$ x4 [
- 13.2 Widget基础 386
/ q- G0 _5 t: V$ ]- t - 13.2.1 Widget概述 387
/ a: T# ]- i& S0 L - 13.2.2 Widget的分类 387
' O; u- b# w9 P8 n6 Y" x - 13.2.3 Widget的状态分类 388
8 x/ ?' V6 O( n# c: W5 A - 13.2.4 根Widget的种类 388$ F. p" a) l' A+ J+ N$ o/ n
- 13.3 Basic Widget 389
0 U# S, }* K+ G; A1 Y - 13.3.1 代码模板和主题 389
5 S" f( x {1 }& I+ Y8 c, w) ^ - 13.3.2 文本 390+ k2 F4 |1 A6 f0 m3 l2 m3 i( C
- 13.3.3 图片 3911 t$ G$ B. x5 F' P; p1 e' x$ J
- 13.3.4 凸起按钮 394/ R; c$ @! H2 _' `& E
- 13.3.5 其他Widget 3956 Q; E3 `6 j; k1 Z+ z; g
- 13.4 Material组件 3979 \, F5 W8 c( m5 g2 K8 Z
- 13.4.1 MaterialApp 398) f, e- h# H6 v% J
- 13.4.2 Scaffold 4010 @0 i, x$ p7 a! T8 x9 ~9 @
- 13.4.3 AppBar 4039 f, F+ q( L. [
- 13.4.4 BottomNavigationBar 405( L; j" Z+ L. V/ u% h# ~, O
- 13.4.5 TabBar 4077 k6 C& m* q. c- U# H
- 13.4.6 Drawer 411, @, f( ?, ~9 G1 j; Z
- 13.5 Scrolling Widget 413 m$ r; U2 ~" N1 w
- 13.5.1 ListView 413$ a9 W) @* \- a* U- ^4 \ \
- 13.5.2 GridView 418
' U' K! g6 }, I$ e9 v3 O - 13.5.3 PageView 419, L/ b0 ?( c/ h) I3 t
- 13.6 手势相关Widget 421- A8 R6 r) W/ v7 `
- 13.6.1 指针事件 421
4 b6 b" ]3 G+ M# h4 r - 13.6.2 手势 422
2 C6 i7 b- h6 ?9 v0 V. o. A - 13.6.3 使用GestureDetector 423
* V# I# r& R0 ]4 }& g - 13.6.4 使用Dismissible 4240 a6 H( J2 u/ f/ d
- 13.7 资源和图片 426/ R$ `. G3 ^! H/ D5 B' W7 C9 K
- 13.7.1 指定asset 426: z7 s, N# W4 L: I8 M
- 13.7.2 加载文本 427
" l6 j, q/ o7 t# v - 13.7.3 加载图片 430- U6 L$ s/ ?' }: N, U
- 13.8 布局Widget 433* Y8 w! x: N9 e6 [! c
- 13.8.1 线性布局Widget 4336 G1 M, p, Y" L$ d
- 13.8.2 流式布局Widget 434
! a, H) v- \- w. r' e - 13.8.3 层式布局Widget 4363 \2 `3 ^7 t' A7 N
- 13.8.4 弹性布局Widget 438
+ d6 j' _9 G. Z+ H% C+ d - 13.9 网络请求库Dio 440& }' o! B! @4 S G: J
- 13.9.1 Dio的使用入门 440
$ z5 b; [, y% V1 i# x* J" ~ - 13.9.2 Dio访问网络 441, S( q% j) a% \$ Q( T
- 13.10 JSON数据解析 443' n1 c: |2 Z( [
- 13.10.1 使用json.decode方法 443 g$ V; w) l5 x Y4 o, R
- 13.10.2 手动编写实体类 444
: t$ @* L- C+ N) l) W$ u) K - 13.10.3 自动生成实体类 445+ c( j+ G3 S# a5 R: H; W
- 13.11 路由与数据传递 447+ U* n3 d% ?1 ]& j
- 13.11.1 新建路由 447. z: n( j- o3 p R& g: Y
- 13.11.2 使用注册路由 450 P: ?3 o Y5 w" A( a' Y/ I
- 13.11.3 路由间数据传递 451, t+ `2 M) k7 ]# c1 Z* @
- 13.12 Flutter与Android的相互通信 456
2 k- d" a. j5 c1 t - 13.12.1 PlatformChannel概述 456
' l- o' J- _ w* K! ^& y' @ - 13.12.2 Flutter调用Android 458
- h2 t p9 \7 n# S6 i - 13.12.3 Android调用Flutter 46113.13 本章小结 465
% v( Q, O# T) S8 f6 d9 A+ t 下载地址:
( p0 \0 |7 [7 i% M Q! |# x& M3 H) p8 [ B4 o" f
5 ]6 D. y) Z. T1 u
侵权联系与免责声明1、本站资源所有言论和图片纯属用户个人意见,与本论坛立场无关
6 \4 f+ u, q& ?8 g* q6 s# d2、本站所有资源收集于互联网,由用户分享,该帖子作者与瑞客论坛不享有任何版权,如有侵权请联系本站删除7 m0 }% ]7 u2 N. M
3、本站部分内容转载自其它网站,但并不代表本站赞同其观点和对其真实性负责
6 m1 M) o4 y* P3 p0 _# s; {4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意3 \; r& S K! y& i
如有侵权联系邮箱:ruikelink@gmai.com$ s- x* |7 ]& m
资源下载地址和密码(百度云盘): [/hide] 百度网盘信息回帖可见
% ]/ Q' `0 J$ S& j
* y$ T$ H% o7 c3 i
( q& X: |3 \& I! S) U" z2 ?' R K- V9 i0 a
本资源由Java自学网收集整理【www.javazx.com】 |