Architecture Components -- Guide to App Architecture

应用程序架构指南

本指南使用于具有构建应用程序基础并且想了解构建强大、优质的应用程序的最佳实践和推荐架构的开发人员。

注:本指南假定读者熟悉 Android Framework。如果你是一个应用程序开发的新手,请参阅入门指南系列培训,其中包含了本指南先决条件的相关主题。

应用开发者面临的常见问题

在大多数情况下,桌面应用程序在启动器快捷方式中有一个单一的入口并且作为单独的独立进程运行,与桌面应用程序不同,Android 应用具有更复杂的结构。一个典型的 Android 应用是由多个应用程序组件构成的,包括 activity,fragment,service,content provider 和 broadcast receiver。

这些应用程序组件中的大部分声明在由 Android OS 使用的应用程序清单中,用来决定如何将应用融入到用户设备的整体体验中。尽管如前所述,传统的桌面应用程序作为独立进程运行,但是正确的编写 Android 应用程序需要更加灵活,因为用户会同过设备上不同的应用程序组织成自己的方式不断切换流程和任务。

Read more   2017/6/30 posted in  Android

Architecture Components--ViewModel

ViewModel

ViewModel 类是被设计用来存储和管理 UI 相关的数据,以便在配置更改(如:屏幕旋转)时数据可以保留下来。

应用程序组件(如:activity 和 fragment)具有一个由 Android Framework 管理的生命周期。Framework 可能会完全不受控制的根据某些用户操作或设备事件来决定销毁或重新创建它们。

由于这些对象有可能被操作系统销毁或重新创建,所以保存在它们中的任何数据都会丢失。例如:如果 activity 中有一个用户列表,当 activity 因为配置更改而重新创建时,新的 activity 必须重新获取用户列表。对于简单的数据,activity 可以使用 onSaveInstanceState() 方法从 onCreate() 中的 bundle 里恢复数据,但是这种方式只适用于少量数据(如:UI 状态),不适用于大量数据(如:用户列表)。

另一个问题是,这些 UI 控制器(activity,fragment 等)经常需要发起一些需要一定时间才能返回的异步调用。UI 控制器需要管理这些调用并且在其被销毁时清理它们避免潜在的内存泄漏。这需要大量的维护工作,并且在由于配置更改导致对象被重新创建的情况下十分浪费资源,因为需要重新发起相同的请求。

Read more   2017/6/25 posted in  Android

Architecture Components--LiveData

LiveData

LiveData 是一个 data holder 类,持有一个可被观察的值。与普通的observable不同的是,LiveData遵循app 组件的生命周期。它能决定在某个生命周期是否被观察

LiveData 在观察者生命周期的 STARTED 和 RESUMED 状态是可被激活的

public class LocationLiveData extends LiveData<Location> {
    private LocationManager locationManager;

    private SimpleLocationListener listener = new SimpleLocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            setValue(location);
        }
    };

    public LocationLiveData(Context context) {
        locationManager = (LocationManager) context.getSystemService(
                Context.LOCATION_SERVICE);
    }

    @Override
    protected void onActive() {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
    }

    @Override
    protected void onInactive() {
        locationManager.removeUpdates(listener);
    }
}
Read more   2017/6/25 posted in  Android

Architecture Components--Lifecycle

通过 android.arch.lifecycle 包提供的接口和类,我们可以构建出能感知到生命周期的组件。这些组件可以根据当前的Fragment 或者 Activity 的生命周期做出相应的调整

大部分有生命周期的 app 组件都定义在了Android 的Framework 层。操作系统和Framework 维护着这些组件的生命周期。这些都是 Android 运行的核心。

如果想要在一个Activity 中显示设备的地理位置。通常代码是这样的

Read more   2017/6/25 posted in  Android

Maven 仓库的使用和搭建

Maven项目使用项目对象模型(Project Object Model,POM)来配置。Maven 是一种构建工具,Maven 包是由所谓 POM(Project Object Model)所定义的文件
项目对象模型存储在名为 pom.xml 的文件中。

Read more   2017/6/3 posted in  Android

gradle 插件开发

什么是Gradle插件?

在使用Android Studio进行开发的时候,我们创建一个Android工程,会默认生成一个build.gradle脚本,打开脚本你会看到以下代码:

apply plugin: 'com.android.application'

如果我们创建一个Library的话,就会变成:

apply plugin: 'com.android.library'

其实这就是在gradle脚本引用android为我们提供的插件,plugin表示插件,'com.android.application’表示我们引用的插件名,通常是以包名来命名。

Read more   2017/6/3 posted in  Android

gradle 插件开发

什么是Gradle插件?

在使用Android Studio进行开发的时候,我们创建一个Android工程,会默认生成一个build.gradle脚本,打开脚本你会看到以下代码:

apply plugin: 'com.android.application'
Read more   2017/6/3 posted in  Android

NanoHTTPD源码解析

前言

在微信 、UC 等 APP 中,无法通过scheme 或者 AppLiks 调起我们的 APP,所以想在APP 内部建立起一个 LocalHttpServer,监听某个端口,web 通过访问本地的这个端口,完成通信,调用起一些服务

在 github 上发现了 NanoHttpd 项目,它仅仅使用一个类,完成了 server 的搭建。它使用的是Socket BIO(阻塞IO),一个客户端连接分发到一个线程的经典模型,而且具有良好的扩展性.

Read more   2017/5/4 posted in  Android

Android CleanArchitecture --Dagger分析

为了更好的解耦。clean 架构 使用了 Daager2 进行依赖注入。将接口放在了 domain 层。而将具体实现放在了 data 和 Presentation 层。

Read more   2017/4/8 posted in  Android

Android 测试 (四)-- 实战分析

本文通过分析一个完整的项目,来学习如果对一个完整的工程比较好的进行编写测试程序

项目地址 ,该项目采用的是 mvp 架构,(关于 mvp 的介绍可以看这里 ),mvp 对于测试的好处就是讲 view 逻辑和业务代码分离,我们可以很方便的对业务代码进行 local unit test 的测试。

项目结构

可以看到项目的整体结构比较清晰

  1. 项目代码
  2. Android 测试(Instrumentation test)
  3. Android 测试 相关 mock
  4. local unit test
  5. local unit test 相关 mock
Read more   2016/11/13 posted in  Android