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的控制下修 ...
随机推荐
- 为什么阿里规约手册要求谨慎使用Arrays.asList方法
前言 在开发中,有时候会碰到把多个参数,或者说把数组转成List的需求,通常我们会使用 Arrays.asList()方法.但是该方法在使用的过程中,稍有不慎就会出现严重的异常.有如下代码: @Tes ...
- 初级模拟电路:3-1 BJT概述
回到目录 1. 名称由来 BJT的全称是双极性结型晶体管(Bipolar Junction Transistor),国内俗称三极管.其实,在英语中,三极管(triode)特指以前的真空电子管形式的 ...
- Django工程
一.Django工程创建 1.Django安装: pip3 install django 安装成功后,会在python的安装目录下“Scripts"中生成”django-admin.exe& ...
- Web 常用
System.Web.Hosting.HostingEnvironment.MapPath(); HttpUtility.UrlEncode();
- uvalive 3231
3231 - Fair ShareAsia - Seoul - 2004/2005You are given N processors and M jobs to be processed. Two ...
- [luogu2148 SDOI2009] E&D (博弈论)
传送门 Solution 我们知道当SG不为0则先手必胜,然后就可以打表了 ̄▽ ̄ Code //By Menteur_Hxy #include <cmath> #include <c ...
- Vmware在NAT模式下网络配置详解
Vmware在NAT模式下网络配置详解 Linux中的网络配置对于接触Linux不久的小白菜来说,还是小有难度的,可能是不熟悉这种与windows系列迥然不同的命令行操作,也可能是由于对Linux的结 ...
- 【[Offer收割]编程练习赛 14 A】小Hi和小Ho的礼物
[题目链接]:http://hihocoder.com/problemset/problem/1505 [题意] [题解] 考虑Meet in the middle. 因为两个数的和不是很大; 直接用 ...
- KD树学习小结
几个月后的UPD: 学习完下面之后,实战中的总结: 0.比赛中正解就是kdtree的题目很少很少 1.几类优先考虑kdtree的题目: k(维度) >= 3 的题目 二维平面上涉及区间标记的题目 ...
- Object Detection: To Be Higher Accuracy and Faster
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51597496 在深度学习中有一类研究热 ...