Android框架式编程之Android Architecture Components
1. 当前Android开发面临的问题
Android开发不同于传统的桌面程序开发,桌面程序一般都有唯一的快捷方式入口,并且常作为单进程存在;而一个典型的Android应用通常由多个应用组件构成,包括不同数量的Activity、Fragment、Service、Content Provider、Broadcast Receiver等。
此外,用户在移动设备上常常会在多个App之间切换。例如,如果用户想要在一个社交应用上分享一张图片,那么一般的流程是首先该社交应用可能会使用Intent的方式通过Android系统来启动一个拍照应用,此时用户虽然离开了社交App,但其体验是无缝衔接的。同样地,拍照应用也可能启动其他应用,如文件选择器或其他。最终用户返回社交应用然后分享图片。当然,用户操作可能在上述过程中的任何时刻被电话打断,当通话结束再继续进行图片分享流程。
在Android系统中类似的应用切换非常频繁,因此需要使得我们的应用能够正确处理上述流程。而且移动设备的资源是有限的,所以在任何时候,操作系统都有可能杀死一些应用来为一些新的应用腾出资源。
综上,我们的应用组件可能被无规则地启动,也可能随时被用户或系统销毁,其生命周期并不由我们控制,因此我们不应该在应用组件中存储任何数据而且组件之间也不应该互相依赖。这时候,我们就需要重新考虑如何设计Android应用的架构了。
2. Android 应用架构设计原则
在设计Android应用架构的时候,我们需要考虑以下两个设计原则:
第一,职责分离。我们不应该把任何跟UI处理或系统交互无关的代码写到Activity或Fragment中,而是尽可能保持Activity和Fragment的简洁(职责单一化),这样可以避免许多生命周期相关的问题。因为我们并不能控制这些类,所以我们应该最小化对App组件的依赖从而提供稳定的用户体验。
第二,数据模型(Model)驱动UI,最好是可持久化的数据模型。持久化数据不仅可以保证当系统为了释放资源而销毁掉App时用户不会丢失数据,而且当网络状况差或无网络时App依然可以工作。Model也可以看成一种处理应用数据的组件,它们独立于视图和其他App组件,因此Model不存在和生命周期相关的问题。
3. Android Architecture Componets
在介绍Android Architecture Components之前,先简单的讲一下Android常见架构的变迁:
- 无架构模式 --> MVC:实现了逻辑与界面的分层开发,显著提升了可测试性,实现了数据隔离&关注点隔离。
- MVC --> MVP:面向接口编程,将逻辑从 UI 组件(Activity、Fragment)转移到 P 层,进一步提升可测试性。
在MVP中,将逻辑转移到P层,这样更合理。因为UI 组件是连接用户和OS的那一层,并不完全属于开发者本身,会受到系统的影响,比如配置的更改、内存不足重启等等,所以尽量保证 UI 组件整洁,才会提升代码的可测试性和稳健性。
无论是 MVC MVP MVVM 它们存在什么问题呢?
他们的模块通信方式,始终是持有对象(或接口)。对于 Android 系统来说,每一个你在 Manifest 声明的四大组件都有可能会突然死掉,这也造成了:
- 持有对象可能会有 NPE
- 会有可能内存泄漏
- 会写很多生命周期相关的模板代码
为了掩盖或解决以上种种问题,Android Architecture Components 架构就应运而生了,Android Architecture Components 架构包括了一系列组件,比如 LifeCycle、Room、LiveData、ViewModel、Paging 等等。
4. Android Jetpack
讲到 Android Architecture Components 不得不提 Android Jetpack,Jetpack就是Android官方提供的一个组件集合,它可以帮助我们加快 Android 开发速度,消除模板代码。这个集合可以分为四大类:

(1) 基础组件:提供核心的系统功能、Kotlin扩展以及对Multidex和自动化测试的支持。
(2) 架构组件:帮助实现生命周期管理、数据持久化等工作。
(3) 行为组件:帮助开发者构建稳定、易于测试和维护的应用程序。
(4) UI组件:帮助开发者构建的应用程序拥有更好的用户体验。
Jetpack是以“未捆绑”的库形式提供的,这些类库不属于基础Android平台的一部分,因此我们可以根据自己的需求使用和更新每一个组件,独立于任何特定的Android版本提供功能,从而实现向后兼容。相关的组件库包括:Lifecycle、LiveData、ViewModel、Room。
5. 推荐资料
1. Android Jetpack:https://developer.android.google.cn/jetpack/
2. Room:Android框架式编程之Room
3. ViewModel:https://www.jianshu.com/p/0987bd15b235
4. Lifecycle:https://www.jianshu.com/p/52b87ed17be0
5. LiveData:https://www.jianshu.com/p/95726843eb29
6. Android Architecture Components:https://www.jianshu.com/p/87a0332e5dec
Android框架式编程之Android Architecture Components的更多相关文章
- Android框架式编程之BufferKnife
		配置 compile 'com.jakewharton:butterknife:(insert latest version)' annotationProcessor 'com.jakewharto ... 
- Android框架式编程之Lifecycle
		Lifecycle官方文档地址:https://developer.android.com/topic/libraries/architecture/lifecycle. 一.为什么要使用Lifecy ... 
- Android框架式编程之Room
		Room是Google官方出品的ORM(Object-relational mapping) 框架.当前我们也知道当前还有很多的ORM框架,例如GreenDao.OrmLite.Litepal等.目前 ... 
- Android框架式编程之Retrofit
		一.Retrofit 简介 Retrofit 官网地址: https://github.com/square/retrofit Retrofit(即Retrofit,目前最新版本为2.6.0版本),是 ... 
- Android框架式编程之RxJava(一):HelloWorld
		Hello World 源码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import androi ... 
- Android框架式编程之EasyPermissions
		EasyPermission库是一个谷歌官方提供的简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上. 官方项目地址:https://github.com/googlesamples ... 
- Android框架式编程之LiveData
		一.LiveData 介绍 LiveData是 Google 推荐的 Android 架构组件之一,是一个基于观察者模式的数据容器,但与一般的被观察者不同的是,它是有生命周期感知功能,解决了Andro ... 
- Android框架式编程之EventBus
		一.EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus. 它简化了应用程序内各个组件之间进行通信的复杂 ... 
- Android框架式编程之MVP架构
		MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ... 
随机推荐
- C/C++ 之dll注入
			#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> ... 
- PAT_A1066#Root of AVL Tree
			Source: PAT A1066 Root of AVL Tree (25 分) Description: An AVL tree is a self-balancing binary search ... 
- ES6学习历程(变量的声明)
			2019-01-25: 一:变量的声明: 1.对于变量的声明添加了let,const两种方式 关于let: (1)不存在变量提升--必须先声明再使用; (2)会出现暂时性死区--在一个方法外用var声 ... 
- 从CSV文件中读取jpg图片的URL地址并多线程批量下载
			很多时候,我们的网站上传图片时并没有根据内容进行文件夹分类,甚至会直接存储到阿里云的OSS或是七牛云等云存储上.这样,当我们需要打包图片时,就需要从数据库找寻分类图片,通过CURL进行下载.我最近刚刚 ... 
- sdp概览
			sdp会话描述符有多行用如下格式组成的文本: <type>=<value>等号旁边不允许留白. sdp会话描述符有一个session-level的段,后面会接零个或者多个med ... 
- 个人学习记录--取表中Name相同的最大值,非Group By,可延伸
			), qy ), je INT); INSERT INTO @t SELECT '产品一', '北京', UNION ALL SELECT '产品一', '上海', UNION ALL SELECT ... 
- GeoTrust 企业(OV)型 通配符(Wildcard) SSL证书
			GeoTrust 企业(OV)型 通配符(Wildcard)SSL证书(GeoTrust True BusinessID Wildcard SSL Certificates),支持通配符(Wild ... 
- GeoTrust 企业(OV)型 多域名(SAN/UC)版 SSL证书
			GeoTrust 企业(OV)型 多域名(SAN/UC)版 SSL证书(GeoTrust True BusinessID With Multi-Domain(SAN/UC) ),支持多域名,属于企业 ... 
- Spring MVC-集成(Integration)-生成XML示例(转载实践)
			以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_xml.htm 说明:示例基于Spring MVC 4.1.6. 以下示例说明如何 ... 
- <script>标签的加载解析执行
			转自原文 <script>标签的加载解析执行 看了很多网上的文章,都是大同小异.总结一下.内部原理还没有搞清楚,有机会再学习. 一.<script>标签的加载解析执行顺序 ht ... 
