Android应用程序中的模块间(库项目)通信

2024-02-07

在下图中,我有 3 个模块(作为 android 库),它们扩展了基本的“通用组件模块”,并且所有这 3 个模块都将添加到单个 android 应用程序中。所有3个模块都是独立的模块,但是当它作为一个应用程序时,它需要共享一些数据,启动其他模块并且需要更多的相互通信。

那么谁能告诉我如何在这种架构中实现“数据共享层”和“导航控制器”?

示例:模块 1 -> 登录、模块 2 -> 配置文件管理等,根据应用程序需要,可能有“n”个模块。


您正在寻找的基本上是一种关于如何与其他类进行通信的干净方法。它们是否位于不同的模块中并没有真正的区别。

以下示例描述了如何LoginActivity可以导航到某些个人资料活动。这只是一个基本示例,需要根据您的实际需要和打算进行改进!

  1. 定义您的接口

编写你想要的接口need。您的登录应该能够打开个人资料页面?嗯,这听起来像是需要一个LoginNavigator!

interface LoginNavigator {
    void showProfile();
}

将这些接口包含在您的共享组件中。不定义接口实际上是不可能的。您可以使它们更抽象或更细粒度,这完全取决于您。

  1. 声明您的依赖项

请记住您的登录名如何需要LoginNavigator?真正的问题是如何将其提供给你的班级。您应该看看依赖注入,因为有喜欢的框架dagger-2 /questions/tagged/dagger-2这(可以)使这变得更容易。现在,我们为公共组件定义一个接口,以便我们可以检索我们需要的依赖项。

interface NavigatorProvider {
    LoginNavigator provideNavigator();
}

你可能猜到了——这个方法用于获取实际的LoginNavigator您可以使用它来获取该接口的实现。通常您只需在构造函数中声明此依赖项,但由于 android 有点特殊,您需要自己从某个地方获取它。

  1. 提供您的依赖项

最简单的方法是让您的应用程序实现此接口(或持有一个实现此接口的对象)。

class MyApp extends Application implements NavigatorProvider {

    LoginNavigator provideNavigator() {
        return new LoginNavigator() {
            void showProfile() {
                // just some sample code. You should probably not use an
                // anonymous class
                startActivity(new Intent(this, MyProfileActivity.class));
            }
        };
    }
}

同样,您也可以返回一个实现此接口的对象。这只是一个基本示例。

  1. 使用接口。 (并且不关心实现)

现在依赖注入已接近完成。我们有一个我们需要的接口,我们有一些方法来提供依赖关系,剩下的就是获取它并使用它。

class LoginActivity extends Activity {

    LoginNavigator mNavigator;

    void onCreate() {
        // get the dependency
        mNavigator = ((NavigatorProvider) getApplicationContext()).provideNavigator();

        // use it where needed. (again, just sample code)
        findShowProfileView().setOnClickListener(new OnClickListener() {
            void onClick(View view) {
                mNavigator.showProfile();
            }
        });
    }
}

现在提供了依赖项,可以使用了。


该示例展示的是如何基本上使用接口来解耦逻辑。您仍然需要一些入口点,因为 android 不允许实现您自己的构造函数 - 这就是使用应用程序类的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android应用程序中的模块间(库项目)通信 的相关文章

随机推荐

  • 理解递归合并排序过程背后的直觉

    我对以下代码的以下输出感到困惑 def msort3 x print splitting x result if len x lt 2 print merging x return x mid int len x 2 y msort3 x
  • Visual Studio 2017 RC 安装错误“指定的帐户已存在。”

    当我尝试安装 Visual Studio 2017 RC 时 出现此错误 1764 001d 2016 11 20T10 14 21 Package Microsoft Ancm IISExpress Msi version 1 0 196
  • Numba JIT 比带有参数化函数的纯 Python 慢

    我刚刚写了一个简单的基准 https www matecdev com posts julia python numba cython html比较 Numba 和 Julia 并进行一些讨论 我想知道我的 Numba 代码是否可以以某种方
  • 如何以编程方式将项目添加到 arrayList 中的字符串数组?

    这是我的数组 xml文件在分辨率 值 folder
  • Jquery Draggable 具有多个句柄

    是否有可能有一个draggable具有多个句柄的元素 我初始化它两次 每次都使用不同的句柄参数 但它不起作用 只有第一个起作用 您应该只传递 handle 参数一次 它可以是选择器或元素 因此 要使其与多个句柄一起使用 elem dragg
  • 编写字体查看器 - 获取字体属性,动态加载 ttf

    我正在尝试使用 VB6 VB5 代码 在 Windows 下 为 TrueType OpenType 字体编写一个字体查看器 这是令人惊讶的困难 1 在VB winAPI中 我没有找到如何提取字体的名称或一般的字体属性 2 我可以安装字体
  • preg_match_all 和引号内的换行符

    另一个菜鸟正则表达式问题 问题 我可能做了一些愚蠢的事情 所以我想我应该利用 SO 常客的聪明才智 尝试匹配换行符 但前提是它们出现在双引号或单引号内 我还想捕获引号之间但不包含换行符的字符串 好的 这就是我得到的 有输出 下面是我想要得到
  • 在 Eclipse Maven 项目中找不到 persistence.xml

    我无法修复persistence xml file not foundeclipse问题 这是一个简单的测试项目 Maven Nature 用于非常基本的EJB测试 该文件确实在src main resources META INF 这是p
  • 应用程序开发人员犯的数据库开发错误[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么Java 8中没有BooleanConsumer?

    恐怕这是一个有点愚蠢的问题 有没有人可以告诉我为什么没有BooleanConsumer与相反BooleanSupplier https docs oracle com javase 8 docs api java util function
  • 获取泛型参数的类型

    我编写了一个小函数来更好地处理类型 function evaluate variable any type string any switch type case string return String variable case num
  • 如何在Java中创建临时目录/文件夹?

    是否有一种标准且可靠的方法在 Java 应用程序中创建临时目录 有Java 问题数据库中的一个条目 http bugs java com bugdatabase view bug do bug id 4735419 其中的注释中有一些代码
  • 如何将 pandas 数据添加到现有 csv 文件?

    我想知道是否可以使用 pandasto csv 函数将数据框添加到现有 csv 文件 csv 文件与加载的数据具有相同的结构 您可以在 pandas 中指定 python 写入模式to csv http pandas pydata org
  • Scala 何时需要分号

    我在工作中被锁定的电脑困住了 但我正在尝试练习我的 Scala 我正在使用 Ideone com 因为我什至无法安装scalac 无论如何 这不能编译 class DPt var name String var x Double var y
  • 如何在Lucene文档中定义主键字段以获得最佳的查找性能?

    在我的 Lucene 索引 v7 2 中创建文档时 我添加了uid包含唯一 id key 字符串 的字段 doc add new StringField uid uid Field Store YES 为了稍后检索该文档 我为给定的唯一 I
  • 模板中的 django 请求

    我已经启用了 Django 请求处理器 TEMPLATE PROCESSORS django core context processors auth django core context processors debug django
  • 一些 Alt 键会更改我的 RichTextBox 字体

    我正在 Windows 窗体中创建一些印地语打字应用程序 我用过KrutiDev010字体 某些字符有一些 Alt 键控制代码 但如果我输入其他一些 Alt 键控制代码 例如Alt 0261 Alt 025896然后它打印一个章程 攨分别并
  • XSL 文档的仅 IE7 样式表

    如何将仅限 IE7 及更低版本的样式表添加到 XSL 页面 我尝试将其添加到标题信息模板中 如下所示
  • Meteor、Ember.js 和 Backbone.js 之间的主要区别是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android应用程序中的模块间(库项目)通信

    在下图中 我有 3 个模块 作为 android 库 它们扩展了基本的 通用组件模块 并且所有这 3 个模块都将添加到单个 android 应用程序中 所有3个模块都是独立的模块 但是当它作为一个应用程序时 它需要共享一些数据 启动其他模块