在Android库中获取上下文

jos*_*hlf 13 java singleton android shared-libraries android-context

我正在编写一个Android应用程序,它具有封装在内部库中的一些功能.但是,要使此功能起作用,库需要应用程序上下文的实例.给这个上下文库提供库的最佳方法是什么?我看到一些选项,其中没有一个吸引人:

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

Com*_*are 10

给这个上下文库提供库的最佳方法是什么?

将a传递Context到您的库中需要的方法Context.这就是Android SDK所做的事情.

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

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

如果你可以调用getApplicationContext()a Context,你就可以这样做,而不需要子类Application.

  • @TheIT:是的,这句话措辞不好,所以我修好了.我为这种困惑道歉.顺便说一句,因为你似乎专注于"应用程序",如果你还没有这样做,你可能想要阅读戴夫史密斯关于为上下文选择正确的"上下文"的优秀帖子:http://www.doubleencore. com/2013/06/context /`Application`*是正确的答案,特别是如果你需要一个`Context`用于从静态数据成员引用的东西,但通常用于不适合的情况. (2认同)

Dro*_*use 8

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

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

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

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