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
}
}
阅读更多

HTTPS 加密原理

Header

HTTP、HTTPS在我们日常开发中是经常会接触到的。

我们也都知道,一般 Android 应用开发,在请求 API 网络接口的时候,很多使用的都是 HTTP 协议;使用浏览器打开网页,也是利用 HTTP 协议。看来 HTTP 真是使用广泛啊,但是,HTTP 是不安全的。利用网络抓包工具就可以知道传输中的内容,一览无余。比如我经常会使用 Fiddler 来抓包,搜集一些有趣的 API 接口。

那么问题来了,如何保证 HTTP 的安全性呢?基本上所有的人都会脱口而出:使用 HTTPS 协议。99.9% 的人都知道 HTTPS 会将传输的内容进行加密,但是接着问具体加密的过程和步骤,很多人就哑口无言了。

阅读更多

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 。

阅读更多

Android Window 源码解析(四):Window 的删除机制

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

Header

这篇将是 Window 系列的最后一篇了,主要来讲讲 Window 删除的机制原理。

其实相对于 Window 的添加和更新来说,删除也是换汤不换药的。也是通过 WindowSession 和 WindowManagerService 来完成这个步骤的。

Window的删除机制

我们删除 Window 的代码:

阅读更多