[本文尚未完成]
网络上很多Android教程,但过于侧重基础知识,研发经验不足的初学者看完后很难建立起系统性的概念,特写本文给新人们培训用。本文非入门型文档,无意识的忽略了很多Android基础知识,建议具备一些Android的基础知识后阅读。
期望的特性
- 支持设备自适应
- Android各组件形成标准使用模式
- 支持模块化开发与管理
设备自适应:
使用Android提供的无关性单位
单位 | 范围 |
---|---|
dp | 设备无关的像素描述,用于代替px(像素) |
sp | 设备无关的文字描述,用于代替pt |
Activity、Fragment、Layout组合运用
Android各组件使用模式
先给出一张架构图,来描述Android开发需要的模块架构,然后再分析Android各组件适合使用的位置。架构图如下:
说明
- UI完成用户交互,其只能与Service交互
- Service负责调用具体模块的功能,并将处理结果反馈给UI
- BaseComponent是功能逻辑的实现
- 全部通过Interface进行调用,松耦合
UI界面
UI部分需要实现所有的界面逻辑,使用的组件组要为Activity、Fragment、Layout、Toast等等。
UI部分的工作主要有三部分:
- 构建BaseActivity 封装所有通用的Activity功能,作为所有Activity的基类
- Activity、Fragment、Layout构建自适应布局方案
- Layout的定制开发(很多情况下Layout是需要根据项目需要进行定制开发的)
- 界面数据的保存与恢复(与Android的生命周期概念密切相关)
这里特别需要注意生命周期、生存期、数据保存与恢复这几个概念,理解透彻之后才能对UI开发得心应手
Fragment和Activity的生命周期对照表
Activity | Fragment | 说明 |
---|---|---|
onAttach | Fragment和Activity建立关系时调用 | |
onCreate | onCreate | |
onCreateView | 为Fragment加载Layout时调用 | |
onCreate | onActivityCreated | 当Activity中的onCreate方法执行完后调用 |
onStart | onStart | |
onResume | onResume | |
onPause | onPause | |
onStop | onStop | |
onDestroyView | fragment的布局移除时调用 | |
onDestroy | onDestroy | |
onDetach | fragment和Activity解除关系时调用 |
生存期 | 范围 |
---|---|
完整生存期 | onCreate ~onDestroy |
可见生存期 | onStart ~ onStop |
前台生存期 | onResume ~ onPause |
lunchMode | 效果 |
---|---|
Standard(default) | 每次都会创建一个新的Activity |
SingleTop | 如果Activity在顶部则不再创建(反之就会创建) |
SingleTask | 整个BackStack中只有一份,如果调用startActivity则会将其之上的Activity全部弹出BackStack |
SingleInstance | 最复杂的模式,单开一个Backstack(多App共享Activity的模式下可以使用) |
Service后台服务
Service是Android后台最重要的部分,UI中的Activity、Fragment等等只能与Service进行交互,再由Service与其他组件完成交互(如db、content provider等等)。特别注意一点,每一个Service都应该是单例。
在Service部分主要完成两件事:
- 确定与Activity的交互模型(ServiceConnection、IBinder),这部分工作可以形成标准模板
- 组织BaseComponent完成业务逻辑
在编写Demo的时候也可以把BaseComponent的功能放入Service中,但强烈不建议在UI中实现BaseComponent的功能。
Base Component基础组件
Base Component部分会涵盖除了UI和Service之外的其他所有所有组件,包括DataPersistence、ContentProvider、Notification、Boardcast等等。
DataPersistence
ComtentProvider
Notification
提示信息使用,配合PendingIntent可以响应用户的点击操作
Boardcast
Boardcast按作用域可以分为两种类型:
type | Influence |
---|---|
LocalBoardcast | 只在本App中有效 |
GlobalBoardcast | 在整个Android平台都有效 |
LocalBoardcast与GlobalBoardcast可以被封装到BaseActivity中
Boardcast按特性分可以分为:
type | Influence |
---|---|
Normal Broadcast | 类似UDP,接收顺序不固定 |
Ordered Broadcast | 类似TCP,可以设定priority,可以在onReceive中调用abortBroadcast()打断本次广播 |
对于Boardcast完全可以封装在BaseActivity中,作为项目组开发框架的一部分。
模块化开发
当前google已经在推广Android Studio,其基于IntelliJ 的免费版进行定制开发,各方面与Eclipse的提升不是一点半点,强烈推荐使用
Android Studio中使用gradle作为构建、依赖管理工具,其特性与maven很相似,具备maven基础则可以5分钟内上手。
关于maven的基础知识可以参考另一篇的 maven综合实践
基础模块库
基础模块基本都是可复用的service、代码片段、配置项等等,这是我们开发过程中需要积累的重要过程资产,比如:
- 基础gradle配置项
- Activity与Fragment进行设备自适应的标准代码
- BaseActivity构建(提供一键关闭、两次按键退出、全局context、自动注销服务、自动注销广播等等)
- Service与Activity通信的标准代码
- Service HTTP标准代码(Android 4.0后http库产生了变化)
- 通用的升级检测、下载模块
- 对象持久化标准库
- XML、JSON标准库、标准代码
- 。。。
个人认为:基础模块库有多强大,团队战斗力就有多强大
具体项目
具体项目都是根据需求来的,无法笼统的给出解决办法,但可以确定的一条准则是:- 提炼通用型的需求并将其合并入基础模块库
- 具体项目一定要专注于BL设计、UI设计
- 对具体项目进行开发的同时一定要同步推进基础模块库的进化
当一个团队具备了很强大、完善的Android基础模块库,具体项目的开发就会得心应手
给新人的Best Practice
- Activity和Fragment中只有UI逻辑,作为显示载体
- Activity和Fragment组合使用,配合尺寸和单位,使满足设备无关要求
- 这里的工作为多研究layout的使用,完成UI设计
- Service封装业务逻辑,负责调用更底层的功能
- 依靠ServiceConnection、IBinder与Activity进行交互
- 一个应用中应该包含很多Service
- 适当运用前台服务(setForeground)
- bindService与unbindService要成对出现
- 这里的工作多为项目组基础积累,多封装基本功能
- 每个Activity、Fragment都要考虑好数据的保存与加载(onSaveInstanceStatce)
- Content Provider 在一般中小型App中主要用于 获取系统数据,很少会作为数据提供方,新人做到会读即可
- Notification 作为交互的手段,向用户提示信息(附带震动、声音、led闪烁等等效果),并可以接受点击(使用PendingIntent)
- Broadcast 的标准化应用
- 捕获系统事件,比如网络连接、断开
- App内部通讯使用
- 为了安全,尽可能使用LocalBroadcast,GlobalBroadcast主要用来接收系统广播
- 一定要建立基础库与具体项目的概念(熟悉gradle)
- 基础库大多为标准service、代码库等等,在日常开发中要养成不断积累的习惯,这样才能提高开发效率
- 具体项目为目标项目,其工作重心更多为UI设计、BL设计
总结
个人认为,对于绝大多数的Android应用,其核心思想是做有创意的应用,工作量集中于各种形式的UI设计。
脚注
生成一个脚注1.
- 这里是 脚注 的 内容. ↩