调研过已有的类似的两个开源库:
比较遗憾的是它们实现的方式比较重,都是利用 ShadowActivity
或 HolderActivity
来进行 onActivityResult()
的代理。
使用代理 Activity
的方式太过消耗资源了,而且你每次调用 startActivityResult()
都会新建一次代理 Activity
,这真是 WTF !
更好的方式是使用 Headless Fragment
来进行代理(我之前写的 rxlifecycle 也是类似的实现)。它的好处在于足够轻量级,每个 Activity 或 Fragment 在调用 startActivityResult()
只会新建唯一一个 Fragment
。
Github Repo :RxActivityResult
欢迎 Star~
1
29995270 2017-03-18 07:53:10 +08:00 via Android
ForResult 拼成 fro Result 是故意的还是拼错了
|
4
29995270 2017-03-18 08:24:09 +08:00 via Android
也许作者是为了方便 static import 吧
|
5
xingda920813 2017-03-18 10:14:09 +08:00
感觉 EventBus 用的多一些, 用 result 传值比较少用.
|
6
nekocode OP @29995270
是我拼错了。。已 Fix (深夜敲代码,没仔细检查) @xingda920813 `startActivityForResult()` 是系统通用的函数,你可以用它打开其它应用的 Activity 并捕获结果。显然 EventBus 并不能。而且尽管在应用内用 EventBus 来广播 Result ,也不是一种好的设计。 |
7
xingda920813 2017-03-18 10:47:17 +08:00
@nekocode
你说打开其他应用的页面的话,那是没错,但这种情况在开发中稍少一些吧,打开本应用的页面多一些。 另外 , EventBus 不要求 Result 支持序列化; EventBus 还可以一个页面发送事件,多个页面接收事件;它的使用范围也不止局限在 Activity 之间,普通的 Java 类之间也可以。感觉它的适用范围更广一些,可以将这 1 种方式普遍用于组件间通讯的解耦 (非 IPC)。 求解为什么广播 Result 不是一个好的设计? |
8
nekocode OP @xingda920813
讲真,不要太依赖 EventBus ,能用系统提供的方法就用系统提供的方法。 EventBus 关注的是广播,发布的是任何组件(甚至非组件)都能捕获到的消息,你需要甄别不同来源的话,依旧得为消息带上 Request Code (或其它标明来源的信息)。 另外你对序列化貌似有偏见。系统在很多地方需要你的数据支持可序列化接口是有原因的,一来方便 IPC ,二来是要解决你组件随时被销毁而丢失数据的风险。 |
9
xingda920813 2017-03-18 11:18:12 +08:00
@nekocode 学习了, 当时没怎么思考.
|
10
little_cup 2017-03-18 11:44:16 +08:00 via Android
其实贵司内部的 xxxCamera 模块也是用的一样的原理实现,但由于 4.x singleInstance activity 的原因, AgentActivity 是避免不了的...
|
11
nekocode OP |
12
little_cup 2017-03-18 12:30:49 +08:00
@nekocode 惭愧,写的时候我对 Rx 还不太熟…如果下周 task 少的话我改一把
|
13
ztaober 2017-03-18 20:01:45 +08:00
star
|