2 [* G, b* U7 `- {$ A8 o; i% g《Android进阶指北》是一本Android进阶图书,结合《Android进阶之光》和《Android进阶解密》两本书介绍的知识,一同建立起Android应用开发进阶知识体系。全书共分13章,主要从3个方面来组织内容:(1)Android应用开发所需要掌握的系统源码知识,包括系统源码的下载、编译、调试,包管理机制,输入系统,Native Binder,Java Binder;(2)应用开发必需的知识点,包括Groovy基础、Gradle核心思想、Gradle的Android插件、Android Jetpack架构组件;(3)与跨平台开发相关的知识点,包括跨平台技术演进、Dart基础、Flutter基础。
* L4 y! o0 B& Y3 u, y. ]) j7 [2 Z2 B本书适合有一定基础的Android应用开发工程师和对Android系统源码感兴趣的读者阅读。
7 ]9 J+ u$ }: o; Y( |) Y目录
: t% w, Z; E$ e6 ~
/ p8 B' g% p( ]9 {- 第1章 系统源码的下载、编译、调试 5
* M, i$ i( K4 i0 q# R - 1.1 使用VirtualBox安装Ubuntu 5# M3 f6 Q" V! n+ j: A
- 1.1.1 安装Ubuntu的步骤 6( J# r+ ~/ R# v% R1 O0 N
- 1.1.2 安装增强工具 12
$ V- [+ _, ^# x. ~ }1 j+ H - 1.2 AOSP源码下载 14
% V8 ]( J7 e. M! {4 e - 1.2.1 AOSP简介 14
8 x, d' i& Q' d. p G - 1.2.2 下载repo 151 _" }8 A+ S' R0 G9 S( m. \
- 1.2.3 下载源码 152 \& P+ |( i$ ]5 X3 D5 d+ m
- 1.3 内核源码下载 167 _1 t6 ]8 L$ t, k: m( h5 f0 \* N
- 1.4 系统源码的整编和单编 18
. U0 ]9 z3 }6 v3 I) w& d; G: z - 1.4.1 编译系统概述 183 E3 F, ?( V; ^9 _1 N; H. X
- 1.4.2 编译源码的方式 20
) C$ ~) l& N4 |& W w - 1.4.3 准备编译环境 20" C6 E1 a# o( }$ P( N- F# F. v
- 1.4.4 源码整编 21
* m3 C5 ?2 k5 o% |1 v6 @2 ^ - 1.4.5 源码单编 243 M4 l+ m8 Y- F1 s) Y2 |3 M
- 1.5 Source Insight导入系统源码 25/ Q1 ` P9 ]. F, ]" r
- 1.5.1 新建源码项目 25( M& M7 [. c: F* n
- 1.5.2 定位文件 27: i/ u8 K4 S! m9 N
- 1.5.3 全局搜索 28
5 J9 U- A4 H/ S( A6 T - 1.6 Android Studio导入系统源码 29$ V5 D: t3 E' ]% \3 K- j! t. V# p
- 1.7 Android Studio调试系统源码 33
1 D. X: \ O( J; u - 1.7.1 AOSP源码项目调试 346 h3 d9 [% [. F: K$ z* e/ B9 q
- 1.7.2 导入部分源码调试 38
2 ^, g9 W$ i$ i8 `5 o. i% O% Q& b - 1.7.3 新建Android项目调试 39
2 B( B# w- L, |* {7 b) c2 X - 1.8 本章小结 40& L7 ~+ N+ A% u0 x
- 第2章 理解包管理机制和PMS 41 |/ W' Y Q3 }8 d8 x$ N
- 2.1 PackageInstaller的初始化 41- e1 Y; h* h# e: B7 e& S* l6 D
- 2.1.1 PackageManager简介 42
* l% r9 l- i @$ L - 2.1.2 APK的文件结构和安装方式 42
1 X0 e% {/ n" I - 2.1.3 寻找PackageInstaller入口 43# P" j* j2 J+ u# b' K
- 2.1.4 PackageInstallerActivity解析 476 o( B) u) r5 z5 p, j
- 2.1.5 PackageInstaller初始化的过程 51% ], w) e6 v6 n9 \
- 2.2 PackageInstaller安装APK过程 52
: c) p: j; E' Q5 A( ^ - 2.2.1 PackageInstaller中的处理 52
, s+ Q+ p8 p* u: g1 ~" J - 2.2.2 Java框架层的处理 57
5 o; L4 H6 w( f! P% ]; \3 q - 2.2.3 PackageInstaller安装APK的过程 59( U# _* j8 U) {0 C- c5 [
- 2.3 PMS处理APK的安装过程 59
* o+ M* E% u* M0 @" ] - 2.3.1 PackageHandler处理安装消息 60
+ n1 E* N }" d - 2.3.2 复制APK的处理 66, J' G8 }5 L. y/ v! O+ t
- 2.3.3 PMS处理APK安装 70
: j! V7 V* U$ |& T, n5 [! t - 2.3.4 PMS处理APK安装的步骤 76
- y! y+ n9 j, [4 w$ h5 ^! n! H - 2.4 PMS的创建过程 77
& N, d. h' B( f1 ^) Y) [ - 2.4.1 SystemServer处理部分 77; |, i* Y% o9 }# [5 t
- 2.4.2 PMS构造方法 80
/ u& _5 i3 Q6 A/ X4 o/ s; a% \ - 2.5 APK解析过程 91% B1 ^: B' E2 e+ r$ ^
- 2.5.1 引入PackageParser 91
2 _% K# J9 V* i( l1 W - 2.5.2 PackageParser解析APK 92
: a, R5 j& @ O0 e5 E - 2.5.3 Package的数据结构 99' N/ @) Z _& e8 u0 q0 p; i
- 2.6 本章小结 100
a9 ?8 r& ~% B$ D2 `2 z - 第3章 理解输入系统和IMS 102
8 A6 ?. } I! P# n# I% D - 3.1 输入事件传递流程的组成部分 103+ ]6 H) Y2 s. j2 _8 Y5 Q: H
- 3.2 IMS的诞生 105
+ S e: p! j& R - 3.2.1 SystemServer处理部分 105
, U! E \2 J4 ^( |$ \ - 3.2.2 InputManagerService构造方法 107
0 q- v# @' r" _3 x5 P - 3.3 IMS的启动过程 110
% J4 t% O R$ r7 r8 ]" m: [ - 3.4 InputDispatcher的启动过程 112: L0 r$ k, N) c9 b- ^: c
- 3.5 InputReader处理事件的过程 113( M* e5 ^: h! g
- 3.6 输入事件的处理总结 1191 N+ T# Z9 j1 Q# y0 {/ c+ h7 @' X
- 3.7 InputReader的加工类型 120/ H! F! z: Y, C8 f( f
- 3.8 InputDispatcher的分发过程 123
5 {: J- }8 o8 E" c9 @! C" s9 a - 3.8.1 唤醒InputDispatcherThread 1235 _3 z g Y7 f q9 {4 U5 Y0 D9 o/ D8 j
- 3.8.2 InputDispatcher进行分发 124
! k3 d! ~4 N9 ]2 l. X1 Q% b - 3.9 事件分发到目标窗口的过程 128
" P! g1 i; |4 M* ^ - 3.9.1 为事件寻找合适的分发目标 1285 N" ^) E" W" D# M
- 3.9.2 处理点击形式的事件 132
" [2 R$ `# t6 X" T- W% I - 3.9.3 向目标窗口发送事件 135
1 D7 V6 `7 D0 t - 3.9.4 Motion事件分发过程总结 1368 X1 ]7 i; C4 ]
- 3.10 本章小结 138
' T; F% t5 {8 v# |( h - 第4章 IPC机制 139
3 p! a* X" _) c# p' I - 4.1 Linux和Android的IPC机制 139
' z) }0 D1 p$ F: W6 N - 4.1.1 Linux中的IPC机制 139. l# U# `& |6 ]) Q, e
- 4.1.2 Android中的IPC机制 141
6 k3 ]+ C: x: x - 4.2 开启多进程 142
% u9 l! |0 }' c. N2 S- I" j - 4.2.1 开启多进程举例 142
, t' ]& w1 L9 @: `3 u ^ - 4.2.2 开启多进程引出的问题 144
$ b+ n* s5 B) E2 X" h0 I - 4.3 用Messenger进行进程间通信 146
7 S6 V% V. S: K. {3 X( ^& i9 U - 4.4 使用AIDL实现跨进程方法调用 150
7 a2 N' q* L( Y+ ^ - 4.4.1 创建AIDL文件 150 ?9 c" Y& _7 ~7 X8 c/ R$ T
- 4.4.2 创建服务端 152. M) [( f4 T4 {. W$ x3 j
- 4.4.3 客户端调用 153
+ o1 m/ F. A, j7 g - 4.5 用ContentProvider进行进程间通信 155! B o" k6 i* V! W- i A$ s
- 4.5.1 建立数据库,方便ContentProvider使用 155
P; r) G+ b4 c# S. D0 `4 q - 4.5.2 使用ContentProvider对数据库进行操作 156
9 R% U" H ?/ a5 u - 4.5.3 在Activity中调用另一个进程的GameProvider方法 158
0 T* O/ b' g( `$ |9 { N' s - 4.6 用Socket实现跨进程聊天程序 160
9 U9 r, z- P8 N/ v4 g - 4.7 本章小结 167
2 Q* s |3 c% k! t7 B - 第5章 Native Binder原理 168+ N# ?8 [7 R6 z: H* l1 \) e7 }' T
- 5.1 学习Binder的前置知识点 168. i& u+ {6 Z7 t* D
- 5.1.1 Linux和Binder的IPC通信原理 169) M- o+ v/ k' G8 B) ]
- 5.1.2 使用Binder的原因 1736 R" g$ v# P0 `* S" S& F
- 5.1.3 学习Binder的原因 174
1 N+ u* e: P. |, h" T9 K - 5.2 ServiceManager中的Binder机制 175& z( K O! v3 l; A
- 5.2.1 基于Binder通信的C/S架构 175
. ~ Y; e k$ g) q - 5.2.2 MediaServer的main函数 176
( E: q9 Q, a( l" f' ] - 5.2.3 每个进程唯一的ProcessState实例 177
' ?$ O) g' B1 R/ p% B - 5.2.4 解析ServiceManager中的Binder机制 180
( F& N/ M b C, k - 5.2.5 小结 187" v) D, U% [2 q, g0 x1 E
- 5.3 系统服务的注册过程 187
; c3 _! ^8 L" L3 x: [ - 5.3.1 从调用链角度说明MediaPlayerService的注册过程 187 o1 j& M8 r! E# L$ C
- 5.3.2 从进程角度说明MediaPlayerService的注册过程 195# m( M# v, ?1 t- J
- 5.3.3 小结 196' M8 v& w! q/ [- d+ g" g, @2 c
- 5.4 ServiceManager的启动过程 196
2 ~: g5 C' @* d* \, r - 5.4.1 打开binder设备 1988 y2 Y5 s$ z# `& w! f( h. q
- 5.4.2 注册成为Binder机制的上下文管理者 201& z" [8 W" Q5 M& x0 o H) D
- 5.4.3 循环等待和处理客户端发来的请求 203
. K I" t2 D" a8 u; M - 5.5 系统服务的获取过程 206
$ D9 U+ j$ u% Q4 z$ K: l: R# z* f% ? - 5.5.1 客户端MediaPlayerService请求获取服务 206, _- }4 \ A0 K6 U4 N" K
- 5.5.2 服务端ServiceManager处理请求 212
* J9 B; C& z& J - 5.6 本章小结 218
; U* y1 d# h/ `5 }6 C5 o5 A0 ~ - 第6章 Java Binder原理 219
7 k" M+ m, `# x# [8 S. g - 6.1 Java Binder的JNI注册 2191 U, \- K- {* c3 X, ^
- 6.1.1 Binder类的注册 223# ]; G/ v- M3 T0 e e& g
- 6.1.2 BinderInternal类的注册 224% w8 c; ~7 w9 d
- 6.2 Java Binder中系统服务的注册过程 2258 a) ~( f5 s* V. f" G+ I* h. Y
- 6.2.1 将AMS注册到ServiceManager 226- _: p8 C7 j g0 Y% s3 A
- 6.2.2 引出JavaBBinder 2300 |6 D f* [/ B
- 6.2.3 解析JavaBBinder 232
$ e5 P5 d- }: ^, Y0 a5 @7 F - 6.2.4 Java Binder架构 2344 \$ H6 D) H: E) t; ]7 \; @1 D" R# d
- 6.3 本章小结 235! l: v0 B# a, `& d8 a3 F* d9 O6 b
- 第7章 Groovy基础 236) H# k8 K! {% `5 Z2 [/ D. F5 ]
- 7.1 Groovy概述 236- Q' u+ A' b, w- H' c3 F
- 7.2 Groovy编写和调试 237
) y h1 `! X5 x$ L- }8 [" | - 7.3 变量 237
# R4 r' E& j9 f( c - 7.4 方法 237$ c: G# S/ ^+ q b( {2 B
- 7.5 类 238
+ n& h& {+ r9 S5 X$ l4 x @# C - 7.6 语句 239" z4 r$ e- k4 d
- 7.6.1 断言 239
/ } O, A; Z6 Y, c; Z/ A4 q8 V - 7.6.2 for循环 239
* \5 N% H& N- \9 W3 A - 7.6.3 switch语句 240
- m9 a: h3 T# E8 u5 l - 7.7 数据类型 2412 S& m* L2 ~ T
- 7.7.1 字符串 241& |5 K" n, g% X- C" F+ c! u
- 7.7.2 List 242
; \. M y0 b$ ?, K X- ~" ~) x - 7.7.3 Map 242
& E% `9 _7 V5 U" s$ L. K - 7.7.4 闭包(Closure) 243. J$ [& h, ^6 h% `" J9 L
- 7.8 I/O操作 244
4 i8 h" s9 w; b# ]* b, C+ | - 7.8.1 文件读取 244( G1 y3 b* F' Z& B) _ g1 Y
- 7.8.2 文件写入 244
1 F) A6 t5 I: T/ [! ?. D7 s! l - 7.9 其他 245+ G/ U+ x; E- ~! B% U
- 7.9.1 asType 245: q! y: \$ Q$ ]: z6 J
- 7.9.2 判断是否为真 245
7 e* h8 T( p0 v0 Q H - 7.9.3 安全取值 2452 k5 z5 c+ H5 d: m1 [9 l
- 7.9.4 with操作符 2467 L1 U# Q7 H) N' l' |$ K7 a
- 7.10 本章小结 246/ a6 c, w$ b- s9 G/ R0 \
- 第8章 Gradle核心思想 247) ~6 ?. [ P- b3 u4 e' _& r: U
- 8.1 Gradle概述 247
* F/ Q: ~8 Z* K, ^* K3 S0 a - 8.1.1 项目自动化 2485 m& k# z7 p4 @0 m4 ?
- 8.1.2 构建工具 248
2 S2 J( L) v! N! ^5 w - 8.1.3 Gradle的特性 253& F- }0 S3 c2 ?0 i8 a- D6 _
- 8.2 Gradle基础知识 255# U8 B* C* b/ N' t
- 8.2.1 配置Gradle环境 2557 j& ^' m5 L ^& L, N, k7 a8 L
- 8.2.2 实现Hello World 257; }( d' W) x8 U5 N7 l
- 8.2.3 Gradle的任务 258+ u( K* Q/ d; Z' O1 z# s/ N
- 8.2.4 Gradle日志级别 260$ i1 R5 h! ?$ a+ i
- 8.2.5 Gradle 命令行 261* N. ^. K0 Y4 U0 T6 }; T
- 8.3 被忽视的Gradle Wrapper 263& Z, D [8 _% h
- 8.3.1 为什么需要Gradle Wrapper 2634 U+ B: {& m! {# t. z$ g
- 8.3.2 构建Gradle Wrapper 264* A" g% X3 h2 z: Z3 }
- 8.3.3 配置Gradle Wrapper 265" |2 f# E `- ?/ h
- 8.3.4 使用Gradle Wrapper 2663 i0 P; r+ |: m" [: \
- 8.3.5 升级Gradle Wrapper 267
# A% a6 {3 L7 z$ X, S5 A: x2 k% K6 e - 8.3.6 自定义Gradle Wrapper 268
% ^/ D$ c4 L I" Y0 g2 ^ - 8.4 Gradle插件基础 268
' L# f& M" @' V X - 8.4.1 Gradle插件概述 268
7 ^8 }% I" ]2 V8 Q - 8.4.2 应用Gradle插件 2706 V& w' q+ |) S& S/ e: q
- 8.4.3 插件DSL 272
c2 a0 S( v/ n7 _8 q2 G - 8.4.4 自定义对象插件 273
1 A$ [" I' _) R - 8.4.5 Gradle插件的作用和优点 274. ~3 o8 v% d. M5 D
- 8.5 自定义Gradle插件 2746 O" Q. f1 b" q6 S# U7 E
- 8.5.1 在build.gradle中编写 275" C" `) g9 z" V
- 8.5.2 在buildSrc工程项目中编写 277% i! k5 B9 [" ]8 `& t+ X
- 8.5.3 在独立项目中编写 278& ~, C0 J* u. z* f/ ?5 s! y
- 8.6 本章小结 2818 D1 F* t8 v- Q: ~9 S! s
- 第9章 Gradle的Android插件 282
% T8 Y5 X. X) S- e9 F$ l - 9.1 什么是Gradle的Android插件 2829 [$ \$ Q5 g5 G, g+ r8 I
- 9.2 Android Studio的模块类型和项目视图 283
/ k; c0 L3 ~1 Y% T4 w7 T - 9.3 项目build.gradle 2842 N& @! ^' N& k1 b
- 9.4 模块build.gradle 285
" M/ y( ^5 X2 m7 s. F* l - 9.4.1 Gradle的Android插件类型 286
; m; i) s' o7 t - 9.4.2 Android块 2864 A- u5 k. t6 C- l( S X, {. Y4 b
- 9.4.3 dependencies块 2917 R j$ y3 a$ s8 x$ I
- 9.5 Android签名文件配置 2924 x6 |5 S% i8 v
- 9.5.1 自定义签名信息文件 2929 E5 A1 f6 e) T! C; W( A+ S. d
- 9.5.2 本地添加签名信息文件 293! [5 Q' K0 j7 Y4 E7 U0 o2 ~
- 9.6 Gradle的库依赖 294
1 i6 I: j: s" {$ ? - 9.7 Gradle的库依赖管理 2955 w) ^0 L% u! P/ W
- 9.7.1 Gradle的依赖传递 296
, G: E3 m& F3 ]3 i) I' a - 9.7.2 Gradle的依赖检查 296
# H" C5 z% L' A2 k; h/ F - 9.7.3 Gradle的依赖冲突 2999 J' u1 b" W0 @' ~! ]1 d* W
- 9.8 本章小结 301
3 [. ?; y8 q% }$ b - 第10章 Android Jetpack架构组件 302
" T1 _* M: F. ~' N3 q, r& k. J, q - 10.1 Android Jetpack简介 303
% |- h' ~3 ~5 `, y- w - 10.2 Android Jetpack分类 303
* n& b j H# E5 | - 10.2.1 Architecture 304
/ }8 W$ I& t# ^& @8 a - 10.2.2 Foundationy 305% E4 A2 f N1 |0 G' O8 x. B
- 10.2.3 Behavior 306
2 N1 h# m& {3 I( h' D, L - 10.2.4 UI 3072 H& _6 V3 X+ w! u) C M
- 10.3 在应用中引入Jetpack相关组件 307
( i* @2 c) @$ A7 ]* G; ^+ C* g D - 10.4 使用Lifecycle 307
% o# u0 N8 y8 v$ O; o+ u" e - 10.4.1 为什么需要Lifecycle 307
/ \" z ?# g8 t) V8 | - 10.4.2 如何使用Lifecycle 3093 N" G4 P4 o. t! R' k
- 10.4.3 Lifecycle应用举例 312
! B9 Z3 r5 d- b* `: x - 10.4.4 自定义LifecycleOwner 315+ W% {1 J& X+ w* A8 l
- 10.5 Lifecycle的原理 316" z- ^8 P2 C: V# }2 `
- 10.5.1 Lifecycle的生命周期状态事件和状态 316 W( _: \& `' t& L- _* p
- 10.5.2 Lifecycle如何观察Activity和Fragment的生命周期 317
Z# p/ A7 o* a- i& o6 D - 10.5.3 Lifecycle关联类 327# `5 ]1 p0 j; E2 c
- 10.6 使用LiveData 328
- @ ?( C3 C& `* C' H% R: j - 10.6.1 什么是LiveData 328( d, }! ]; F9 [' K) u* F
- 10.6.2 LiveData的基本用法 3295 R' U* e2 b/ x ^3 i
- 10.6.3 更改LiveData中的数据 330
$ g. c: Q' t% e" A - 10.6.4 合并多个LiveData数据源 332
7 Q1 {/ f! t" O0 |# u! { - 10.6.5 拓展LiveData对象 333( u3 K4 a4 R5 X% v( o/ b2 g$ g! w
- 10.7 LiveData的原理 335
( W! J4 X5 A, n2 e6 } - 10.7.1 LiveData如何观察组件生命周期变化 335( _. `7 i6 ~0 g5 r
- 10.7.2 LiveData的observe方法回调 3368 [: b6 R; I* }3 Q: [! X+ f
- 10.7.3 postValue/setValue方法分析 339
+ v+ S% D% |* R' k, r - 10.7.4 Transformations.map方法分析 341
8 X; l( m; h9 i) ]5 p0 v {$ L( d0 T - 10.7.5 LiveData关联类 343
0 k+ d7 _3 j$ d7 x2 H+ e! f - 10.8 使用ViewModel 344$ f* q/ t+ A; V2 U) m. Z5 k( y
- 10.8.1 什么是ViewModel 345
0 a5 ?$ e0 s1 p1 q- Y - 10.8.2 ViewModel的基本使用方法 345
/ E O/ p: _6 e- n) p - 10.8.3 ViewModel的生命周期 347) e3 H% T5 L5 R2 O- r9 f; _
- 10.9 ViewModel的原理 3480 k' z2 }7 Q: i$ H
- 10.10 本章小结 351$ f R# A1 r7 v/ {
- 第11章 跨平台技术演进 3524 c) Q' B' h4 Z" I5 e# J
- 11.1 Web App 353
) W e" d* b2 m0 j1 T' o - 11.2 Hybrid App 353
2 n$ y7 n- v% c) q: s - 11.2.1 Cordova 354
0 Y8 [$ V/ a( F2 r0 M5 e - 11.2.2 Ionic 3558 {5 S9 n6 y: v( m- X5 d
- 11.2.3 VasSonic 355
( P& J% q( t' ^& B: F - 11.2.4 微信小程序 356 O6 W. ] i9 R4 \* a( d
- 11.3 语言编译转换 357
. |' M& \" ?9 m# _# H$ s - 11.4 原生渲染 358; w; O K' S* a) @% g4 ]: P& n7 b
- 11.4.1 React Native 3582 N/ s% G( o& }! P/ ?% S
- 11.4.2 Weex 358
1 d( T, |! M) m* S. G - 11.4.3 快应用 359
9 t+ P. y# _# ]# N - 11.5 自绘UI 360, B3 z# T8 F! T( h
- 11.5.1 Qt 360& P/ ^ T$ Z c: Z2 A
- 11.5.2 Flutter 361
" D+ Z( s1 x; H% a- | - 11.6 本章小结 362- E+ o t8 L" e5 f' I1 b# {; x1 v
- 第12章 Dart基础 363/ R' |! B3 z9 U: ~4 l) x8 }
- 12.1 Dart开发环境搭建 3638 p$ J- ~9 l) i8 a9 v8 g
- 12.2 Dart概述 3645 T# V% a$ R( t, |0 X
- 12.3 Dart的特性和重要概念 365
; T5 ?8 j6 t! }$ E, @ - 12.4 Dart关键字 3663 c- Z; T# v% |) ^( k
- 12.5 变量 3674 Y* J- f$ g& n P8 C
- 12.6 基本数据类型 367+ E6 }) n. r( n% X" x
- 12.6.1 Number 367
: U$ W( G: \8 L3 F1 t p - 12.6.2 String 368- U! m0 u' p7 v: M* K
- 12.6.3 Boolean 368) F8 Q$ ]3 T: Y. _/ I
- 12.6.4 List 368
1 S# z e3 w2 r! X& m& R - 12.6.5 Set 369
! D6 u9 Y' K2 K% x. o - 12.6.6 Map 369+ W' |4 S! V7 e4 o
- 12.7 函数 3699 h5 a/ y0 {8 `3 S% m/ ]
- 12.7.1 可选参数 3702 N) V% ^' S: y3 S% J) q% ^
- 12.7.2 默认参数值 370
; \5 x& ?. a8 j H! T% r$ t - 12.7.3 main函数 371
- d8 _ [: j, v! y - 12.7.4 匿名函数 371
/ g( v7 u. j K+ G9 d - 12.8 流程控制语句 371. {+ Z+ }! H% o8 B" f1 T) [
- 12.8.1 for循环 3720 p* Z# p, D, ]3 L& V, ^1 t @
- 12.8.2 switch和case 3727 P, l1 L& r- A" |
- 12.9 捕获异常 3731 B2 m- S8 V/ N5 X/ w; [
- 12.10 为类添加新的功能 373
0 R6 F1 ~ \+ L2 V9 X, m& ]$ H1 ] - 12.11 库的使用方法 374. ?3 t3 C# {& T+ c3 X8 G4 b
- 12.12 异步支持 375' e' _. t8 d" I* w; F3 M& M" g
- 12.13 使类可调用 376
- y9 s. N- E+ s - 12.14 创建实例 3760 Y5 s0 V8 o6 ?- J( n' O3 P
- 12.15 本章小结 376! v1 ]" Y) B$ q" a0 H1 Y' u
- 第13章 Flutter基础 377$ e3 G2 c) {- N- q2 g- Q7 Y" ]3 c
- 13.1 Flutter开发环境搭建和Hello World 3772 {( L! J' S% D$ n$ D- `# }+ i
- 13.1.1 Flutter概述 378$ a: }1 [' p2 c5 M& W4 J" v7 ?! x+ D% {
- 13.1.2 Flutter开发环境搭建 378
2 P) u* A3 ]" z5 C/ A - 13.1.3 运行一个Flutter Demo 383: c D6 ?! ` {- J
- 13.1.4 Hello World 385
9 ]! m/ C! w/ I- P - 13.2 Widget基础 386& Z+ _7 I5 D, d& E2 J W( V
- 13.2.1 Widget概述 387
3 U" o8 r& W i/ } - 13.2.2 Widget的分类 387
8 L- L9 d7 D7 W7 ?/ D- s8 V - 13.2.3 Widget的状态分类 3885 G# J0 _( M! D! P4 }
- 13.2.4 根Widget的种类 3888 P0 z6 m5 K7 V3 T
- 13.3 Basic Widget 389. N) T9 H# I/ `. d4 i
- 13.3.1 代码模板和主题 389
" f* h8 \9 p8 J - 13.3.2 文本 390# Q, K2 S- M& Y; N* k3 l
- 13.3.3 图片 391
- ]* O" l0 e5 ^ - 13.3.4 凸起按钮 394& Z+ X! c5 @: V9 x4 `# H$ @
- 13.3.5 其他Widget 395" T+ Q8 k/ E; y
- 13.4 Material组件 397' R! i q. P( Z
- 13.4.1 MaterialApp 398
9 E4 o9 |+ Y2 k+ d - 13.4.2 Scaffold 401
* q' {3 @6 S' D) e8 a2 ? - 13.4.3 AppBar 403* j" S( Y. n. K; @
- 13.4.4 BottomNavigationBar 405' Z" r! N1 D- {$ H+ e
- 13.4.5 TabBar 407
5 d" e. N: _3 y$ a# X- o1 j - 13.4.6 Drawer 411
- q6 d0 i s( A, p' [" J - 13.5 Scrolling Widget 413
: I* ]- m6 t4 A' c - 13.5.1 ListView 413 C) W$ b8 P% S. ]" d% e3 @
- 13.5.2 GridView 418
+ d5 d: `# g1 M" U - 13.5.3 PageView 419( y; s) f. ?' ^
- 13.6 手势相关Widget 421
- K# j- N% R- z& m$ x7 h0 \ - 13.6.1 指针事件 421. G3 L' b% j2 S6 c4 ?0 A0 j/ W
- 13.6.2 手势 422
# H* G7 ^5 t7 u - 13.6.3 使用GestureDetector 423
2 r2 G8 m8 @7 L4 Y, {4 n* ^ - 13.6.4 使用Dismissible 424
6 m6 ~1 S: K W" ` - 13.7 资源和图片 426
. K- I+ u$ X( X - 13.7.1 指定asset 426
6 t4 R$ @) e N& a Y( F - 13.7.2 加载文本 4277 U6 ^; z- D3 h
- 13.7.3 加载图片 4300 B1 G, X! o+ j! ~
- 13.8 布局Widget 433
) z- U3 `! ?' @/ p! w0 I - 13.8.1 线性布局Widget 433 C6 H9 Q* ~& O- O U; r; S$ r
- 13.8.2 流式布局Widget 434
% h6 q4 M2 ~/ n% E1 v1 i: s - 13.8.3 层式布局Widget 436
; m$ p4 Y3 t2 W* B0 I o5 d0 Q% J- b - 13.8.4 弹性布局Widget 438+ \# ^- i6 V0 q9 F5 V7 R- _
- 13.9 网络请求库Dio 4406 J4 D; o. y; y- Z( x; g$ T
- 13.9.1 Dio的使用入门 440
/ _. J* ~; ?8 q# x* } - 13.9.2 Dio访问网络 441
1 `. R6 R) L2 |4 W- y5 M* [ - 13.10 JSON数据解析 443 f- P6 J# A) V7 p$ H
- 13.10.1 使用json.decode方法 443
5 Q7 g% N+ r0 N$ \5 U( T - 13.10.2 手动编写实体类 444- T$ u0 U" W' Z; L o
- 13.10.3 自动生成实体类 445( l& c; [) D$ J+ N4 H
- 13.11 路由与数据传递 447: ^* i7 Q3 N& J# `+ j
- 13.11.1 新建路由 447
k. e; T9 g# i - 13.11.2 使用注册路由 450
& X8 X h3 ^( g9 f - 13.11.3 路由间数据传递 451
" w8 a0 Y+ _. X& E+ j9 p; I - 13.12 Flutter与Android的相互通信 456% P9 z% M( _1 c Q
- 13.12.1 PlatformChannel概述 456+ G) `3 B/ [2 G5 E. e
- 13.12.2 Flutter调用Android 458
* j, Q1 W D5 `# H# N2 O - 13.12.3 Android调用Flutter 46113.13 本章小结 465
$ J) ^# H8 I+ d9 p1 L
下载地址:
- n" U; I3 a. d$ |3 |3 o# e; i0 u% \ g0 D- x/ Q C7 e
) O0 F% J6 u* `( c$ x3 W* G侵权联系与免责声明1、本站资源所有言论和图片纯属用户个人意见,与本论坛立场无关+ {% ]' \* o$ h+ D' R0 r
2、本站所有资源收集于互联网,由用户分享,该帖子作者与瑞客论坛不享有任何版权,如有侵权请联系本站删除
& i7 O% M% a0 G. ]% l3、本站部分内容转载自其它网站,但并不代表本站赞同其观点和对其真实性负责
; f" ^' P ^ X8 m. t' t" i! ?8 A: F4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意/ ^) Q& `8 X" _" H
如有侵权联系邮箱:ruikelink@gmai.com
5 ]! D: n" p) Z* W% ~资源下载地址和密码(百度云盘): [/hide] 百度网盘信息回帖可见8 l9 Q- {, x9 ^4 U# o. t
% f; Q. f& F2 G3 N% I$ J; j$ F
: A- L1 o- O% i8 h) v0 H
8 l, |8 i2 E9 Z* [7 o2 b本资源由Java自学网收集整理【www.javazx.com】 |