. L+ g5 R- I J* [2 H: `《Android进阶指北》是一本Android进阶图书,结合《Android进阶之光》和《Android进阶解密》两本书介绍的知识,一同建立起Android应用开发进阶知识体系。全书共分13章,主要从3个方面来组织内容:(1)Android应用开发所需要掌握的系统源码知识,包括系统源码的下载、编译、调试,包管理机制,输入系统,Native Binder,Java Binder;(2)应用开发必需的知识点,包括Groovy基础、Gradle核心思想、Gradle的Android插件、Android Jetpack架构组件;(3)与跨平台开发相关的知识点,包括跨平台技术演进、Dart基础、Flutter基础。
/ ~6 [# u% t# k4 K' p S本书适合有一定基础的Android应用开发工程师和对Android系统源码感兴趣的读者阅读。
; D4 s* j. e( l, M. Z+ O& Q目录 ) N, q- G- v$ I3 m0 q( H& ?
# l2 r2 T* e6 Y2 f( x0 q# B- 第1章 系统源码的下载、编译、调试 50 ~5 G0 f+ d5 g# C
- 1.1 使用VirtualBox安装Ubuntu 5
! J/ D f$ d' x - 1.1.1 安装Ubuntu的步骤 6
' V# Z& `9 ]& v$ \4 E' a - 1.1.2 安装增强工具 12
5 ]3 {# Z" e7 G# e" `# [( U- r( k" _- ` - 1.2 AOSP源码下载 14
# N' w3 C. y% s* ?1 L+ T& i: p - 1.2.1 AOSP简介 14 v3 ~4 f# d/ @
- 1.2.2 下载repo 15/ w6 ^: d& A0 J0 T1 R; o
- 1.2.3 下载源码 15
1 P/ R: V, b) z7 \' U8 S - 1.3 内核源码下载 16
3 N ?1 Q- {7 h5 F7 j; R6 {: G4 B, y - 1.4 系统源码的整编和单编 18
* H0 b9 g% _+ x1 ^: Z: D - 1.4.1 编译系统概述 18' @/ h' [2 f1 M
- 1.4.2 编译源码的方式 20
: P6 u5 g( k2 G3 Z; I% ` - 1.4.3 准备编译环境 20) H/ ]$ y$ Z/ x2 L- e
- 1.4.4 源码整编 21
, y' t3 P2 f) R6 M - 1.4.5 源码单编 24
! o! C5 L1 `( o# Q - 1.5 Source Insight导入系统源码 25
- O2 B+ _9 I# Z, [# G8 K# p - 1.5.1 新建源码项目 25# x. R& t; ]( E7 d
- 1.5.2 定位文件 27# F& c4 r3 s: P! K5 |; g- J/ K# T
- 1.5.3 全局搜索 28$ P& G# T( K- Y, |$ |( i) ?
- 1.6 Android Studio导入系统源码 29# u5 R" Y( @6 E: z
- 1.7 Android Studio调试系统源码 33
% S1 u- @: n- R+ }4 R - 1.7.1 AOSP源码项目调试 34) U9 m# _6 }" _2 w1 l
- 1.7.2 导入部分源码调试 388 u6 n* @3 U! u) g1 N+ K& j* V
- 1.7.3 新建Android项目调试 39
# \# _) |" C3 A4 n - 1.8 本章小结 40
z9 R9 T) I* b7 s- w$ o, E - 第2章 理解包管理机制和PMS 41
& w0 n' Y3 J3 F0 l& L - 2.1 PackageInstaller的初始化 41; m6 {" `5 ]1 c. P
- 2.1.1 PackageManager简介 427 @ D' ^2 Q8 T0 B: T0 ^& }
- 2.1.2 APK的文件结构和安装方式 42
. Q4 t" B; T3 l& N/ Q - 2.1.3 寻找PackageInstaller入口 43* l" a" u' c6 f( g0 ? g
- 2.1.4 PackageInstallerActivity解析 47
: _; I$ ?5 B# ^6 w$ }' ? - 2.1.5 PackageInstaller初始化的过程 51( G. `7 d9 p) h$ B' I6 p
- 2.2 PackageInstaller安装APK过程 52
[; u7 o4 q6 [$ r4 F' j, K5 C3 O" T - 2.2.1 PackageInstaller中的处理 52
/ I6 J, |: c% R# \ d - 2.2.2 Java框架层的处理 57) ]5 z- U0 |' k3 o P5 z
- 2.2.3 PackageInstaller安装APK的过程 59* [, X1 I, j) y; q
- 2.3 PMS处理APK的安装过程 59
# S! i5 y! _8 h* C9 O1 @" R - 2.3.1 PackageHandler处理安装消息 60 g6 u* L; W0 [/ { `0 F; k
- 2.3.2 复制APK的处理 661 W8 w; k; n2 A) ~7 r6 F# p C3 \
- 2.3.3 PMS处理APK安装 70
. d' I* o! U2 k/ N0 M) B# V - 2.3.4 PMS处理APK安装的步骤 76: g- w2 h' n: L' T
- 2.4 PMS的创建过程 77
?4 n$ {7 e' M( E - 2.4.1 SystemServer处理部分 77
6 t& S, b1 k8 D" w$ j# L0 g - 2.4.2 PMS构造方法 80
3 t) S% _" F( Z e; ` - 2.5 APK解析过程 91; X1 n8 x6 S2 L5 `* ]5 R
- 2.5.1 引入PackageParser 91# n7 I: s3 \5 t: R7 P- h7 p/ X2 G- g
- 2.5.2 PackageParser解析APK 92
; {8 ]0 H, c4 z2 H7 o - 2.5.3 Package的数据结构 99
& ^) T( i2 t& c: ^( w- G - 2.6 本章小结 100
. T5 `5 _1 Q3 r5 R' k( d, v - 第3章 理解输入系统和IMS 102 g7 c) b1 X: `& {8 o
- 3.1 输入事件传递流程的组成部分 103
( d$ q; d- ^* Y$ |% J - 3.2 IMS的诞生 105
3 ]8 f6 B9 |# i3 e) s - 3.2.1 SystemServer处理部分 105) Q8 p* C* H; Y C3 N" A% \' {
- 3.2.2 InputManagerService构造方法 107
- _2 h. ]* x. |3 [' P - 3.3 IMS的启动过程 110# L$ e7 N# \/ ~4 y$ _
- 3.4 InputDispatcher的启动过程 112+ h* {* l; |; `' A3 |
- 3.5 InputReader处理事件的过程 113
. P! y6 O& \- ?, t2 h7 S - 3.6 输入事件的处理总结 119; q5 _7 Z) w$ @' ?6 G6 I0 i
- 3.7 InputReader的加工类型 120$ |& \) U9 [( j7 e- s& `
- 3.8 InputDispatcher的分发过程 1234 Z2 Q0 z. _$ ]" l1 ]
- 3.8.1 唤醒InputDispatcherThread 123
! G/ u- U# h# n2 D) I - 3.8.2 InputDispatcher进行分发 1249 x+ R. w/ C E, a4 S: a" E
- 3.9 事件分发到目标窗口的过程 128' L {; F1 A; b
- 3.9.1 为事件寻找合适的分发目标 128' V1 `7 l5 p! A* ]' I% C! T$ i
- 3.9.2 处理点击形式的事件 132. f* P5 V1 U2 z2 A% @# E/ ]
- 3.9.3 向目标窗口发送事件 135* q: @2 ^# N3 @' ~: v3 L, m; ]
- 3.9.4 Motion事件分发过程总结 1363 U" V+ m/ |6 C6 \
- 3.10 本章小结 138' p/ K/ {4 K) q# v' ?# T j0 u
- 第4章 IPC机制 139: h. i& A" ^- V( {3 `, N
- 4.1 Linux和Android的IPC机制 139 d5 | y" F% R
- 4.1.1 Linux中的IPC机制 139
2 k2 k$ s3 l; @6 ]! \ - 4.1.2 Android中的IPC机制 141; q7 e9 p, q1 c# ?6 |6 A9 C2 H
- 4.2 开启多进程 142
, J2 m H. h, _5 X6 D8 b' u - 4.2.1 开启多进程举例 142! D' }& ~: \4 a1 q& Z
- 4.2.2 开启多进程引出的问题 144
5 B7 G P. W" ?& A - 4.3 用Messenger进行进程间通信 146 X+ E( X, @; v6 s% |3 [7 F
- 4.4 使用AIDL实现跨进程方法调用 150
0 o- _" l' c; P" w1 j8 V - 4.4.1 创建AIDL文件 150
, a& c: k" S9 @/ v - 4.4.2 创建服务端 1527 T$ S+ m; z+ `0 z9 m* W5 r
- 4.4.3 客户端调用 153
2 S: J4 \) d- }* y1 | I- l - 4.5 用ContentProvider进行进程间通信 1552 g2 a& w( B5 `$ \- b% N
- 4.5.1 建立数据库,方便ContentProvider使用 155 h+ A- y* v& J! D6 K$ h) U/ H
- 4.5.2 使用ContentProvider对数据库进行操作 156: n. d9 V* b# R( t( a) u. V
- 4.5.3 在Activity中调用另一个进程的GameProvider方法 158
" k& T& ?" r1 O - 4.6 用Socket实现跨进程聊天程序 160
3 d1 s6 n# } {$ T* Z, W, ?) h6 w. N - 4.7 本章小结 1674 p: @! i, R! x* O' x) i7 H
- 第5章 Native Binder原理 168# a; u- @8 Q9 w1 c- g; z4 H
- 5.1 学习Binder的前置知识点 168
$ l% j% h5 T0 V8 D2 E( H - 5.1.1 Linux和Binder的IPC通信原理 169- F8 z' @" b7 Y# y/ ~
- 5.1.2 使用Binder的原因 173
" f+ p9 f: o0 P: a - 5.1.3 学习Binder的原因 174 u3 Q* O# m j/ [
- 5.2 ServiceManager中的Binder机制 1757 w* O8 D) _' i
- 5.2.1 基于Binder通信的C/S架构 1752 }/ {* g1 S1 } `* C6 `
- 5.2.2 MediaServer的main函数 176: J1 V1 c; `2 a- g. X
- 5.2.3 每个进程唯一的ProcessState实例 177$ t! w9 s8 |$ V7 v8 e0 f( a
- 5.2.4 解析ServiceManager中的Binder机制 180
0 e+ h F, _" Y& v+ p& w" S2 b) d - 5.2.5 小结 187$ y3 C2 `0 g Y9 j& C, q* A
- 5.3 系统服务的注册过程 187
}% N8 j9 @1 c/ k! b - 5.3.1 从调用链角度说明MediaPlayerService的注册过程 187; x4 _! U+ G& ?' @ f: `* q
- 5.3.2 从进程角度说明MediaPlayerService的注册过程 195
! `) _. f, F/ L' W& d; x - 5.3.3 小结 196
4 j8 `. p( |% ]! b9 O4 F - 5.4 ServiceManager的启动过程 196" j- L/ t+ `9 O5 L- G3 b
- 5.4.1 打开binder设备 198& G: H& d7 T ~7 b# A7 f1 i
- 5.4.2 注册成为Binder机制的上下文管理者 201
* Z' _9 A/ t' T! @! X5 I% Q" s/ I - 5.4.3 循环等待和处理客户端发来的请求 203/ ]- _+ S9 \1 q. R9 u& @
- 5.5 系统服务的获取过程 2064 Z7 S% J7 x/ ^2 S$ s$ o
- 5.5.1 客户端MediaPlayerService请求获取服务 2066 i( k ?, ~7 t( c
- 5.5.2 服务端ServiceManager处理请求 212 @) c8 M) ~* q/ }
- 5.6 本章小结 218
2 o$ I+ w2 v, Q! i" G, ? - 第6章 Java Binder原理 2195 {5 C) n ?, ^# C _# H
- 6.1 Java Binder的JNI注册 219
/ U& V( y. [9 y# h - 6.1.1 Binder类的注册 223. u# a+ w2 R: m C' A* e( O* W y
- 6.1.2 BinderInternal类的注册 224/ q5 Y/ c+ ~ \* u+ r9 S Y
- 6.2 Java Binder中系统服务的注册过程 225
$ N( t" K% L6 M - 6.2.1 将AMS注册到ServiceManager 226
! l2 F2 g, ^ ?4 b' A+ k) N - 6.2.2 引出JavaBBinder 230
5 O3 G1 K6 x2 _, T* E! C4 o - 6.2.3 解析JavaBBinder 232
# J q/ r( Q* i p7 z - 6.2.4 Java Binder架构 234
3 D) D3 w0 @8 h! Y" ^ F5 L/ M - 6.3 本章小结 2358 D( }" C/ o% T3 e6 m
- 第7章 Groovy基础 236' ?8 R Q& @8 H+ w6 w! y
- 7.1 Groovy概述 236
$ m: H- A' U7 c( h# K i4 I - 7.2 Groovy编写和调试 2379 ^7 L' ~! h: K- k& y8 f- c& j
- 7.3 变量 237& z! P' [9 ^# ?; K$ S
- 7.4 方法 237
7 u! U7 f4 e$ N4 J2 x; Z2 i - 7.5 类 238
4 c6 ]6 z0 E2 v) ~; m+ T; `7 J1 h$ ~ - 7.6 语句 239
4 c: v* L% N; L8 @ - 7.6.1 断言 2397 \5 p, Y& l7 T: q( p$ J
- 7.6.2 for循环 239% ^+ c& p) s' B1 I- c
- 7.6.3 switch语句 240
7 ^: T, D! C+ A* i - 7.7 数据类型 241; E- q) m3 G1 m7 D* u# t+ a
- 7.7.1 字符串 241; J. k' w+ `9 F/ }. t: X4 q
- 7.7.2 List 242* P" m. K! D5 d; L& C0 e
- 7.7.3 Map 242/ @6 {$ L9 G' B8 ]# r
- 7.7.4 闭包(Closure) 243( b* \# s ^: \( _6 s
- 7.8 I/O操作 244 L/ D; G# E9 a5 \# K2 \7 J
- 7.8.1 文件读取 244/ d9 Q' ~! H6 S, j ^( h
- 7.8.2 文件写入 2449 r/ d0 J5 F3 A
- 7.9 其他 245
% L, U2 g1 D6 W9 g( A) v; u# x - 7.9.1 asType 245
8 A% R* y( d9 R/ b - 7.9.2 判断是否为真 245$ v Q+ E, Z" l3 l4 R E
- 7.9.3 安全取值 245
# v' i' Q3 u. W* W3 r - 7.9.4 with操作符 246
& V7 K" v/ x% \0 h - 7.10 本章小结 246
( G5 y1 }+ N2 C( c, j+ P9 N7 @ - 第8章 Gradle核心思想 247
' b; s. I" R4 j( b+ M - 8.1 Gradle概述 247( T" V v2 U, d
- 8.1.1 项目自动化 248/ L8 I# ^& a) x/ }4 w! I
- 8.1.2 构建工具 248
) k6 y( x! S I: h q- o - 8.1.3 Gradle的特性 253$ E* v1 b, t0 j: g x* |% q* Z
- 8.2 Gradle基础知识 255
0 D: O; ^7 ^( H" @; w2 e - 8.2.1 配置Gradle环境 255
: o( V- z( y0 u* E% [; Y - 8.2.2 实现Hello World 257
7 t; S# `+ @; [4 d8 d6 v - 8.2.3 Gradle的任务 258
% F4 I$ Y8 @, I) H2 L9 c; [ - 8.2.4 Gradle日志级别 260
! x9 G! s" n1 h2 w7 ~ E/ w2 a - 8.2.5 Gradle 命令行 261; r, R4 f6 Q, T5 R) P. ?8 ^
- 8.3 被忽视的Gradle Wrapper 263
. j# S3 K8 y+ j; _ t - 8.3.1 为什么需要Gradle Wrapper 263
% o' u6 _8 Z* E7 q! l& \) _- | - 8.3.2 构建Gradle Wrapper 2648 B( s2 ^% E1 y
- 8.3.3 配置Gradle Wrapper 265- {% M0 t: R4 } A: k
- 8.3.4 使用Gradle Wrapper 266
! b$ a! @0 U% }4 D - 8.3.5 升级Gradle Wrapper 267* y; P' u. K. a8 Y' L @
- 8.3.6 自定义Gradle Wrapper 268
3 \$ L! D: P0 q5 `, [8 ] - 8.4 Gradle插件基础 268
# f$ v! z1 T* b. I% p0 { - 8.4.1 Gradle插件概述 268
1 d" j* h7 U$ g2 K - 8.4.2 应用Gradle插件 270
% o! d6 _9 {* H- r/ a7 S - 8.4.3 插件DSL 2724 T; y. ?, G+ q! |; [! m" \" P7 G
- 8.4.4 自定义对象插件 2730 D% B$ I" r9 j' `% |: z: D! |6 x4 r
- 8.4.5 Gradle插件的作用和优点 2744 |- b( t' u1 r/ o8 N1 n
- 8.5 自定义Gradle插件 274. G0 G& Y+ @: k# u
- 8.5.1 在build.gradle中编写 275
\( S' G& c0 } - 8.5.2 在buildSrc工程项目中编写 2772 E, J7 f4 x1 G1 t
- 8.5.3 在独立项目中编写 2781 C+ ] U6 q, |2 r% n
- 8.6 本章小结 281
' a: G$ l1 |7 z2 l - 第9章 Gradle的Android插件 282+ l1 `8 F7 O0 j- P W: S
- 9.1 什么是Gradle的Android插件 282
; B$ V8 i" y: {/ n' q0 N# o* G7 ` - 9.2 Android Studio的模块类型和项目视图 283
4 g+ `; ]+ ^& j h/ N% A - 9.3 项目build.gradle 284
8 Y8 n1 H) }6 X4 o0 _ - 9.4 模块build.gradle 285
I" D0 ~- J% n - 9.4.1 Gradle的Android插件类型 286: k, S0 M2 s3 m6 F8 Y1 u# N) \
- 9.4.2 Android块 2869 E2 ^; ? O! t/ ?9 f# u
- 9.4.3 dependencies块 291" ?+ J4 j- S$ `! S* K* W
- 9.5 Android签名文件配置 2929 E8 D8 Z/ V! m3 S
- 9.5.1 自定义签名信息文件 292
) s1 N3 h+ {# ^& X/ H - 9.5.2 本地添加签名信息文件 293$ J9 \& A; k# F. x/ N/ h. z3 B, r
- 9.6 Gradle的库依赖 294
8 @8 ]+ K) G2 {' t* z; w - 9.7 Gradle的库依赖管理 295! P3 p$ {5 d" S+ k5 h' C" V
- 9.7.1 Gradle的依赖传递 296
0 n7 t' ^0 \2 N! u - 9.7.2 Gradle的依赖检查 296
+ D' a2 \7 i6 q& j2 i1 V. t2 X7 W - 9.7.3 Gradle的依赖冲突 299) M5 p2 o, j1 o0 j
- 9.8 本章小结 301
# N, O! G; l# O8 {3 t/ C - 第10章 Android Jetpack架构组件 302! n' N0 E6 h/ u; }$ R# C, y d. f
- 10.1 Android Jetpack简介 303* G9 W8 F0 P& S* v7 [. N
- 10.2 Android Jetpack分类 303
& G1 I: y7 ]( e: v p+ @ - 10.2.1 Architecture 304- V ^! @( c' d; b/ T
- 10.2.2 Foundationy 305" J, f1 V( ]1 I. U- U0 ?$ h6 x: G, S
- 10.2.3 Behavior 3061 y! M% W1 j2 [
- 10.2.4 UI 307
6 ]5 n2 d/ h0 \" l5 Q o3 x. l' \ - 10.3 在应用中引入Jetpack相关组件 307
( O% R* @% b- D7 a+ C - 10.4 使用Lifecycle 307
A5 V/ \) A6 w9 g2 H$ {$ [ - 10.4.1 为什么需要Lifecycle 307$ Y V, x) l' r% F/ ^# i1 {
- 10.4.2 如何使用Lifecycle 3094 M( Z& ~- d e3 P+ X0 }. L
- 10.4.3 Lifecycle应用举例 3128 j7 A, e5 c0 W0 ]4 M
- 10.4.4 自定义LifecycleOwner 315- J" J" L# l" c) j/ C6 y
- 10.5 Lifecycle的原理 316- j# X% {7 c' b) s4 v: `* N" y
- 10.5.1 Lifecycle的生命周期状态事件和状态 316
6 c& W8 `# }" z - 10.5.2 Lifecycle如何观察Activity和Fragment的生命周期 317
4 c: f) B* a* ]; M) ~; H4 ]# J - 10.5.3 Lifecycle关联类 327& Y* K1 X/ J* G- r1 n$ x4 E' B
- 10.6 使用LiveData 3281 C. b( _ V) Y0 W1 a$ V; T2 p
- 10.6.1 什么是LiveData 328! j ^! b' D7 Q5 I4 j8 a! z0 H
- 10.6.2 LiveData的基本用法 329+ X- _! G2 F! C
- 10.6.3 更改LiveData中的数据 330* T7 q$ C9 I- C0 e/ O* W/ s& D
- 10.6.4 合并多个LiveData数据源 332
" I) A% t) b# b6 U* m - 10.6.5 拓展LiveData对象 333
5 k8 f5 @, M4 j) x - 10.7 LiveData的原理 3350 b8 }# ? V# R5 J+ G+ i5 O7 e
- 10.7.1 LiveData如何观察组件生命周期变化 335
- x3 ^$ G9 }" ~* u3 u- V7 m' O - 10.7.2 LiveData的observe方法回调 3368 g, q5 M2 P% k) p( [3 z& D. k; b
- 10.7.3 postValue/setValue方法分析 3392 l/ o' I D2 V8 O
- 10.7.4 Transformations.map方法分析 341: r8 K: L7 o& W% q. O
- 10.7.5 LiveData关联类 3436 z+ X6 m/ T7 ~
- 10.8 使用ViewModel 3440 H0 e. u7 @7 M& b3 U3 D& m+ C
- 10.8.1 什么是ViewModel 345' e/ s+ f! f+ D3 {
- 10.8.2 ViewModel的基本使用方法 345
- k' G( _: X# k m9 R/ s - 10.8.3 ViewModel的生命周期 347* e' B; z8 y# m
- 10.9 ViewModel的原理 3481 G9 q7 A% U# X
- 10.10 本章小结 351
0 B- c* j2 B/ @, U t3 W% c6 R - 第11章 跨平台技术演进 352" x' B9 b! w8 T7 `0 G
- 11.1 Web App 3532 e. P) ?# M5 @8 R% [3 U2 c, k
- 11.2 Hybrid App 353' x6 ~! Y5 ^3 Q* t
- 11.2.1 Cordova 354% Q5 F( I" C! n+ A# L% {
- 11.2.2 Ionic 3551 e" B6 l4 {0 A; f0 [
- 11.2.3 VasSonic 355
1 M+ I/ ~; s! C6 k: V2 X" f1 p - 11.2.4 微信小程序 356
) I! Y- ^7 B5 m4 v - 11.3 语言编译转换 357* _1 \& ]. h* `% D+ L" V
- 11.4 原生渲染 358
( i* b) \- G+ ?) O6 D - 11.4.1 React Native 358$ S8 m( m+ ^/ x$ x0 I- n [
- 11.4.2 Weex 358
6 p! L! Q/ C: I) r" q4 X - 11.4.3 快应用 359
, @% P" C* H% ?& o - 11.5 自绘UI 360$ G2 ~, n6 u) u
- 11.5.1 Qt 360) N1 R p# p) p- S
- 11.5.2 Flutter 361
. @- }) q& z5 a- e - 11.6 本章小结 362
9 |' Y6 ?3 G7 l K# M - 第12章 Dart基础 363
& u/ a/ H8 z# d' f h - 12.1 Dart开发环境搭建 363
b% i* b# J7 i- M4 h3 L! S - 12.2 Dart概述 364; Y" Y8 T' ~$ u0 N2 K; T) n8 T
- 12.3 Dart的特性和重要概念 365
# L" \, x0 R# F. }3 @- p - 12.4 Dart关键字 3661 I6 F5 b& s$ x# _7 |
- 12.5 变量 367
& N+ W0 G, y( X7 w' I - 12.6 基本数据类型 367
% P7 V5 e1 E5 i: J- z& k - 12.6.1 Number 367" k- R1 i3 n2 n0 `. n" P2 i
- 12.6.2 String 368
. M9 b: A i" e/ g# F - 12.6.3 Boolean 368
* B( h# |2 m4 d* S - 12.6.4 List 368
9 G& X6 c, ~4 @$ n1 ^( w3 y - 12.6.5 Set 369
8 \+ j) P( O6 H( v - 12.6.6 Map 369
, O: J; W4 u* H; R+ a, Z - 12.7 函数 369 B" e7 R* u. G* u
- 12.7.1 可选参数 370 a& y' v, q* m) C) [
- 12.7.2 默认参数值 370
% x- }7 t1 K& N6 w5 a% B - 12.7.3 main函数 371% f7 o0 W4 ~3 x% H q6 m2 T0 l$ [
- 12.7.4 匿名函数 371
$ @: l( C8 F0 ^ - 12.8 流程控制语句 371
0 Z3 ~8 I l- V C3 K' z - 12.8.1 for循环 3722 w/ \$ A" B7 g$ V8 ~
- 12.8.2 switch和case 3720 K' n& F, S( P9 D5 A5 I. |
- 12.9 捕获异常 3732 Y- T. N3 ^3 J! k
- 12.10 为类添加新的功能 373
7 L1 e' t9 D ] - 12.11 库的使用方法 374. E9 N$ b( J% `0 ^" B7 d, |
- 12.12 异步支持 375
4 m% t2 b; I; d/ r+ T/ A - 12.13 使类可调用 376! \3 ^; v3 c( b: M' q
- 12.14 创建实例 376
% a5 B. ~7 ^: z( E. p! s1 F - 12.15 本章小结 376
0 S0 R& O; P- X! ^3 W - 第13章 Flutter基础 3775 }, ~$ ^( N9 f& C/ p
- 13.1 Flutter开发环境搭建和Hello World 377
7 o. W' Q5 f- v, D H9 d6 `* v - 13.1.1 Flutter概述 378- T7 }$ P4 \5 D( o
- 13.1.2 Flutter开发环境搭建 378
: N9 |0 _+ ^5 \* x! h8 c - 13.1.3 运行一个Flutter Demo 383
& T5 t( r% \/ ?) ~ - 13.1.4 Hello World 385
+ C) l- A( x5 [ - 13.2 Widget基础 386
4 _" @- t8 O! ` - 13.2.1 Widget概述 387
! c! k' J4 s' J! n - 13.2.2 Widget的分类 387
/ x8 Q9 D$ X2 ]& R - 13.2.3 Widget的状态分类 388
5 ]1 y) w6 P1 b/ ~2 }7 M$ n* N" q - 13.2.4 根Widget的种类 388' h6 @( M0 L( K. B/ s8 Y
- 13.3 Basic Widget 389
: }5 s, ~/ g, V - 13.3.1 代码模板和主题 389 t1 d' J" g4 Z8 a
- 13.3.2 文本 390
% }3 `/ i0 r8 L$ x! s8 T - 13.3.3 图片 391" [* F6 u! T3 N: s% e6 D3 I
- 13.3.4 凸起按钮 3942 |* u" f% O6 u( \+ S$ {
- 13.3.5 其他Widget 395
0 D4 V" y' C y$ k3 D( S: ^ - 13.4 Material组件 3970 _: ]2 v0 Y7 B2 s( q* J
- 13.4.1 MaterialApp 398
( ?$ j; g4 s$ ?1 J - 13.4.2 Scaffold 401
+ f0 u* d+ O+ J# @; J! `( Q - 13.4.3 AppBar 4038 ~0 n s7 O" ~4 N
- 13.4.4 BottomNavigationBar 405
) Z7 r+ }+ l g7 E - 13.4.5 TabBar 4073 [5 `$ S( [% S5 z+ E% Q
- 13.4.6 Drawer 411
^" ]8 c* h3 S - 13.5 Scrolling Widget 413, H+ d7 i6 R$ R: q9 L
- 13.5.1 ListView 413
" G4 ^0 R8 O( f9 W - 13.5.2 GridView 418: i( F0 }* I; X7 o1 T- l+ {
- 13.5.3 PageView 419
. j1 L7 ~! w4 r @% d, ^ - 13.6 手势相关Widget 421
5 d) l5 k6 @; f5 A# o - 13.6.1 指针事件 4214 B4 o( `( }& c, s" V
- 13.6.2 手势 422& J4 r" W' t! l2 L. L4 F+ K; {
- 13.6.3 使用GestureDetector 4232 ^, C: T5 t3 ]3 P8 x# {
- 13.6.4 使用Dismissible 424
0 N$ i. @1 f- } - 13.7 资源和图片 4269 D ], ^: o+ y8 y3 a! ^
- 13.7.1 指定asset 4262 M8 N- U0 F# A* b# J: e8 R
- 13.7.2 加载文本 4277 M, B, a3 K0 p8 ~* R+ s
- 13.7.3 加载图片 430
- P/ g! S2 A# {2 \- n/ T+ d - 13.8 布局Widget 433
; w. W! @0 Z" b3 x2 }1 V$ A7 z - 13.8.1 线性布局Widget 433$ O$ b0 {) P% o9 P
- 13.8.2 流式布局Widget 434
# c" ?" \) m! H& p | - 13.8.3 层式布局Widget 4360 r2 I: K7 V) u+ {) V" n2 o
- 13.8.4 弹性布局Widget 438$ E- i* M# i1 q) f
- 13.9 网络请求库Dio 440) f3 c7 ~* S0 ~+ o, Y5 J+ ]9 A
- 13.9.1 Dio的使用入门 440
' V X; o9 T! X; w, F& U& B, O - 13.9.2 Dio访问网络 441% R* g5 ?: \+ Y& b+ p* u6 f$ c
- 13.10 JSON数据解析 4434 S7 g4 ?( _9 g
- 13.10.1 使用json.decode方法 443, Z$ v: _ |; K, t5 l" {7 @
- 13.10.2 手动编写实体类 444
% u( p6 _1 J: V n - 13.10.3 自动生成实体类 445
9 `) ?8 x" }: S" O* Z5 {$ t% l - 13.11 路由与数据传递 447
: o" u" q. P# b - 13.11.1 新建路由 447. S7 U1 S6 {( r e5 Z3 c& j
- 13.11.2 使用注册路由 450
B3 K6 f" X. j* s - 13.11.3 路由间数据传递 451) s5 b( ^& h- H, L( I
- 13.12 Flutter与Android的相互通信 456* v# M' ^2 x$ K% U+ D$ p4 b& A
- 13.12.1 PlatformChannel概述 456- e( K% s& f5 x
- 13.12.2 Flutter调用Android 4584 `4 k' [( T4 P' a9 g
- 13.12.3 Android调用Flutter 46113.13 本章小结 465" z' k$ p( W. v4 |; z- ~! y# g6 U- _
下载地址: / S2 n# S. W \/ I) s
8 E9 K! [6 E/ n9 B" ] e7 L! ~- \5 O/ z. i! W) |2 L) C
侵权联系与免责声明1、本站资源所有言论和图片纯属用户个人意见,与本论坛立场无关3 p% u' N) { K# `" m/ q
2、本站所有资源收集于互联网,由用户分享,该帖子作者与瑞客论坛不享有任何版权,如有侵权请联系本站删除
9 r: q( v0 H' A/ ^6 C3、本站部分内容转载自其它网站,但并不代表本站赞同其观点和对其真实性负责
. C: E+ d w6 r5 _4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意6 S/ `- i" m2 n+ w! V: g- I4 @* l
如有侵权联系邮箱:ruikelink@gmai.com5 K0 w) i" G% j+ T! `
资源下载地址和密码(百度云盘): [/hide] 百度网盘信息回帖可见! k8 n& \- _( j E8 x2 |9 q
0 r! G, c _- Y) H# p# ]- F: n8 j: L, f
Y& X: f- X+ q0 r' v4 v3 k" _
本资源由Java自学网收集整理【www.javazx.com】 |