title: AndroidArchitecture
date: 2016-04-08 23:26:20
tags: [architecture]
categories: [Mobile,Android]
---

概述

本文记录 Android 官方关于项目架构的文章.

Android Architecture Blueprints [beta]

当我们开始明确如何组织和架构一个AndroidApp的时候,Android Framework层提供了很强大的可伸缩性。
这份自由虽然很有价值,但是同时也导致一个APP内存在如过重的类,命名体系不一样,架构导致难以测试,维护和扩展苦难等问题。

Android架构蓝图打算演示解决这类通用问题可能的方法。
在这个项目中,我们会提供一个机遇不同架构概念和不同工具的同一个项目实现。

你可以使用这些例子作为你创建自己的APP的一个参考,或者直接作为一个基础。本篇集中于代码结构,架构,测试和维护性。
然而,铭记于心的是,利用这些架构和工具,创建一个APP有很多方式,取决于你的侧重点。所以,这些架构不应该被当做是经典案例。
本篇例子中UI刻意保持了简单。

beat版的意义

我们一直在做一些可能会影响我们所有例子的决定。所以我们会在发布正式版之前,一直保持初始化的版本号。

例子

所有的例子都发布在他们对应的分支上。查看对应项目上看的README 以获取详细信息。

-todo-mvp/- 基本的MVP架构
-todo-mvp-loaders/- 基于todo-mvp,使用loaders来获取数据
-todo-mvp-databinding/-基于odo-mvp,使用databinding库

 还在进行中的

  • todo-mvp-contentproviders - 基于todo-mvp-loaders, 使用Content Providers
  • todo-mvp-clean - 基于todo-mvp, 使用Clean Architecture的概念
  • todo-mvp-dagger - 基于todo-mvp, 使用Dagger2来进行依赖注入

此外,还有很多计划中的例子。

为何是一个待做的项目

这个APP的目的是能够简单快速的理解,而不是增加演示这个复杂的设计和测试方案的复杂性。
可以查看这个APP的规格。

此外,还有一个类似的JavaScript的项目框架,叫TodoMVC。

我应该为我的APP选择哪个例子

每个例子,都有一个选择的尺度,和比较客观的评估,你可以根据你的实际情况选择。

你可能要考虑到你APP的大小,你整个团队的经验,你预估的维护成本,考虑你是否需要为平板,多平台适配,以及自己的框架偏好。

TODO-MVP

总概

这个例子是其他变种版本的基础。这个例子展示MVP模式的一个简单的实现,没有参杂其他的架构框架。
这个例子,使用手动注入依赖的方式来提供本地和远端的数据。异步的任务是通过callback实现的。

注意:在MVP的上下文中,属于view是被重新重载了。
android.view.View被称作"Android View",在MVP中接受presenter发送命令的view被简单的称为"view".

Fragments

使用fragment有两个理由:
activity和fragment进行隔离,非常适合用来实现MVP。

  • activity作为一个控制器,用来创建和控制view和presenter。
  • 可以充分利用fragment框架进行平板和多屏幕适配。

关键概念

在这个APP中有四个特点:
任务
任务详细
添加编辑任务
数据统计

每个特点有:

  • 约定view和presenter的定义
  • activity负责产生fragment和presenter
  • fragment实现view中的接口
  • presenter实现presenter定义的接口

总之,业务逻辑在presenter中,并且依赖于实现UI工作的view。
view层几乎是不包含业务逻辑的,只负责将presenter中的UI指令转换成UI表现,并且监听用户的UI操作,然后传递给presenter层。
通过接口来约定view和presenter之间的连接。

依赖

  • 常用的Android官方support包(com.android.support.*)
  • Android测试包(Espresso, AndroidJUnitRunner…)
  • Mockito
  • Guava (null checking)

特点

复杂性 - 这个比较容易理解

frameworks/libraries/tools的框架使用

还没有

概念复杂性

这个比较低,作为一个纯MVP实现。

可测试性

Unit testing

高,presenter可以作为仓库和数据源进行单元测试。

UI testing

高, 注入一个假的的module,允许进行假数据进行测试。

Code metrics

和传统没有架构的项目相比,
这个例子简绍了额外的类和接口:presenter,仓库,接口等等,所以在MVP中无论是代码的行数还是类的数量都比较高。

维护性

易于修改和添加新特性

高。

学习成本

低。项目特点明确,责任清晰明确。开发人员不需要了解项目中的外部依赖。

AndroidArchitecture的更多相关文章

  1. Google官方关于Android架构中MVP模式的示例续-DataBinding

    基于前面的TODO示例,使用Data Binding库来显示数据并绑定UI元素的响应动作. 这个示例并未严格遵循 Model-View-ViewModel 或 Model-View-Presenter ...

  2. [译]Google官方关于Android架构中MVP模式的示例

    概述 该示例(TODO-MVP)是后续各种示例演变的基础,它主要演示了在不带架构性框架的情况下实现M-V-P模式.其采用手动依赖注入的方式来提供本地数据源和远程数据源仓库.异步任务通过回调处理. 注意 ...

  3. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  4. Android Weekly Notes Issue #225

    Android Weekly Issue #225 October 2nd, 2016 Android Weekly Issue #225 本期内容包括: Android 7.0的Quick Sett ...

  5. Android Weekly Notes Issue #223

    Android Weekly Issue #223 September 18th, 2016 Android Weekly Issue #223 本期内容包括: Offline时间戳处理; Acces ...

  6. Android Weekly Notes Issue #222

    Android Weekly Issue #222 September 11th, 2016 Android Weekly Issue #222 ARTICLES & TUTORIALS Fo ...

  7. 转: GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean

    十年前,Martin Fowler撰写了 GUI Architectures 一文,至今被奉为经典.本文所谈的所谓架构二字,核心即是对于对于富客户端的 代码组织/职责划分 .纵览这十年内的架构模式变迁 ...

  8. android MVC && MVP && MVVM分析和对比

    相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...

  9. 让你Android开发更简单

    转载:http://www.jianshu.com/p/22ff8b5fdadc 搭建一个新的Android项目,你会怎么做? 每个人对应用框架的理解不相同,但是最终达到的效果应该是一样: ①降低项目 ...

随机推荐

  1. Ubuntu下VsCode+CMake 交叉编译

    在安装配置好VsCode后,下载相关插件.如图: 其中CMake Tools是为了方便使用CMake的扩展工具. 在创建工程前,先在VSCode打开一个空的目录(你的Project目录),再对CMak ...

  2. python2与python3的input函数的区别

    Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型. Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获 ...

  3. windows安装Oracle数据库

    我装的版本是Oracle11,64位,直接网上下载即可.安装过程中也出现了一些坑,现在整理了一下. 1.下载的目录和安装的目录最好放到英文目录下,别放到中文或者特殊字符的文件夹中,点击setup.ex ...

  4. 追溯了解Ubuntu之------基本命令操作(叁)

    在使用Ubuntu中的一些基本命令与Linux中是有区别的: 1.       查看Ubuntu系统位数:uname  -ar 或 getconf LONG_BIT 2.          获取Ubu ...

  5. React学习(一)

    一. 允许HTML和JavaScript代码混写,使用JSX语法:遇到HTML标签就用HTML规则解析,遇到{}的代码块就用js解析 var names = ['Alice', 'Emily', 'K ...

  6. Hadoop源码学习笔记之NameNode启动场景流程五:磁盘空间检查及安全模式检查

    本篇内容关注NameNode启动之前,active状态和standby状态的一些后台服务及准备工作,即源码里的CommonServices.主要包括磁盘空间检查. 可用资源检查.安全模式等.依然分为三 ...

  7. 100-Days-Of-ML-Code 评注版(Day 3)

    Day3_Multiple_Linear_Regression(多元线性回归) 本文引用自 Multiple_Linear_Regression, 对其中内容进行了评注与补充说明. 回归分析是一种预测 ...

  8. python-类(1)

    ·类(Class) 笔记: Python是一种面向对象(Object Oriented)的编程语言,类(Class)是Python的核心概念.在Python中,不管是列表.字符串.函数和类都是对象. ...

  9. Fiddler抓取手机APP数据包

    第一步:下载神器Fiddler,下载链接: http://w.x.baidu.com/alading/anquan_soft_down_ub/10963 下载完成之后,傻瓜式的安装一下了! 第二步:设 ...

  10. scala (6) Map

    在scala中Map分为可变长(mutable)和不可变长(imtable) /** * 不可变长map 长度一旦初始化,就不能在进行更改 */ // 通过对偶元组的方式创建map val map = ...