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. PDO介绍(16)

    安装PDO PDO的数据选项 链接到数据库服务器并选择数据库 错误处理 获取和设置属性 查询执行 准备语句介绍 获取数据 设置绑定列 处理事务

  2. 【Dubbo源码阅读系列】之 Dubbo SPI 机制

    最近抽空开始了 Dubbo 源码的阅读之旅,希望可以通过写文章的方式记录和分享自己对 Dubbo 的理解.如果在本文出现一些纰漏或者错误之处,也希望大家不吝指出. Dubbo SPI 介绍 Java ...

  3. Python 分支、循环、条件、枚举

    对于表达式,分为“左结合”和“右结合” 左结合:对于没有 = 号的,从左到右边,当然要考虑优先级. 右结合:对于有 = 号存在的情况,右边的自成一体,然后赋值给左边变量   优先级: 逻辑运算符的优先 ...

  4. c++友元函数、友元类、友成员函数

    友元函数:不是类成员函数,是一个类外的函数,但是可以访问类所有成员. class Point{ public: friend void fun(Point t);//友元函数 private: int ...

  5. shell习题第8题:监控nginx的502状态

    [题目要求] 服务器上跑的是LNMP环境,近期总是有502现象.502为网站访问的状态码,200正常,502错误是nginx最为普遍的错误状态码. 由于502只是暂时的,并且只要一重启php-fpm服 ...

  6. iframe 框架 父页面与子界面之间的变量、函数、元素获取

    1.获取页面上的iframe 1-1. document.getElementById('iframeId'): 1-2. window.frames[0].window.frames['frameN ...

  7. JS变量、作用域、内存

    写到这个题目<JS变量.作用域,内存>,我就不由自主想起了黄金三嫖客.可能是名字有点像,嗯,一定是这样子的! JS接触下来,应该是要比Java简单不少的,所以,要学好啊.立个flag半年后 ...

  8. c++读取ini的Section节名

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include "iostream&q ...

  9. python学习笔记:第10天 函数进阶和作用域

    目录 1. 函数进阶 2. 命名空间 3. 关键字global和nonlocal 1. 函数进阶 动态接收位置参数 之前写的函数都是固定参数的,假设有个函数需要的参数由几十个,一个个写在形参的位置会非 ...

  10. 20155239 2016-2017-2 《Java程序设计》第9周学习总

    教材学习内容 JDBC 简单功能 连接数据源,如数据库 传给数据库查询和更新指令 获取并处理数据库返回结果(对查询等的响应) public void connectDBAndQuery(String ...