

一种在 Library 模块中调用 Application 模块功能的方法
source link: http://prototypez.github.io/2018/10/21/call-app-methods-from-library/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在上一篇分享中,我介绍的主题是如何在一个 Android 项目中使用 AppJoint 进行组件化。有读者找到我说:我知道组件化很美好,但是项目改造总是需要成本的,而且这个成本是我们目前承受不了的,我们目前能做的最多的只能是 模块化 ,即把主 app 模块的功能拆出来,放到新的 library 模块里,但目前面临的最直接的问题就是, 拆出来的新模块如何调用主 app 模块里的方法 。能否不用组件化那一整套工具,先用 最轻量级的方法 解决这个跨模块方法调用的问题?
答案当然是肯定的, AppJoint 就是这样一个轻量级的工具,如果你不想组件化,那么你完全可以把它当成一个只是用来解决跨模块方法调用的问题的小工具。
问题背景
假设目前已经从 app 模块拆出了一个 module1 模块, app 模块是主 app 模块, 而 module1 模块是 library 模块。如果 module1 模块想要调用 app 模块的功能,那么肯定需要存在一个接口,这个接口两个模块要都能访问到。所以这个接口存在的位置就只能是 app 模块和 module1 模块都依赖的公共模块。这里的这个公共模块,它可以是已有的公共模块,也可以是新创建的公共模块。我们在这个公共模块里声明这个接口,即 app 模块希望被 module1 模块调用的方法的接口:
interface AppService { // start Activity from app module fun startActivityOfApp(context: Context) // get Fragment from app module fun obtainFragmentOfApp(): Fragment // call synchronous method from app module fun callMethodSyncOfApp(): String // call asynchronous method from app module fun callMethodAsyncOfApp(callback: AppCallback<AppEntity>) // get RxJava Observable from app module fun observableOfApp(): Observable<AppEntity> }
这个接口由于处于公共模块,所以两个模块都能访问到这个接口。接下来我们就来解决这个问题,即在 module1 模块里调用 app 模块的方法。
问题解决
在声明上面这个接口以后,我们在 app 模块里实现这个接口:
@ServiceProvider class AppServiceImpl : AppService { override fun startActivityOfApp(context: Context) { AppActivity.start(context) } override fun obtainFragmentOfApp(): Fragment { return AppFragment.newInstance() } override fun callMethodSyncOfApp(): String { return "syncMethodResultApp" } override fun callMethodAsyncOfApp(callback: AppCallback<AppEntity>) { Thread { callback.onResult(AppEntity("asyncMethodResultApp")) }.start() } override fun observableOfApp(): Observable<AppEntity> { return Observable.just(AppEntity("rxJavaResultApp")) } }
需要注意一点,我们在实现类上标记了 @ServiceProvider
注解。然后我们就可以像下面这样,从 module1 模块里调用 app 模块里的方法了:
val appService = AppJoint.service(AppService::class.java) // call methods inside AppService appService.callMethodSyncOfApp() appService.observableOfApp().subscribe() appService.startActivityOfApp(context) ...
即使我们没有引入组件化的任何概念,我们也能轻松解决模块化中最常遇见的跨模块方法调用的这一类问题。
关于如何在项目中引入 AppJoint ,可以前往 AppJoint 的 Github 主页: https://github.com/PrototypeZ/AppJoint , 核心代码不超过 500 行,您可以使用开箱即用的版本,也可以自行在项目中引入。
参考资料
在模块化之后,您可能会对项目的组件化产生兴趣,欢迎继续阅读我的组件化经验分享 『回归初心:极简 Android 组件化方案 — AppJoint』 ,希望可以给您的项目组件化带去一点点帮助,谢谢! : )
如果您对我的技术分享感兴趣,欢迎关注我的个人公众号:麻瓜日记,不定期更新原创技术分享,谢谢!:)
Recommend
-
43
严正声明:本文仅限于技术探讨,严禁用于其他用途。 今天给大家介绍一种在隔离环境中实现隐蔽后门数据传输的方法,这里需要使用到的是一款名叫GhostTunnel的工具。
-
40
译者:前端小智 原文:medium.com/@bretcamero… 当我开始学习JavaScript时,我把我在别人的代码、code challenge网站以及我使用的教程之外的任何地方发现的每一个节省时间的技巧都列了一个清单。 在这篇文章中,我将分享11
-
21
-
13
一个可多种在编程语言之间转换代码的IDE工具:ide.onelang.io一个超级酷的工具:您可以在其中将代码从一种编程语言转换为另一种编程语言。点击标题。 你可以将Ruby转换为 Javascript 或 java 等愚蠢的语言,现在编程会很有趣!你也许迫不及待地想...
-
10
入侵物种在太空会发生什么
-
5
把绿色种在数据中心里 北京电信聚焦关键技术为绿水青山充“植”_IDC国内资讯_中国IDC圈 把绿色种在数据中心里 北京电信聚焦关键技术为绿水青山充“植” 在北京电信数据中心,这项技术被成功应用,这也是二氧...
-
9
超灵魂的标识升级!Instacart的胡萝卜被种在了土地上
-
5
作者:The_Itach1@知道创宇404实验室 日期:2022年12月23日 最近看了一下x86matthew关于hook方法的一篇文章https://www.x86matthew.com/view_post?i...
-
6
六种在 React 中获取数据的方法 作者:佚名 2023-06-01 16:45:11 数据获取是任何 React 应用程序的核心方面。对于 React 开发人员来说,了解不同的数据获取方法以及哪些用例最适合他们很重要。 数据获取...
-
5
五种在 JavaScript 中访问对象属性的方法 作者:佚名 2023-06-02 15:42:51 在 JavaScript 中,对象是语言的基本组成部分,广泛用于表示数据结构。对象由保存值的属性组成。为了访问这些属性,JavaScript 提供了多...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK