sorcererxw's blog

RxActivityResult 原理浅析

November 16, 2016
因为刚学RxJava不久, 一直在使用一些基于RxJava的第三方扩展库, 觉得非常神奇, 特别是一些库能够直接代理Activity进行数据处理, 但是因为懒, 一直也没了解其中的原理.不过最近使用RxActivityResult, 发现有些小地方用得不是特别顺心, 提了issues, 作者也没给个满意的答复, 索性fork了一遍, clone下来试着自己改一下, 顺便读一遍源码.

先声明一下, 以下内容仅仅包含RxActivityResult 的基本原理与被我精简过的源码, 具体内容可以自己去RxActivityResult中看源码.

使用方法

先提一下RxActivityResult 的基本使用方法, 方便在稍后分析中验证

Plain Text

简简单单的一步就实现的startActivityForResult() 的整个流程

流程与原理

RxActivityResult 通过启动一个代理Activity–HolderActivity来作为两个Activity 之间数据交互的桥梁, 先在Activity A告诉RxActivityResult 所需要启动的目标Activity, 然后RxActivityResult 代为启动HolderActivity, HolderActivity 启动Activity B, 然后接受Activity B 传回的result, 然后通过回调方法

img

源码分析

先放上三个基础的类, 会在后面被多次使用到

Plain Text
Plain Text
Plain Text
Plain Text
结语

其实分析下来, 发现并没有特别深奥, 就是一开始理解的时候不是很容易理顺其中的逻辑.

类似的库还有RxPermissions, 一个使用RxJava来简化Android 6.0+系统中权限申请的流程, 应该也是通过启动一个透明的中间Activity 并在这个Activity 中申请权限, 得到申请结果后, 然后通过回调告诉订阅者, 具体代码暂时不分析了, 可以去源码库中查看.

license by-nc-nd 4.0