【问题标题】:Get Context in Android library在 Android 库中获取上下文
【发布时间】:2014-01-30 21:51:45
【问题描述】:

我正在编写一个 Android 应用程序,它具有封装在内部库中的一些功能。但是,要使此功能起作用,库需要应用程序上下文的实例。给图书馆这个上下文的最好方法是什么?我看到了一些选项,但都没有吸引力:

  • 让我的库类扩展Application,并调用getApplicationContext()
    • 通常不鼓励这样做
  • 让我的库类每个都实现单例模式,并让每个调用者在每次获得对单例的引用时传入Context
    • 这要求每个调用者在使用库之前检索应用程序上下文,并且还要求调用者调用库的实例而不是库类上定义的静态方法(因此进一步需要保留对此实例的引用)。

【问题讨论】:

    标签: java android singleton shared-libraries android-context


    【解决方案1】:

    为库提供此上下文的最佳方式是什么?

    Context 传递给您的库公开的需要Context 的方法。这就是 Android SDK 在某些地方所做的。

    或者,更改您的库以公开对象,而不是静态方法,并让对象保存Context 的实例(提供给创建该实例的构造函数或工厂方法)。

    让我的库类扩展 Application,并调用 getApplicationContext()

    如果您可以在Context 上调用getApplicationContext(),您就可以这样做,而无需继承Application

    【讨论】:

    • 嗨@CommonsWare,感谢您的回答,但您能否详细说明“这不起作用”的意思?据我了解,它会起作用,但只要您已经引用了上下文,就不需要扩展应用程序?谢谢你的时间:)
    • @TheIT:是的,那句话措辞不好,所以我修好了。我为混乱道歉。顺便说一句,既然您似乎专注于Application,如果您还没有这样做,您可能想阅读戴夫史密斯关于选择正确的Context 的优秀帖子,嗯,上下文:doubleencore.com/2013/06/contextApplication 正确的答案,特别是如果您需要 Context 来表示将从静态数据成员引用的内容,但通常在不合适的情况下使用它。
    • 非常感谢更新和信息丰富的链接,非常感谢!
    【解决方案2】:

    这是我找到的一个解决方案,我没有测试过,但 Firebase 显然使用它来避免创建 init 方法:

    “应用程序启动时发生的情况是,它在系统中注册所有 ContentProviders(调用 onCreate)。这意味着此时还没有启动任何活动,但我们可以访问(应用程序)上下文,我们可以在其中使用这个上下文初始化我们的库”

    本质上,您正在使用空 ContentProvider 的 onCreate 作为 init。它很老套,但无缝。

    https://medium.com/@andretietz/auto-initialize-your-android-library-2349daf06920

    【讨论】:

      【解决方案3】:

      我不确定这种情况下的最佳实践,但我想在 Application onCreate 期间在我的单例类中设置上下文。

      MyLibrary.init(this);
      

      为什么? 如果您之前使用过 Crashlytic/Fabric,您会发现它们正在使用

      Fabric.with(this, new Crashlytics());
      

      如果您阅读Fabric中的代码会发现它们将Context存储在Fabric单例中。

      Facebook Android SDK 做了类似的事情:

      FacebookSdk.sdkInitialize(getApplicationContext());
      

      如果你浏览他们的代码会发现他们存储的是静态上下文。

      那么,哪些是最佳做法?我不确定,但我相信那些很棒的开发人员创建了很棒的库,并且他们在这个库出现之前就这个问题进行了辩论。无论如何,我仍在学习如何编写最好的 android 库并遇到这些主题。

      【讨论】:

        【解决方案4】:

        App Startup 库是 Android Jetpack 的一部分。它允许监听应用程序启动而无需多个 ContentProvider 的成本。此外,它还提供了处理依赖树的能力。

        Implementation example

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-11
          • 2018-12-29
          • 2018-11-18
          相关资源
          最近更新 更多