第1章 引言 1
1.1欢迎来到移动设备软件工程 1
1.2成功由几个关键因素决定 3
1.3如何阅读本书 4
1.4设备开发方法 4
1.4.1基于服务器的移动设备应用 4
1.4.2智能客户端移动应用 6
1.5托管代码 8
.NetCompactFramework——一种在设备上使用的托管代码运行时间 10
1.6总结 12
第2章 移动应用的特征 13
2.1引言 13
2.2应用模式 13
2.2.1长持续时间活动vs短持续时间活动 14
2.2.2探索性活动vs集中活动 15
2.3外形因素 17
2.4可靠性需求 19
2.5移动应用的重要特征 21
2.5.1启动时间 21
2.5.2响应 21
2.5.3用途明确 21
2.5.4定制与设备外的数据源的交互 22
2.5.5持续体验 22
2.6计算机架构的区别 23
2.7小结 24
第3章 .NetCompactFramework的设计 25
3.1引言 25
3.2设计.NetCompactFramework 26
3.3桌面子集 29
3.4托管代码和本机代码 30
3.5执行引擎 30
3.6托管代码库 31
3.6.1基础类库 32
3.6.2用户界面库 32
3.6.3 WebServices客户端库 33
3.6.4 XML库 33
3.6.5数据访问库 34
3.7将有用的设计和调试信息转移到可选构件 35
3.8 SQLCE/SQLConnectors 36
3.9未包含在.net紧凑架构第一个版本中的项目 37
3.9.1安全检查 37
3.9.2多媒体 38
3.10代码如何被执行和运行 38
3.11内存管理和垃圾收集 39
内存管理和垃圾回收的预演 41
3.12小结 47
4.1引言 48
第4章 如何成功开发移动应用 48
4.2软件工程中固有的和暂时的困难 49
4.2.1暂时的困难和解决工具 49
4.2.2固有的困难和解决的方法论 50
4.3开发是一个迭代过程,但是有一定的规则 53
4.3.1项目说明文档 54
4.3.2计划迭代 55
4.4如果整体构思还没有完成,就不要考虑细节 55
4.5按正确的顺序解决问题:如果需要的话就走回头路 55
4.5.1步骤0:在开始之前,确定你应用的范围 56
4.5.2步骤1:开始于性能,并保持性能 58
4.5.3步骤2:设计恰当的用户界面 61
4.5.4步骤3:使用正确的数据和内存模型 62
4.5.5步骤4:使用正确的通信和输入输出模型 64
4.5.6如果需要,返回到步骤0、1、2和3 68
4.5.7步骤5:打包你的应用进行安装 69
4.6小结 70
第5章 状态机,我们的朋友 72
5.1介绍 73
5.2什么是状态机 73
5.3隐式的和显式的状态机 77
5.3.1方法1:一种随意的、分散的、隐式的状态管理方法(糟糕的设计) 77
5.3.2方法2:一种计划的、集中的、显式的状态管理方法(好的设计) 78
5.4一个应用中应该有多少状态机 80
5.4.1用户界面的状态机 81
5.4.2内存模型的状态机 82
5.4.3后台处理的状态机 84
5.4.4游戏内部的状态机 93
5.5小结 93
第6章 第0步:开始之前, 94
确定你应用的范围 94
6.1介绍 94
6.2.2设备上的相关应用组 95
6.2独立系统还是一个大系统的一部分 95
6.2.1独立的应用 95
6.2.3与台式机或者服务器应用交互的设备应用 96
6.3不要固守桌面应用的思路!思考移动设备! 96
移动软件使用模式VS.桌面软件 97
6.4定义移动应用的步骤 98
第7章 第1步:从性能开始, 100
保持性能 100
7.1介绍 100
7.2规范的方法的重要性 101
7.2.1定义有价值的用户场景 101
7.2.2使用带有性能驱动退出准则的软件开发里程碑 102
7.2.3执行代码检查 104
7.2.4定义应用的内存模型 104
7.2.5经常而且不断地测量 105
7.2.6可以使用的测量工具 107
7.2.7使用实际数据的尺寸测试 110
7.2.8压力测试你的应用 111
7.2.9绝不推迟性能工作(它总是会变得更坏!) 111
7.3定义性能目标 113
7.3.1所有的性能都是主观的 114
7.3.2及时的用户响应 114
7.3.3最大等待光标时间 118
7.3.4最大数据载入/保存时间、启动时间和关闭时间 118
7.4运行时异常的代价 119
产生和不产生异常的相同算法对比实例 119
7.5小结 126
第8章 性能和内存管理 127
8.1定义应用的内存模型 127
8.2宏观“应用级别”内存管理 128
8.2.1管理一个应用的“系统开销”数据 132
8.2.2管理内存中的大量用户数据 134
8.2.3使用一个请求性载入模型 135
8.3微观“算法级别”内存管理 141
8.3.1编写环境算法:不能乱丢废物! 142
8.3.2编写环境算法:减少、重复使用以及回收 143
8.3.3在任何可能的情况下重复使用分配的对象 147
8.3.4减少不必要的对象分配 151
8.3.5上面所做的连续优化的分析 155
8.4特别关注算法中String的应用 156
显示如何有效构建字符串的一个例子 158
8.5小结 161
第9章 性能和多线程 163
9.1介绍:什么时候,如何使用后台线程 163
9.2现代操作系统中的多任务和多线程 164
9.3什么时候使用后台线程 167
9.4.4在简单情况下,考虑用等待光标等方法取代多线程 168
9.4.2设计最大可响应性的用户界面 168
9.4.3从一个单独线程应用设计开始 168
9.4.1使你的用户界面有一个主线程 168
9.4在移动应用中使用线程的设计指南 168
9.4.5如果延时较长或者不确定考虑使用后台线程 169
9.4.6设计简单化的线程代码和安全文档 169
9.4.7考虑工作能被预先完成的情况 170
9.5可能用到的示例代码——采用后台线程完成一个简单工作 171
9.6线程和用户界面 179
使用后台线程处理用户界面更新的实例 180
9.7小结 190
第10章 性能和XML 192
10.1介绍:使用XML 192
10.2使用还是不使用XML? 193
10.3 XML与其他文本格式的比较 194
10.3.1把数据作为文本存储的不同方法 195
10.4使用XML的各种不同方法 196
10.3.3其他的XML特性 196
10.3.2 XML数据具有层次性 196
10.5一个简单的示例:使用XMLDOM和XMLReader/Writer 197
10.5.1实例:XML文件内容 198
10.5.2 XMLDOM 198
10.5.3 XML只前Reader/Writer 204
10.6通过将工作移交来提高性能 214
10.6.1避免在设备上做复杂的数据转换工作 214
10.6.2避免在设备上做复杂的数据搜索工作 214
10.6.3在数据被传送到设备之前考虑清除不必要的信息 215
10.6.4何时不把工作移交给服务器 215
10.7小结 216
第11章 图形和用户界面性能 218
11.1介绍 218
11.2用户界面代码的性能设计策略 220
11.2.1使用内部性能特性 220
11.2.2实例:操作TreeView控件的不同方法的性能差异 221
11.2.3用将要显示的实际的元素数量测试你的应用 228
11.2.4推迟是好的!推迟,推迟,推迟 228
11.2.5对事件驱动代码进行仔细的观察 236
11.2.6绝不让用户猜测 243
11.3选择合适的位图格式和尺寸 246
11.3.1尺寸很重要 247
11.3.2太多的文件格式,太少的时间 249
11.3.3如果移动设备是高分辨率图像源,该怎样做? 250
11.4制图代码的设计策略 251
11.4.1将用户界面代码与图形集成的方法 253
11.4.2考虑在哪里完成你的绘画,在屏幕上或在屏幕外 265
11.4.3定义呈现过程 266
11.4.4拖延是坏的事情,尽可能事先推测每一件事情 268
11.4.5缓存公用的资源 272
11.4.6为重复或连续绘制寻找避免对象分配的方法 276
11.5小结 278
第12章 性能总结 280
12.1性能总结 280
12.2性能和内存管理总结 280
12.3性能和多线程 283
12.4性能和API抽象层 284
12.5性能和用户界面与图形 284
12.6发现和注意性能报警标志 285
12.7结论和好的实践方法 286
第13章 第2步:设计正确的用户界面 288
13.1考虑设备! 288
13.1.1一种尺寸不适合全部 289
13.1.2单手还是双手? 291
13.1.3屏幕空间越小,导航就越重要 292
13.1.4列表或分页? 293
13.1.5移动电话用户界面和连贯单击通过的重要性 294
13.1.6触屏和大按钮的重要性 294
13.1.8对于自动的输入机制保证有冗余的人工输入存在 296
13.1.7为普通数据输入进行优化 296
13.1.9仿真程序和物理设备测试 297
13.2设计你的移动用户界面 299
代码以进行容易的测试和迭代 299
13.3用于用户界面布局和管理的状态模型 301
13.3.1实例代码——为相同的应用使用两个不同的布局模型 304
13.3.2控件布局 315
13.3.3空间是昂贵的 315
13.4 .NETCompactFramework中的高级用户界面 317
13.4.1动态创建控件 317
13.4.2用户控件和重定义现存控件的行为 321
13.4.3使用透明位图区域 329
13.4.4在应用中嵌入图像作为资源 335
13.5小结 338
14.1介绍移动应用数据访问 341
第14章 第3步:使用正确的数据访问模型 341
14.2为数据的内存存储选择合适的抽象 342
14.3为数据选择正确的长期储存模型 344
14.4 NETCompactFramework细节:ADO.NET 346
14.4.1 ADO.NETDataSet最基本的部分 346
14.4.2使用ADO.NET的两种模型 351
14.4.3储存长期数据的选项 385
14.4.4 SQLCE 387
14.5小结 391
第15章 第4步:获得正确的通信模型 393
15.1移动应用通信介绍 393
15.2编写移动网络代码 394
15.2.1不要构建一个依赖通信的应用 396
15.2.2不要因为任何延迟的时间阻碍你的用户界面线程 399
15.2.3在适合你需要的最高抽象层工作 401
15.2.4总是期望失败 401
15.2.5模拟通信失败来测试应用的健壮性 407
15.2.6保证数据同步过程对用户透明 409
15.2.7假设数据传输率和反应时间会变化 410
15.2.8在你的设计中尽早实现所需要的通信安全 410
15.3通信和网络选择 411
15.3.1 Wi-Fi:本地区域网络 411
15.3.2 Bluetooth(蓝牙):个人区域网络 413
15.3.3移动电话网络/移动电话 415
15.3.4支架/PC电缆 419
15.3.5网络电缆 420
15.3.6 IrDA 421
15.3.7内存卡 438
15.4把信息压到设备中 438
15.5 Webservices 441
15.5.1 Webservices简单描述 442
15.5.2从移动设备中调用Webservices 443
15.5.3移动设备使用Webservices时的挑战 446
15.6小结 456
16.1引言 459
第16章 第5步:打包和部署移动应用 459
16.2你的移动应用需要签名吗? 460
16.3安装运行时间以及其他需求的元件 462
16.3.1对移动设备运行时间的动态部署 462
16.3.2动态安装需要的应用构件 463
16.4打包和安装选择 464
16.4.1拷贝,运行/下载和运行 464
16.4.2设备驱动的安装 464
16.4.3台式计算机驱动的安装 464
16.4.4通过储存卡的安装 465
16.4.5基于开发人员工具的安装 465
16.4.6基于ROM的安装 465
16.5小结 466
第17章 结束语 467
附录A .NETCompactFramework的其他资源 470
附录B VisualBasic.NET示例 474