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的更多相关文章

  1. Android框架式编程之BufferKnife

    配置 compile 'com.jakewharton:butterknife:(insert latest version)' annotationProcessor 'com.jakewharto ...

  2. Android框架式编程之Lifecycle

    Lifecycle官方文档地址:https://developer.android.com/topic/libraries/architecture/lifecycle. 一.为什么要使用Lifecy ...

  3. Android框架式编程之Room

    Room是Google官方出品的ORM(Object-relational mapping) 框架.当前我们也知道当前还有很多的ORM框架,例如GreenDao.OrmLite.Litepal等.目前 ...

  4. Android框架式编程之Retrofit

    一.Retrofit 简介 Retrofit 官网地址: https://github.com/square/retrofit Retrofit(即Retrofit,目前最新版本为2.6.0版本),是 ...

  5. Android框架式编程之RxJava(一):HelloWorld

    Hello World 源码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import androi ...

  6. Android框架式编程之EasyPermissions

    EasyPermission库是一个谷歌官方提供的简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上. 官方项目地址:https://github.com/googlesamples ...

  7. Android框架式编程之LiveData

    一.LiveData 介绍 LiveData是 Google 推荐的 Android 架构组件之一,是一个基于观察者模式的数据容器,但与一般的被观察者不同的是,它是有生命周期感知功能,解决了Andro ...

  8. Android框架式编程之EventBus

    一.EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus. 它简化了应用程序内各个组件之间进行通信的复杂 ...

  9. Android框架式编程之MVP架构

    MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ...

随机推荐

  1. 非常好用的1款UI自动化测试工具:airTest

    网易团队开发的UI自动化测试神器airTest,下载地址:http://airtest.netease.com/tutorial/Tutorial.html Appium和airTest对比,我的看法 ...

  2. 一个好玩的 屏蔽别人审查元素F12 右键及其他复制粘贴等

    有的时候自己写的私下的个人小页面 里面有些自己的小秘密 或者别的东西 不想人别人审查元素看见 所以我提供了一段不让别人审查元素的代码(我个人比较喜欢弄有意思的东西  喜欢玩 ) //屏蔽右键菜单doc ...

  3. 常见的Xshell运行命令

    最近接触到了Xshell这个软件,使用这个软件我们来进行连接Linux系统,进去之后我们可能会两眼一抹黑,小编就带大家来学些常见的shell命令. 首先我们要跟大家从最简单的聊起,我们进入Xshell ...

  4. IDEA 基本配置

    idea使用基本配置 1配置JDK开发环境 File->project structure: 2取消自动更新 file->setting:Appearance &Behavior下 ...

  5. Secret of Chocolate Poles (Aizu1378——dp)

    Select Of Chocolate Poles 题意:有一个竖直放置的高度为l cm的盒子,现在有三种方块分别为1cm的白块,1cm的黑块,k cm的黑块,要求第一块放进去的必须是黑色的,盒子最上 ...

  6. ASP.NET大闲话:ashx文件有啥用

    在VS中右击项目,添加新项,我们找到.ashx文件在新建项模板中叫做“一般处理程序”,那么这个一般处理程序用来干吗的呢? 我们可以这样地简单理解,嗯,不需搞得太复杂,它就类似.aspx文件,用于处理传 ...

  7. noip模拟赛 a

    分析:f(n)就是问有多少对a*b*c = n,如果是Σf(i),那就是问有多少对a*b*c <= n. 这道题和之前做过的一道数三角形的题差不多:传送门,先假设一下a <= b < ...

  8. fzu 2124

    #include<stdio.h> #include<queue> #include<math.h> #include<algorithm> #incl ...

  9. [poj2396]Buget[上下界可行流]

    题意:有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件:每一行的数字的和每一列的数字的和某些格子有特殊的大小约束,用大于号,小于号和等于号表示问:是否存在用正数填充这个方阵的方案,满足所有 ...

  10. [TJOI2014] [Bzoj3996] 线性代数 [网络流,最小割]

    由原式,可以推出D=Σ(i=1,n,Σ(j=1,n,A[i]*A[j]*B[i][j]))-Σ(i=1,n,A[i]*C[i]) $D=\sum\limits_{i=1}^{n}\sum\limits ...