ARouter 源码解析(二)

前言

前几天对 ARouter 的页面跳转源码进行了分析,趁着今天有空,就讲讲 ARouter 里面的拦截器吧。

拦截器解析

把视线转移回 ARouter 的 init 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void init(Application application) {
if (!hasInit) {
logger = _ARouter.logger;
_ARouter.logger.info(Consts.TAG, "ARouter init start.");
hasInit = _ARouter.init(application);
// 如果初始化完成了
if (hasInit) {
_ARouter.afterInit();
}

_ARouter.logger.info(Consts.TAG, "ARouter init over.");
}
}
阅读更多

Android ARouter 源码解析(一)

前言

之前对 ActivityRouter 的源码做了一次分析,相信大家对路由框架已经有一个大概的理解了。

而今天给大家分析一下 ARouter 。大家在项目组件化的过程中,可能绝大多数的开发者都会使用 ARouter 来作为项目的路由框架。毕竟 ARouter 是阿里出品,优点自然不必多说了。

所以在平常使用的过程中,不仅仅要做到会用,还要深入了解一下 ARouter 的内部原理。

本次 ARouter 的解析分为三部分:

  1. 对 IRouteRoot 页面跳转进行源码解析;
  2. 对 IInterceptorGroup 拦截器进行源码解析;
阅读更多

Android ActivityRouter 源码解析

Header

在如今的 Android 组件化开发中,一款好的路由框架是不可或缺的。比如目前阿里的 ARouter 、美团的 WMRouter 等。路由框架可以降低 Activity 之间的耦合,从而在不需要关心目标 Activity 的具体实现类, 利用协议完成跳转。

ActivityRouter使用方法

在AndroidManifest.xml配置

阅读更多

Android Architecture Component ViewModel 解析

Header

之前给大家分析过了 LiveData ,今天就来看看 ViewModel 。

ViewModel 的作用就相当于 MVP 中的 Presenter ,是用来衔接 Model 和 View 的。通常把一些与 View 无关的业务逻辑写在 ViewModel 里面。ViewModel 内部创建出 LiveData 对象,利用 LiveData 对象来传递数据给 View 。

ViewModel 相对于 Presenter 而言,有以下几个好处:

  1. ViewModel 并不直接持有 View ,所以在 ViewModel 销毁时不需要像 Presenter 一样地去手动解除 View 的绑定,也就不会造成持有 View 导致的内存泄漏;
阅读更多

Android Architecture Component Lifecycle 解析

Header

Lifecycle 的作用简单的来说就是让你自己定义的东西可以感知生命周期。比如你想设计了一个 GPS 位置监听器,打算在 Activity 可交互状态下发送地址位置,那么就可以利用 Lifecycle 来做这件事,这样和 Activity 的耦合性就减少了很多。

Lifecycle

Part 1

LifecycleOwner

先来看 LifecycleOwner 接口,这个接口定义就说明了某样东西是具有生命周期的。getLifecycle() 方法返回生命周期。

阅读更多

Android Architecture Component LiveData解析

Header

Android Architecture Component 是 Google 在 2017 年推出的一套帮助开发者解决 Android 架构设计的方案。里面有众多吸引人的亮点,比如 Lifecycle、ViewModel 和 LiveData 等组件的设计,确实是一款牛逼的架构。

今天主要来解析一下其中的 LiveData 是如何工作的。

LiveData 表示的是动态的数据,比如我们从网络上获取的数据,或者从数据库中获取的数据等,都可以用 LiveData 来概括。其中 setValue 方法是需要运行在主线程中的,而 postValue 方法是可以在子线程运行的。

阅读更多

Android Data Binding 入门

配置

新建一个 Project,确保项目 build.gradle 中的 Gradle 插件版本不低于 1.5.0-alpha1,比如我的 Demo 是 3.1.2 版本的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
buildscript {

repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'


// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
阅读更多

Android 通过 URI 获取文件路径

之前在工作的过程中,遇到不同 Android 版本下 URI 采用不同方式来获取文件路径的问题。

因为需求的原因,要求拍照上传或者从相册中选择图片上传,而且图片是需要经过压缩的,大小不能超过2M。

很快,拍照的这部分就搞定了。那么相册中选择图片的也是一样的道理,应该也是轻松解决了。

至于选择图片的代码,如下所示:

1
2
3
4
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, FILE_CHOOSER_RESULT_CODE);
阅读更多

Android VirtualAPK 源码解析

Header

VirtualAPK 是滴滴开源的一款 Android 插件化的框架。

现在市面上,成熟的插件化框架已经挺多了,那为什么还要重新开发一款轮子呢?

  1. 大部分开源框架所支持的功能还不够全面
  2. 兼容性问题严重,大部分开源方案不够健壮
  3. 已有的开源方案不适合滴滴的业务场景

在加载耦合插件方面,VirtualAPK是开源方案的首选。

以上是滴滴给出的官方解释。

对于我们开发者来说,这种当然是好事。第一,我们选择插件化框架的余地变多了;第二,我们也可以多学习学习框架内部实现的原理,一举两得。

阅读更多

Android View 事件分发机制源码解析

注:本文解析的源码基于 API 25,部分内容来自于《Android开发艺术探索》。

Header

Android View 事件分发的机制可以说是 Android 开发者必知点之一,一般在面试的过程中肯定也有涉及。

事件分发可以说分为三个部分,

  • 一个是 Activity
  • 然后是 ViewGroup
  • 最后是 View

我们在分析事件分发时,也会依次按照这三个部分来入手。

Activity

先入手第一部分:Activity 。

阅读更多