一种在 Library 模块中调用 Application 模块功能的方法

栏目: IOS · Android · 发布时间: 6年前

内容简介:在上一篇分享中,我介绍的主题是如何在一个 Android 项目中使用答案当然是肯定的,假设目前已经从

在上一篇分享中,我介绍的主题是如何在一个 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』 ,希望可以给您的项目组件化带去一点点帮助,谢谢! : )

如果您对我的技术分享感兴趣,欢迎关注我的个人公众号:麻瓜日记,不定期更新原创技术分享,谢谢!:)

一种在 Library 模块中调用 Application 模块功能的方法


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言基础

C语言基础

安博教育集团 / 2012-2 / 37.00元

《C语言基础》深入浅出地介绍了C语言程序设计的基础知识,内容涉及C语言基础、算法基础、变量、数据类型、运算符、输入/输出相关函数、选择结构、循环结构、各种表达式、数组、字符串、指针、函数、结构体、ISO C99的扩展语法等。全书内容丰富,结构严谨,层次清晰,语言生动,论述精准而深刻,实例丰富而实用。 《C语言基础》不仅适合用做计算机职业培训的首选教材,也可作为普通高校教材使用,更是C语言初学......一起来看看 《C语言基础》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具