快速搭建新项目框架1-依赖注入

关于依赖注入在 之前的文章里有详细的分析

而最近的 dagger 的更新又再次方便了注入过程 。
回顾之前的 dagger 在 Activity 、fragment 等 Android 组件中是如何注入的

  1. 在 moduel 中,提供所需注入的元素的构造方法
  2. 构造对应的 Component,包含所需的 module,并将module 中的方法暴露出。并申明对应的inject方法
  3. 在actvity 中注入

这样做的弊端是

Read more   2017/10/28 posted in  Android

快速搭建新项目框架0-前言

前言

有幸在公司从零开始做一个项目,非常兴奋。也想着在快速开发的过程中如何保持 app 代码结构 clean。由此总结此次代码整体框架的搭建过程,供日后回顾总结

Read more   2017/10/25 posted in  Android

Architecture Components--Room Persistence Library

Room Persistence Library

Room 在 SQLite 之上提供了一个抽象层,以便在利用 SQLite 全部功能的同时能够流畅的访问数据库。

将数据持久化到本地对于应用程序处理大量结构化数据有非常大的好处。最常见的情况是缓存相关数据。这样,当设备无法访问网络时,用户仍然可以在离线状态下浏览内容。然后,在设备重新上线后,任何用户发起的内容变更都会同步到服务器。

核心框架提供了内置支持来处理原始的 SQL 内容。虽然这些 API 是强大的,但是它们非常低级并且使用起来需要话费巨大的时间和精力:

Read more   2017/6/30 posted in  Android

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