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. day12-闭包函数、装饰器

    目录 闭包函数 装饰器 无参装饰器 有参装饰器 装饰器模板 闭包函数 之前我们都是通过参数将外部的值传给函数,而闭包打破了层级关系,把局部变量拿到全局使用,并把外部的变量封装到内部函数中,然后下次直接 ...

  2. 解决 i5 6500 安装黑苹果 Sierra 显卡不正常问题

    i5 6500内置HD 530显卡,装好Sierra显卡驱动不太正常. 先下载Clover configurator 用Clover configurator加载 EFI (Mount EFI)分区 ...

  3. CAD从二制流数据中加载图形(com接口VB语言)

    主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...

  4. Math.floor() 与 parseInt()

    parseInt()与Math.floor()都能实现数字的向下取整,但是两者存在根本上的差异,1.Math.floor()用于一个数的向下取整,不能解析字符串 <script type=&qu ...

  5. 从 UI 交互角度说语音识别产品

    语言是人类进化的主要特征,而人工智能拥有了说话的能力也是科技进步的一个特征.在很多科幻的电影里面,我们可以看到人工智能的身影.在电影 her 里面见到的人工智能,真的让人叹为观止,他可以随意的和你聊天 ...

  6. kernel-内核抢占

    kernel-内核抢占 这里有两个概念,内核抢占与用户态抢占.什么是内核抢占?就是指程序执行系统调用的时候(也就是执行于内核态的时候)被其他内核线程抢占走了. 有2种情况是不会也不应该被抢占的: 内核 ...

  7. Win32中 DLL、Lib 库的创建机器使用

    Windows 下 的静态库和动态库 一.静态函数库(Lib) 1. 静态函数库的制作(C/C++) —— 打开新建项目,然后选中Win32项目,接着在创建项目中选择 Lib,再接着将函数.实现功能的 ...

  8. Sessions共享技术设计

    概述 分布式session是实现分布式部署的前提, 当前项目由于历史原因未实现分布式session, 但是由于在kubernets中部署多个pod时, 负载均衡的调用链太长, 导致会话不能保持, 所以 ...

  9. hdu 5182 PM2.5

    问题描述 目前,我们用PM2.5的含量来描述空气质量的好坏.一个城市的PM2.5含量越低,它的空气质量就越好.所以我们经常按照PM2.5的含量从小到大对城市排序.一些时候某个城市的排名可能上升,但是他 ...

  10. [luoguP3275] [SCOI2011]糖果(差分约束)

    传送门 差分约束裸题 但是坑! 有一个点是长为10W的链,需要逆序加边才能过(真是玄学) 还有各种坑爹数据 开longlong ——代码 #include <cstdio> #includ ...