0%

概述

注:本文基于Android 10源码,为了文章的简洁性,引用源码的地方可能有所删减。

Service作为Android四大组件之一,理解其内部的相关原理和源码还是很有必要的,理解了这些后,日常的开发中遇到问题也会多一种解决思路。在Android高版本中,系统不允许应用直接调用ServiceManager.addService添加自定义的服务,除非修改系统Selinux Policy等文件定制ROM,接下来的解析也可以根据Service的原理明白bindService是怎么通过AMS来传递Binder对象的。

阅读全文 »

概述

DataBinding是一个绑定数据的支持库,使用该库,我们可以使用声明性格式而非编程方式将布局中的UI组件绑定到应用程序中的数据源。可在gradle中配置启用DataBinding:

1
2
3
4
5
6
android {
// ...
dataBinding {
enabled = true
}
}
阅读全文 »

概述

Jetpack是一系列的工具库,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。Jetpack包含与平台API解除捆绑的androidx.*软件包库。这意味着,它可以提供向后兼容性,且比Android平台的更新频率更高,以此确保您始终可以获取最新且最好的Jetpack组件版本。

官方介绍

JetPack是一系列库和工具的集合,它更多是Google的一个提出的一个概念,或者说态度。其组成部分如下:

阅读全文 »

概述

LiveData是一个可观测的数据持有类,不同于通常的被观察者,LiveData具有生命周期感知能力。当它所持有的数据发生改变的时候,并且Lifecycle对象(比如Activity或者Fragment等)处于活跃状态(STARTED或者RESUMED),LiveData将立即通知观察者数据发生了变化。

ViewModel是一种用来存储和管理UI相关数据的类。但不同的是,它支持在系统配置发生改变的时候自动对数据进行保存,需要配合LiveData。此外,它也使得View的数据持有者和UI controller逻辑更加分离,便于解耦和测试。

阅读全文 »

概述

Lifecycle是Android-Jetpack中的架构组件,它具有生命周期感知能力,也就是说我们能在Activity或者Fragment的生命周期发生变化的时候得到通知。

在以往的开发中,我们经常在Activity的生命周期回调中进行各种注册解绑等,比如说EventBus的注册解绑,广播的注册解绑等。如果我们把很多这种与生命周期相关的代码都直接放在Activity的生命周期回调中,Activity将会变得难以维护。而本质上我们需要的只是Activity或者Fragment的生命周期发生改变的时候能通知我们,以便在对应生命周期中执行对应的方法,因此可以使用Lifecycle。

阅读全文 »

概述

首先说明,AOP和IOC不是Android特有的概念,在其它许多框架、领域都有它们的影子,比如说Spring后台开发中,也有AOP和IOC的思想。在Android中实现这些的方式有:动态代理,APT,AspectJ,Transform&Javassist(或者Gradle编译期间的许多节点都可以)等。

阅读全文 »

概述

前段时间在读EventBus的源码,然后突然来了兴趣(闲的没事)就稍微修改了一下使其支持进程间订阅消息,实现原理很简单,其实就是进程内使用EventBus原生方式,进程间则通过Binder发送信息。实现比较简单,进程间Binder传递其实也可以不使用bindService,使用ContentProvider会更加灵活,后来就想着反正没事就试一试写个IPC框架(反正也不会有人用,练练手)。

大概原理就是通过一个AIDL接口传递要调用的类和方法名,然后通过反射调用。进程间的Binder通过ContentProvider传递(Android-IPC机制-ContentProvider),不需要bindService,然后自定义了一个Gradle插件,用来动态修改Manifest信息以及生成ContentProvider类。

项目地址:IpcBridge,ReadMe文档有使用方法。

项目工程中包括三个模块,一个是IpcBridge的Kotlin源代码,一个是IpcBridge的Gradle插件源码,主模块是demo模块。

阅读全文 »

概述

AspectJ是一种编译器,它在Java编译器的基础上增加了关键字识别和编译方法。因此,AspectJ可以编译Java代码,它还提供了Aspect程序,在编译期间,将开发者编写的Aspect程序加入到目标程序中,扩展目标程序的功能。

使用AspectJ有两种方法:

  • 使用AspectJ语言,这种语言和Java几乎一样,也能在AspectJ中调用Java的任何类库,AspectJ只是多了一些关键词
  • 使用Java语言开发,然后使用@AspectJ注解

在Android平台,常用的是沪江的aspectjx,该框架基于Android Gradle Transform。

阅读全文 »

概述

本文基于Retrofit 2.8.1版本的源码。

Retrofit是Square公司开发的默认基于OkHttp封装的一套RESTful网络请求框架,它是用于Android和Java的一个类型安全(type-safe)的REST客户端。

阅读全文 »

概述

本文基于Volley 1.1.1版本的源码。

Volley是Google官方出的一套小而巧的异步请求库,该框架封装的扩展性很强,支持HttpClient、HttpUrlConnection,甚至支持OkHttp。Volley不适用于下载大量内容的操作或流式传输操作,因为在解析过程中,Volley会将所有响应存储在内存中,因此Volley不适合上传和下载大文件。

阅读全文 »